diff --git a/documentation/content/ru/articles/committers-guide/_index.adoc b/documentation/content/ru/articles/committers-guide/_index.adoc index 6c7a971f9d..8fca7a4bae 100644 --- a/documentation/content/ru/articles/committers-guide/_index.adoc +++ b/documentation/content/ru/articles/committers-guide/_index.adoc @@ -1,3167 +1,3204 @@ --- authors: - author: 'The FreeBSD Documentation Project' copyright: '1999-2022 The FreeBSD Documentation Project' description: 'Вводная информация для коммиттеров FreeBSD' tags: ["FreeBSD Committer's Guide", "Guide", "Community"] title: 'Руководство коммиттера' trademarks: ["freebsd", "coverity", "git", "github", "gitlab", "ibm", "intel", "general"] weight: 25 --- = Руководство коммиттера :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/committers-guide/ 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. Все новые коммиттеры должны прочитать этот документ перед началом работы, а существующим коммиттерам настоятельно рекомендуется периодически его пересматривать. Почти все разработчики FreeBSD имеют права на коммит в один или несколько репозиториев. Однако некоторые разработчики не имеют таких прав, и часть информации здесь применима и к ним. (Например, некоторые люди имеют права только для работы с базой данных отчетов о проблемах.) Дополнительную информацию можно найти в crossref:committers-guide[non-committers, Вопросы, специфичные для разработчиков без прав на коммит]. Этот документ также может быть интересен участникам сообщества FreeBSD, которые хотят узнать больше о том, как работает проект. ''' toc::[] [[admin]] == Административные детали [.informaltable] [cols="1,1", frame="none"] |=== |_Способ логина_ |man:ssh[1], только протокол версии 2 |_Главный хост для входа в оболочку_ |`freefall.FreeBSD.org` |_Референсные машины_ |`ref*.FreeBSD.org`, `universe*.freeBSD.org` (см. также ссылку link:https://www.FreeBSD.org/internal/machines/[Хосты проекта FreeBSD]) |_Узел SMTP_ |`smtp.FreeBSD.org:587` (см. также crossref:committers-guide[smtp-setup, Настройка доступа SMTP]). |`_src/_` Git-репозиторий |`ssh://git@gitrepo.FreeBSD.org/src.git` |`_doc/_` Git-репозиторий |`ssh://git@gitrepo.FreeBSD.org/doc.git` |`_ports/_` Git-репозиторий |`ssh://git@gitrepo.FreeBSD.org/ports.git` |_Внутренние списки рассылки_ |developers (технически называемый all-developers), doc-developers, doc-committers, ports-developers, ports-committers, src-developers, src-committers. (Каждый репозиторий проекта имеет свои собственные списки рассылки -developers и -committers. Архивы этих списков можно найти в файлах [.filename]#/local/mail/repository-name-developers-archive# и [.filename]#/local/mail/repository-name-committers-archive# на `freefall.FreeBSD.org`.) |_Ежемесячные отчеты основной команды (Core Team)_ |[.filename]#/home/core/public/reports# на кластере `FreeBSD.org`. |_Ежемесячные отчеты команды управления портами_ |[.filename]#/home/portmgr/public/monthly-reports# в кластере `FreeBSD.org`. |_Важные ветки Git в `src/`:_ |`stable/n` (`n`-STABLE), `main` (-CURRENT) |=== Для подключения к хостам проекта требуется man:ssh[1]. Дополнительную информацию можно найти в crossref:committers-guide[ssh.guide, Руководстве по быстрому началу работы с SSH]. Полезные ссылки: * link:https://www.FreeBSD.org/internal/[Внутренние страницы проекта FreeBSD] * link:https://www.FreeBSD.org/internal/machines/[Узлы проекта FreeBSD] * link:https://www.FreeBSD.org/administration/[Административные группы проекта FreeBSD] [[pgpkeys]] == Ключи OpenPGP для FreeBSD Криптографические ключи, соответствующие стандарту OpenPGP (__Pretty Good Privacy__), используются проектом FreeBSD для аутентификации коммиттеров. Сообщения, содержащие важную информацию, такие как публичные SSH-ключи, могут быть подписаны с помощью OpenPGP-ключа, чтобы доказать, что они действительно отправлены коммиттером. Дополнительную информацию можно найти в https://nostarch.com/releases/pgp_release.pdf[PGP & GPG: Email for the Practical Paranoid от Michael Lucas] и https://en.wikipedia.org/wiki/Pretty_Good_Privacy[]. [[pgpkeys-creating]] === Создание ключа Существующие ключи можно использовать, но сначала их следует проверить с помощью [.filename]#documentation/tools/checkkey.sh#. В этом случае убедитесь, что у ключа есть FreeBSD user ID. Для тех, у кого ещё нет ключа OpenPGP или требуется новый ключ, соответствующий требованиям безопасности FreeBSD, здесь показано, как его сгенерировать. [[pgpkeys-create-steps]] [.procedure] ==== . Установите [.filename]#security/gnupg#. Добавьте следующие строки в [.filename]#~/.gnupg/gpg.conf#, чтобы задать минимально приемлемые настройки для подписи и предпочтений новых ключей (подробнее см. в link:https://www.gnupg.org/documentation/manuals/gnupg/GPG-Options.html[документации по опциям GnuPG]): + [.programlisting] .... # Sorted list of preferred algorithms for signing (strongest to weakest). personal-digest-preferences SHA512 SHA384 SHA256 SHA224 # Default preferences for new keys default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 CAMELLIA256 AES192 CAMELLIA192 AES CAMELLIA128 CAST5 BZIP2 ZLIB ZIP Uncompressed .... . Сгенерировать ключ: + [source, shell] .... % gpg --full-gen-key gpg (GnuPG) 2.1.8; Copyright (C) 2015 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Warning: using insecure memory! Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 2048 <.> Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 3y <.> Key expires at Wed Nov 4 17:20:20 2015 MST Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: Chucky Daemon <.> Email address: notreal@example.com Comment: You selected this USER-ID: "Chucky Daemon " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. .... <.> 2048-битные ключи с трехлетним сроком действия обеспечивают достаточную защиту на данный момент (2022-10). <.> Срок действия ключа в три года достаточно мал, чтобы устаревшие ключи, ослабленные растущей мощностью компьютеров, перестали использоваться, но достаточно велик, чтобы уменьшить проблемы управления ключами. <.> Используйте здесь своё настоящее имя, предпочтительно совпадающее с указанным в удостоверении личности, выданном государством, чтобы другим было проще подтвердить вашу личность. Текст, который может помочь другим идентифицировать вас, можно ввести в раздел `Комментарий`. + После ввода адреса электронной почты запрашивается парольная фраза. Методы создания безопасной парольной фразы вызывают споры. Вместо того чтобы предлагать один способ, вот несколько ссылок на сайты, описывающие различные методы: https://world.std.com/~reinhold/diceware.html[], https://www.iusmentis.com/security/passphrasefaq/[], https://xkcd.com/936/[], https://en.wikipedia.org/wiki/Passphrase[]. ==== Защитите закрытый ключ и парольную фразу. Если закрытый ключ или парольная фраза могли быть скомпрометированы или раскрыты, немедленно уведомите mailto:accounts@FreeBSD.org[accounts@FreeBSD.org] и отзовите ключ. Фиксация нового ключа показана в crossref:committers-guide[commit-steps, Шаги для новых коммиттеров]. [[kerberos-ldap]] == Kerberos и LDAP веб-пароль для кластера FreeBSD Кластер FreeBSD требует пароль Kerberos для доступа к определенным сервисам. Пароль Kerberos также служит веб-паролем LDAP, поскольку LDAP проксирует запросы к Kerberos в кластере. Некоторые из сервисов, требующих его, включают: * https://bugs.freebsd.org/bugzilla[Bugzilla] Для создания новой учетной записи Kerberos в кластере FreeBSD или сброса пароля Kerberos для существующей учетной записи с использованием генератора случайных паролей: [source, shell] .... % ssh kpasswd.freebsd.org .... [NOTE] ==== Это должно быть выполнено с компьютера за пределами кластера FreeBSD.org. ==== Пароль Kerberos также можно установить вручную, войдя в `freefall.FreeBSD.org` и выполнив: [source, shell] .... % kpasswd .... [NOTE] ==== Если ранее не использовались аутентифицированные через Kerberos службы кластера FreeBSD.org, будет отображено сообщение `Client unknown`. Эта ошибка означает, что сначала необходимо использовать метод `ssh kpasswd.freebsd.org`, показанный выше, для инициализации учётной записи Kerberos. ==== [[committer.types]] == Типы битов коммита (прав на коммит) Репозиторий FreeBSD содержит ряд компонентов, которые в совокупности поддерживают исходный код базовой операционной системы, документацию, инфраструктуру портов сторонних приложений и различные поддерживаемые утилиты. При выделении прав на коммит (commit bits) в FreeBSD указываются области дерева, где эти права могут быть использованы. Как правило, области, связанные с правами, отражают, кто авторизовал их выделение. Дополнительные области полномочий могут быть добавлены позже: в этом случае коммиттер должен следовать стандартной процедуре выделения прав на коммит для соответствующей области дерева, получив одобрение от соответствующей инстанции и, возможно, наставника для этой области на некоторый период времени. [.informaltable] [cols="1,1,1", frame="none"] |=== |__Тип коммиттера__ |__Ответственный__ |__Компоненты дерева исходного кода__ |src |srcmgr@ |src/ |doc |doceng@ |документация doc/, ports/, src/ |ports |portmgr@ |ports/ |=== Биты коммитов, выделенные до разработки концепции областей ответственности, могут быть подходящими для использования во многих частях дерева. Однако здравый смысл подсказывает, что коммиттер, ранее не работавший в определённой области дерева, должен перед коммитом получить рецензирование (review), согласование от соответствующего ответственного лица и/или работать с наставником. Поскольку правила поддержки кода различаются в зависимости от области дерева, это важно как для самого коммиттера, работающего в менее знакомой области, так и для других участников, работающих с деревом. Коммиттерам рекомендуется запрашивать рецензирование своей работы в рамках обычного процесса разработки, независимо от области дерева, в которой происходит работа. === Политика активности коммиттеров в других деревьях * Все коммиттеры могут изменять файлы [.filename]#src/share/misc/committers-*.dot#, [.filename]#src/usr.bin/calendar/calendars/calendar.freebsd# и [.filename]#ports/astro/xearth/files#. * Документационные коммиттеры могут вносить изменения в документацию в файлы [.filename]#src#, такие как руководства, README, базы данных fortune, календарные файлы и исправления комментариев, без одобрения коммиттера src, при условии соблюдения обычных правил и внимания к коммитам. * Любой коммиттер может вносить изменения в любое другое дерево с пометкой "Approved by" от некурируемого коммиттера с соответствующими правами. Курируемые коммиттеры (имеющие наставника) могут предоставлять пометку "Reviewed by", но не "Approved by". * Коммиттеры могут получить дополнительный бит по обычному процессу: найти наставника, который предложит их srcmgr, doceng или portmgr, в зависимости от ситуации. После одобрения их добавят в 'access', и начнётся стандартный период наставничества, который будет включать продолжение отметки "Approved by" в течение некоторого времени. [[doc-blanket-approval]] ==== Неявное (по умолчанию) одобрение для документации Некоторые типы исправлений имеют "одобрение по умолчанию" от {doceng}, что позволяет любому коммиттеру исправлять эти категории проблем в любой части дерева документации. Эти исправления не требуют одобрения или проверки от коммиттера документации, если у автора нет прав на коммит в документацию. Общее одобрение применяется к следующим типам исправлений: * Опечатки * Тривиальные исправления + Пунктуация, URL-адреса, даты, пути и имена файлов с устаревшей или некорректной информацией, а также другие распространённые ошибки, которые могут ввести читателей в заблуждение. За годы в дереве документации были неявно одобрены некоторые случаи. Этот список показывает наиболее распространённые из них: * Изменения в [.filename]#documentation/content/ru/books/porters-handbook/versions/_index.adoc# + extref:{porters-handbook}versions[Значения __FreeBSD_version (Руководство по созданию портов)], в основном используется коммиттерами src. * Изменения в [.filename]#doc/shared/contrib-additional.adoc# + Сопровождение раздела extref:{contributors}[Дополнительные участники FreeBSD, contrib-additional]. * Все link:#commit-steps[Шаги для новых коммиттеров], связанные с документацией * Рекомендации по безопасности; Уведомления об ошибках; Релизы; + {security-officer} и {re} используют эти разделы. * Изменения в [.filename]#website/content/ru/donations/donors.adoc# + {donations} использует этот документ. Перед любым коммитом необходимо выполнить тестовую сборку; подробности см. в разделах «Обзор» и «Процесс сборки документации FreeBSD» extref:{fdp-primer}[Руководства для новых участников проекта документации FreeBSD]. [[git-primer]] == Руководство по Git [[git-basics]] === Основы Git При поиске по ключевым словам "Git Primer" можно найти множество хороших материалов. Страницы Дэниела Милера link:https://danielmiessler.com/study/git/[Введение в Git] и Вилли Виллуса link:https://gist.github.com/williewillus/068e9a8543de3a7ef80adb2938657b6b[Git - Краткое введение] являются хорошими обзорами. Книга по Git также полная, но гораздо длиннее: https://git-scm.com/book/en/v2. Также обратите внимание на сайт https://dangitgit.com/, посвящённый распространённым ловушкам и подводным камням Git, на случай, если вам нужно исправить ошибки. Наконец, введение, link:https://eagain.net/articles/git-for-computer-scientists/[ориентированное на компьютерных учёных], оказалось полезным для некоторых в объяснении мировоззрения Git. Этот документ предполагает, что вы уже читали про это, и постарается не повторять основы (хотя кратко их рассмотрит). [[git-mini-primer]] === Мини-руководство по Git Это руководство имеет менее амбициозные цели, чем старое руководство по Subversion, но должно охватить основы. ==== Область применения Если вы хотите загрузить FreeBSD, собрать его из исходных кодов и в целом поддерживать актуальность таким способом, это руководство для вас. Оно охватывает получение исходных кодов, их обновление, бинарный поиск (bisect) и кратко затрагивает способы работы с локальными изменениями. В нём изложены основы, а также даны полезные ссылки на более глубокие материалы для случаев, когда читателю будет недостаточно базовой информации. Другие разделы этого руководства посвящены более сложным темам, связанным с участием в проекте. Цель этого раздела — выделить те аспекты Git, которые необходимы для отслеживания исходных кодов. Предполагается базовое понимание Git. В интернете есть множество вводных руководств по Git, но https://git-scm.com/book/en/v2[Книга по Git] предлагает одно из лучших изложений. [[git-mini-primer-getting-started]] ==== Начало работы для разработчиков Этот раздел описывает доступ на чтение и запись для коммиттеров, чтобы отправлять коммиты от разработчиков или контрибьюторов. [[git-mini-daily-use]] ===== Повседневное использование [NOTE] ==== В приведенных ниже примерах замените `${repo}` на имя нужного репозитория FreeBSD: `doc`, `ports` или `src`. ==== * Клонировать репозиторий: + [source, shell] .... % git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' https://git.freebsd.org/${repo}.git .... + В результате у вас в качестве удалённых (remote) должны быть официальные зеркала: + [source, shell] .... % git remote -v freebsd https://git.freebsd.org/${repo}.git (fetch) freebsd https://git.freebsd.org/${repo}.git (push) .... * Настройка данных коммиттера FreeBSD: + Хук для коммита в repo.freebsd.org проверяет, что поле "Commit" соответствует информации о коммиттере в FreeBSD.org. Самый простой способ получить предлагаемую конфигурацию — выполнить скрипт `/usr/local/bin/gen-gitconfig.sh` на freefall: + [source, shell] .... % gen-gitconfig.sh [...] % git config user.name (your name in gecos) % git config user.email (your login)@FreeBSD.org .... * Установите URL для отправки (push URL): + [source, shell] .... % git remote set-url --push freebsd git@gitrepo.freebsd.org:${repo}.git .... + В таком случае у вас должны быть раздельные URL для извлечения (fetch) и отправки (push) как наиболее эффективная настройка: + [source, shell] .... % git remote -v freebsd https://git.freebsd.org/${repo}.git (fetch) freebsd git@gitrepo.freebsd.org:${repo}.git (push) .... + Еще раз обратите внимание, что `gitrepo.freebsd.org` является псевдонимом для `repo.freebsd.org`. * Установка хука для шаблона сообщения коммита: + Для репозитория документации: + [source, shell] .... % cd .git/hooks % ln -s ../../.hooks/prepare-commit-msg .... + Для репозитория портов: + [source, shell] .... % git config --add core.hooksPath .hooks .... + Для репозитория src: + [source, shell] .... % cd .git/hooks % ln -s ../../tools/tools/git/hooks/prepare-commit-msg .... [[admin-branch]] ===== Ветка "admin" Файлы `access` и `mentors` хранятся в отдельной (orphan) ветке `internal/admin` в каждом репозитории. Следующий пример показывает, как переключиться (check out) на ветку `internal/admin` в локальной ветке с именем `admin`: [source, shell] .... % git config --add remote.freebsd.fetch '+refs/internal/*:refs/internal/*' % git fetch % git checkout -b admin internal/admin .... В качестве альтернативы вы можете добавить рабочее дерево для ветки `admin`: [source, shell] .... git worktree add -b admin ../${repo}-admin internal/admin .... Для просмотра ветки `internal/admin` в веб-интерфейсе: `https://cgit.freebsd.org/${repo}/log/?h=internal/admin` Для отправки (push) укажите полную спецификацию ссылки: [source, shell] .... git push freebsd HEAD:refs/internal/admin .... ==== Как поддерживать актуальную копию дерева исходных кодов FreeBSD src [[keeping_current]] Первый шаг: клонирование дерева. Это загружает всё дерево целиком. Существует два способа загрузки. Большинству пользователей потребуется глубокое клонирование репозитория. Однако бывают случаи, когда может потребоваться поверхностное клонирование. ===== Названия веток FreeBSD-CURRENT использует ветку `main`. `main` — это ветка по умолчанию. Для FreeBSD-STABLE названия веток включают `stable/12` и `stable/13`. Для FreeBSD-RELEASE, названия веток разработки выпусков включают `releng/12.4` и `releng/13.2`. https://www.freebsd.org/releng/[] отображает: * ветки `main` и `stable/⋯` открыты * ветки `releng/⋯`, каждая из которых замораживается при создании тега релиза. Примеры: * тег https://cgit.freebsd.org/src/tag/?h=release/13.1.0[release/13.1.0] на ветке https://cgit.freebsd.org/src/log/?h=releng/13.1[releng/13.1] * тег https://cgit.freebsd.org/src/tag/?h=release/13.2.0[release/13.2.0] на ветке https://cgit.freebsd.org/src/log/?h=releng/13.2[releng/13.2]. ===== Репозитории Пожалуйста, обратитесь к разделу crossref:committers-guide[admin,Административные детали] для получения актуальной информации о том, где взять исходные коды FreeBSD. Значение $URL ниже можно получить с этой страницы. Примечание: Проект не использует подмодули, так как они плохо подходят для наших рабочих процессов и модели разработки. То, как мы отслеживаем изменения в сторонних приложениях, обсуждается в другом месте и, как правило, мало интересует обычного пользователя. ===== Полный клон Полный клон загружает всё дерево целиком, включая всю историю и ветки. Это самый простой способ. Он также позволяет использовать функцию Git `worktree`, чтобы все активные ветки были извлечены в отдельные каталоги, но с единственной копией репозитория. [source, shell] .... % git clone -o freebsd $URL -b branch [] .... -- создаст полную копию. `branch` должна быть одной из веток, перечисленных в предыдущем разделе. Если параметр `branch` не указан: будет использоваться ветка по умолчанию (`main`). Если параметр `` не указан: имя нового каталога будет соответствовать имени репозитория ([.filename]#doc#, [.filename]#ports# или [.filename]#src#). Вам понадобится полный клон, если вас интересует история, вы планируете вносить локальные изменения или работать более чем с одной веткой. Это также самый простой способ поддерживать актуальность. Если вас интересует история, но вы работаете только с одной веткой и у вас мало места, вы также можете использовать `--single-branch`, чтобы загрузить только одну ветку (хотя некоторые коммиты слияния не будут ссылаться на ветку, из которой произошло слияние, что может быть важно для некоторых пользователей, интересующихся детальными версиями истории). ===== Частичный клон Частичный клон копирует только самый актуальный код, но не включает или включает лишь малую часть истории. Это может быть полезно, когда вам нужно собрать определённую ревизию FreeBSD или когда вы только начинаете и планируете более полно отслеживать дерево. Также вы можете использовать его, чтобы ограничить историю только определённым количеством ревизий. Однако обратите внимание на существенное ограничение этого подхода, описанное ниже. [source, shell] .... % git clone -o freebsd -b branch --depth 1 $URL [dir] .... Это клонирует репозиторий, но будет содержать только самую последнюю версию в репозитории. Остальная история не загружается. Если позже вы передумаете, вы можете выполнить `git fetch --unshallow`, чтобы получить старую историю. [WARNING] ==== При частичном клонировании вы потеряете счетчик коммитов в выводе команды uname. Это может затруднить определение необходимости обновления системы при выпуске бюллетеня безопасности. ==== ===== Сборка После загрузки сборка выполняется так, как описано в руководстве, например: [source, shell] .... % cd src % make buildworld % make buildkernel % make installkernel % make installworld .... так что здесь это не будет рассматриваться подробно. Если вы хотите собрать собственное ядро, в extref:{handbook}kernelconfig[разделе конфигурации ядра, kernelconfig] руководства FreeBSD рекомендуется создать файл MYKERNEL в sys/${ARCH}/conf с вашими изменениями на основе GENERIC. Чтобы Git игнорировал MYKERNEL, его можно добавить в .git/info/exclude. ===== Обновление Для обновления обоих типов деревьев используются одинаковые команды. Это загружает (pull) все изменения, сделанные после последнего обновления. [source, shell] .... % git pull --ff-only .... обновит дерево. В Git 'перемотка' (fast forward) — это слияние, которое только перемещает указатель ветки и не требует пересоздания коммитов. Если всегда выполнять слияние/загрузку (merge/pull) с перемоткой, это гарантирует точную копию дерева FreeBSD. Это важно, если вы хотите поддерживать локальные патчи. См. ниже, как управлять локальными изменениями. Самый простой способ — использовать `--autostash` в команде `git pull`, но доступны и более сложные варианты. ==== Выбор конкретной версии В Git команда `git checkout` используется для переключения как между ветками, так и между конкретными версиями. Версии в Git представляют собой длинные хеши, а не последовательные номера. Когда вы извлекаете конкретную версию, просто укажите нужный хэш в командной строке (команда `git log` может помочь вам определиться, какой хэш выбрать): [source, shell] .... % git checkout 08b8197a74 .... и вам это скопировано (checkout). Вы увидите сообщение, похожее на следующее: [source, shell] .... Note: checking out '08b8197a742a96964d2924391bf9fdfeb788865d'. You are in a 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b HEAD is now at 08b8197a742a hook gpiokeys.4 to the build .... где последняя строка формируется из хэша, который вы использовали для извлечения рабочей копии, и первой строки сообщения коммита из этой ревизии. Хэш может быть сокращен до минимальной уникальной длины. Сам Git не всегда последователен в том, сколько цифр он отображает. ==== Бинарный поиск (bisect) Иногда что-то идёт не так. Последняя версия работала, но только что обновлённая — нет. Разработчик может попросить вас провести бинарный поиск проблемы, чтобы определить, какой коммит вызвал регрессию. Git упрощает поиск изменений с помощью мощной команды `git bisect`. Вот краткое описание, как её использовать. Для получения дополнительной информации вы можете посмотреть https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-elimination или https://git-scm.com/docs/git-bisect. Страница man git-bisect хорошо описывает, что может пойти не так, что делать, когда версии не собираются, в каких ситуациях вам лучше использовать другие условия поиска, а не 'хорошо (good)' и 'плохо (bad)', и так далее, но это здесь не будет рассматриваться. `git bisect start --first-parent` запустит процесс бинарного поиска. Далее необходимо указать диапазон для проверки. `git bisect good XXXXXX` укажет рабочую версию, а `git bisect bad XXXXX` — нерабочую версию. Нерабочая версия почти всегда будет HEAD (специальный тег для текущего состояния). Рабочая версия будет последней, которую вы проверяли. Аргумент `--first-parent` необходим, чтобы последующие команды `git bisect` не пытались переключиться на ветку вендора, в которой отсутствует полное дерево исходников FreeBSD. [TIP] ==== Если вы хотите узнать последнюю версию, которую вы извлекли, используйте `git reflog`: [source, shell] .... 5ef0bd68b515 (HEAD -> main, freebsd/main, freebsd/HEAD) HEAD@{0}: pull --ff-only: Fast-forward a8163e165c5b (upstream/main) HEAD@{1}: checkout: moving from b6fb97efb682994f59b21fe4efb3fcfc0e5b9eeb to main ... .... показывает, как я перемещаю рабочее дерево в ветку `main` (a816...) и затем обновляю его из вышестоящего репозитория (до 5ef0...). В этом случае, bad будет HEAD (или 5ef0bd68b515), а good — a8163e165c5b. Как видно из вывода, HEAD@{1} также часто работает, но не является безошибочным, если вы выполняли другие действия с деревом Git после обновления, но до того, как обнаружили необходимость в бинарном поиске. ==== Установите сначала «хорошую» версию, затем установите «плохую» (хотя порядок не имеет значения). При установке «плохой» версии вы получите некоторую статистику по процессу: [source, shell] .... % git bisect start --first-parent % git bisect good a8163e165c5b % git bisect bad HEAD Bisecting: 1722 revisions left to test after this (roughly 11 steps) [c427b3158fd8225f6afc09e7e6f62326f9e4de7e] Fixup r361997 by balancing parens. Duh. .... Затем вы собираете и устанавливаете эту версию. Если она работает корректно, введите `git bisect good`, в противном случае — `git bisect bad`. Если версия не компилируется, введите `git bisect skip`. После каждого шага вы будете получать сообщение, аналогичное приведённому выше. По завершении сообщите о проблемной версии разработчику (или исправьте ошибку самостоятельно и отправьте патч). Команда `git bisect reset` завершит процесс и вернёт вас туда, откуда вы начали (обычно на вершину ветки `main`). Ещё раз, руководство по git-bisect (ссылка выше) — это хороший ресурс на случай возникновения проблем или нестандартных ситуаций. [[git-gpg-signing]] ==== Подписание коммитов, тегов и отправок с помощью GnuPG Git умеет подписывать коммиты, теги и отправки (push). Когда вы подписываете Git-коммит или тег, вы можете доказать, что отправленный код действительно принадлежит вам и не был изменён во время передачи. Вы также можете подтвердить, что именно вы отправили код, а не кто-то другой. Более подробная документация по подписанию коммитов и тегов доступна в главе https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work[Инструменты Git - Подписание вашей работы] книги по Git. Обоснование подписания отправок можно найти в https://github.com/git/git/commit/a85b377d0419a9dfaca8af2320cc33b051cbed04[коммите, где представлена эта функция]. Лучший способ — просто указать Git, что вы всегда хотите подписывать коммиты, теги и отправки. Это можно сделать, установив несколько переменных конфигурации: [source, shell] .... % git config --add user.signingKey LONG-KEY-ID % git config --add commit.gpgSign true % git config --add tag.gpgSign true % git config --add push.gpgSign if-asked .... // push.gpgSign should probably be set to `yes` once we enable it, or be set with --global, so that it is enabled for all repositories. [NOTE] ====== Чтобы избежать возможных конфликтов, убедитесь, что вы указали длинный идентификатор ключа для Git. Вы можете получить длинный идентификатор с помощью команды: `gpg --list-secret-keys --keyid-format LONG`. ====== [TIP] ====== Для использования конкретных подключей, без разрешения GnuPG подключей в первичный ключ, добавьте `!` к ключу. Например, для шифрования с подключом `DEADBEEF` используйте `DEADBEEF!`. ====== ===== Проверка подписей Подпись коммита можно проверить, выполнив команду `git verify-commit <хэш коммита>` или `git log --show-signature`. Подписи тегов можно проверить с помощью `git verify-tag <имя тега>` или `git tag -v <имя тега>`. //// Commented out for now until we decide what to do. Git pushes are a bit different, they live in a special ref in the repository. TODO: write how to verify them //// ==== Особенности портов Дерево портов работает аналогичным образом. Названия ветвей отличаются, и репозитории расположены в других местах. Веб-интерфейс cgit для работы в браузере доступен по адресу https://cgit.FreeBSD.org/ports/ . Рабочий репозиторий Git находится по адресу https://git.FreeBSD.org/ports.git и ssh://anongit@git.FreeBSD.org/ports.git (или `anongit@git.FreeBSD.org:ports.git`). -Также доступно зеркало на GitHub, см. extref:{handbook}/mirrors[Внешние зеркала, mirrors] для обзора. Ветка _latest_ называется `main`. Ветки _quarterly_ именуются `yyyyQn`, где 'yyyy' — год, а 'n' — квартал. +Также доступно зеркало на GitHub, см. extref:{handbook}mirrors[Внешние зеркала, mirrors] для обзора. Ветка _latest_ называется `main`. Ветки _quarterly_ именуются `yyyyQn`, где 'yyyy' — год, а 'n' — квартал. [[port-commit-message-formats]] ===== Форматы сообщений коммитов В репозитории портов доступен перехватчик, который помогает оформлять сообщения коммитов в https://cgit.freebsd.org/ports/tree/.hooks/prepare-commit-msg[.hooks/prepare-commit-message]. Его можно включить, выполнив команду ``git config --add core.hooksPath .hooks``. Основная идея заключается в том, что сообщение коммита должно быть оформлено следующим образом: .... category/port: Summary. Description of why the changes where made (Объяснение, почему были сделаны изменения ). PR: 12345 .... [IMPORTANT] ==== Первая строка — это тема коммита, в ней указывается, какой порт был изменён, и краткое описание коммита. Она должна содержать 50 символов или меньше. Пустая строка должна отделять его от остальной части сообщения о коммите. Остальная часть сообщения о коммите должна быть перенесена на границе 72 символов. Еще одна пустая строка должна быть добавлена, если есть какие-либо поля метаданных, чтобы их можно было легко отличить от сообщения о коммите. ==== ==== Управление локальными изменениями Этот раздел посвящен отслеживанию локальных изменений. Если у вас нет локальных изменений, вы можете пропустить этот раздел. Один важный момент для всех: все изменения остаются локальными, пока они не будут отправлены (push). В отличие от Subversion, Git использует распределённую модель. Для пользователей в большинстве случаев разница невелика. Однако, если у вас есть локальные изменения, вы можете использовать тот же инструмент для управления ими, что и для получения изменений из FreeBSD. Все изменения, которые вы не отправили, являются локальными и могут быть легко изменены (это делает git rebase, обсуждаемый ниже). ===== Сохранение локальных изменений Самый простой способ сохранить локальные изменения (особенно незначительные) — использовать `git stash`. В простейшем случае вы используете `git stash`, чтобы записать изменения (что помещает их в стек stash). Большинство людей используют это для сохранения изменений перед обновлением дерева, как описано выше. Затем они используют `git stash apply`, чтобы повторно применить изменения к дереву. Stash представляет собой стек изменений, который можно просмотреть с помощью `git stash list`. Подробности приведены в man-странице git-stash (https://git-scm.com/docs/git-stash). Этот метод подходит, когда у вас есть небольшие изменения в дереве. Если у вас что-то более сложное, вероятно, лучше будет создать локальную ветку и выполнять перебазирование. Сохранение изменений также интегрировано в команду `git pull`: просто добавьте `--autostash` в командную строку. ===== Сохранение локальной ветки [[keeping_a_local_branch]] С помощью Git гораздо проще поддерживать локальную ветку, чем в Subversion. В Subversion необходимо выполнять коммит слияния и разрешать конфликты. Это выполнимо, но может привести к запутанной истории изменений, которую будет сложно передать в вышестоящий репозиторий, если это потребуется, или сложно воспроизвести при необходимости. Git также позволяет выполнять коммит слияния, но с теми же проблемами. Это один из способов управления веткой, но наименее гибкий. В дополнение к слиянию, Git поддерживает концепцию «перебазирования» (rebase), которая позволяет избежать этих проблем. Команда `git rebase` воспроизводит все коммиты ветки в конце родительской ветки. Мы рассмотрим наиболее распространённые сценарии, возникающие при её использовании. ====== Создать ветку Предположим, вы хотите внести изменение в команду `ls` FreeBSD, чтобы она никогда не использовала цветовое выделение. Существует множество причин для этого, но в данном примере мы будем использовать это в качестве базового сценария. Команда `ls` в FreeBSD периодически изменяется, и вам нужно будет адаптироваться к этим изменениям. К счастью, с помощью `git rebase` это обычно происходит автоматически. [source, shell] .... % cd src % git checkout main % git checkout -b no-color-ls % cd bin/ls % vi ls.c # hack the changes in % git diff # check the changes diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 7378268867ef..cfc3f4342531 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -66,6 +66,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#undef COLORLS #ifdef COLORLS #include #include % # these look good, make the commit... % git commit ls.c .... Коммит откроет редактор, чтобы описать выполненные изменения. После ввода описания у вас будет собственная **локальная** ветка в Git-репозитории. Соберите и установите изменения, как обычно, следуя указаниям в руководстве. Git отличается от других систем контроля версий тем, что нужно явно указывать, какие файлы коммитить. Я предпочитаю делать это в командной строке коммита, но также можно использовать `git add`, как описано в более подробных руководствах. ====== Время обновить Когда приходит время внедрить новую версию, процесс почти такой же, как и без веток. Вы выполняете обновление, как описано выше, но перед обновлением нужно выполнить одну дополнительную команду и одну после. Ниже предполагается, что вы начинаете с неизменённого дерева. Важно начинать операции перебазирования с чистого дерева (Git требует этого). [source, shell] .... % git checkout main % git pull --ff-only % git rebase -i main no-color-ls .... Это откроет редактор, в котором будут перечислены все коммиты. В данном примере не изменяйте его содержимое. Обычно это делается при обновлении базовой версии (хотя также можно использовать команду Git rebase для управления коммитами в ветке). После завершения вышеуказанных действий необходимо перенести коммиты для `ls.c` со старой версии FreeBSD на новую. Иногда возникают конфликты слияния. Это нормально. Не паникуйте. Вместо этого решайте их так же, как и любые другие конфликты слияния. Чтобы упростить, я опишу лишь распространённую проблему, которая может возникнуть. Ссылка на полное руководство приведена в конце этого раздела. Допустим, изменения включают переход на terminfo в вышестоящем коде, а также изменение названия опции. При обновлении вы можете увидеть следующее: [source, shell] .... Auto-merging bin/ls/ls.c CONFLICT (content): Merge conflict in bin/ls/ls.c error: could not apply 646e0f9cda11... no color ls Resolve all conflicts manually, mark them as resolved with "git add/rm ", then run "git rebase --continue". You can instead skip this commit: run "git rebase --skip". To abort and get back to the state before "git rebase", run "git rebase --abort". Could not apply 646e0f9cda11... no color ls .... что выглядит пугающе. Если открыть редактор, вы увидите типичное разрешение конфликта с трёхсторонним слиянием, с которым вы могли сталкиваться в других системах управления исходным кодом (остальная часть ls.c опущена): [source, shell] .... <<<<<<< HEAD #ifdef COLORLS_NEW #include ======= #undef COLORLS #ifdef COLORLS #include >>>>>>> 646e0f9cda11... no color ls .... Новый код идет первым, а ваш код - вторым. Правильное решение здесь — просто добавить `#undef COLORLS_NEW` перед `#ifdef`, а затем удалить старые изменения: [source, shell] .... #undef COLORLS_NEW #ifdef COLORLS_NEW #include .... и сохранить файл. Ребазирование было прервано, поэтому вам необходимо завершить его: [source, shell] .... % git add ls.c % git rebase --continue .... что указывает Git, что файл `ls.c` исправлен и можно продолжить операцию перебазирования. Поскольку возник конфликт, система откроет редактор для обновления сообщения коммита (если это необходимо). Если сообщение коммита по-прежнему корректно, просто закройте редактор. Если вы застряли в процессе перебазирования, не паникуйте. Команда `git rebase --abort` вернёт вас к исходному состоянию. Однако важно начинать с неизменённого дерева. Примечание: упомянутая выше команда `git reflog` будет полезна в этой ситуации, так как она содержит список всех (промежуточных) коммитов, которые вы можете просмотреть, изучить или выбрать через `cherry-pick`. Для более подробного ознакомления с этой темой, см. довольно обширное руководство по адресу: https://www.freecodecamp.org/news/the-ultimate-guide-to-git-merge-and-git-rebase/. Этот ресурс будет полезен для решения проблем, которые возникают нечасто, но слишком специфичны для данного руководства. ===== Переключение на другую ветку FreeBSD Если вы хотите перейти с ветки stable/12 на ветку current и у вас есть полный клон репозитория, будет достаточно выполнить следующую команду: [source, shell] .... % git checkout main % # build and install here... .... Однако, если у вас есть локальная ветка, есть несколько важных замечаний. Во-первых, перебазирование переписывает историю, поэтому вам, скорее всего, захочется сохранить её каким-либо образом. Во-вторых, переключение между ветками часто вызывает больше конфликтов. Если предположить, что приведённый выше пример относился к ветке stable/12, то для перехода на ветку `main` я бы рекомендовал следующее: [source, shell] .... % git checkout no-color-ls % git checkout -b no-color-ls-stable-12 # create another name for this branch % git rebase -i stable/12 no-color-ls --onto main .... Что делает вышеописанное: извлекается ветка no-color-ls. Затем для неё создаётся новое имя (no-color-ls-stable-12) на случай, если потребуется вернуться к ней. После этого выполняется перебазирование на ветку `main`. Это позволит найти все коммиты в текущей ветке no-color-ls (вплоть до точки её ответвления от stable/12) и затем воспроизвести их на ветке `main`, создав там новую ветку no-color-ls (поэтому я и попросил вас создать резервное имя). [[mfc-with-git]] === Процедуры MFC (Merge From Current) ==== Краткое содержание Рабочий процесс MFC можно обобщить как `git cherry-pick -x` плюс `git commit --amend` для корректировки сообщения коммита. Для нескольких коммитов используйте `git rebase -i`, чтобы объединить их вместе и отредактировать сообщение коммита. ==== Одиночный коммит MFC [source, shell] .... % git checkout stable/X % git cherry-pick -x $HASH --edit .... Для коммитов MFC, например, импорта от вендора, вам потребуется указать одного родителя для целей выборочного применения (cherry-pick). Обычно это будет «первый родитель» ветки, из которой вы применяете изменения, то есть: [source, shell] .... % git checkout stable/X % git cherry-pick -x $HASH -m 1 --edit .... Если что-то пойдет не так, вам потребуется либо прервать выборочное применение с помощью `git cherry-pick --abort`, либо исправить проблему и выполнить `git cherry-pick --continue`. После завершения выборочного применения выполните отправку с помощью `git push`. Если возникнет ошибка из-за проигрыша в гонке коммитов, используйте `git pull --rebase` и повторите попытку отправки. ==== MFC в ветку RELENG MFC в ветки, требующие одобрения, требуют немного больше внимания. Процесс одинаков как для обычного слияния, так и для прямого коммита в исключительной ситуации. * Сначала выполните слияние или прямой коммит в соответствующую ветку `stable/X`, прежде чем сливать в ветку `releng/X.Y`. * Используйте хэш из ветки `stable/X` для MFC в ветку `releng/X.Y`. * Оставляйте обе строки "cherry picked from" в сообщении коммита. * Обязательно добавьте строку `Approved by:` при работе в редакторе. [source, shell] .... % git checkout releng/13.0 % git cherry-pick -x $HASH --edit .... Если вы забыли добавить строку `Approved by:`, вы можете выполнить `git commit --amend`, чтобы отредактировать сообщение коммита перед отправкой изменения. ==== Множественный коммит MFC [source, shell] .... % git checkout -b tmp-branch stable/X % for h in $HASH_LIST; do git cherry-pick -x $h; done % git rebase -i stable/X # отметить каждый коммит после первого как 'squash' # При необходимости обновить сообщение коммита, чтобы отразить все его элементы. # Обязательно сохранить строки "cherry picked from". % git push freebsd HEAD:stable/X .... Если отправка не удалась из-за проигрыша в гонке коммитов, выполните перебазирование и повторите попытку: [source, shell] .... % git checkout stable/X % git pull % git checkout tmp-branch % git rebase stable/X % git push freebsd HEAD:stable/X .... После завершения MFC вы можете удалить временную ветку: [source, shell] .... % git checkout stable/X % git branch -d tmp-branch .... ==== MFC — импорт от вендора Импорты от вендоров — это единственное в дереве, что создает коммит слияния в ветке `main`. Коммиты слияния выборочным переносом (cherry-pick) в stable/XX представляют дополнительную сложность, поскольку у коммита слияния два родителя. Как правило, вам понадобится разница с первым родителем, так как это разница с `main` (хотя могут быть и исключения). [source, shell] .... % git cherry-pick -x -m 1 $HASH .... обычно это то, что вам нужно. Это укажет выборочному переносу применить правильный diff. Бывают, надеюсь, редкие случаи, когда возможно, что ветка `main` была объединена в обратном порядке скриптом преобразования. Если это произойдет (а мы пока таких случаев не обнаружили), вам следует изменить указанное выше на `-m 2`, чтобы выбрать правильного родителя. Просто выполните: [source, shell] .... % git cherry-pick --abort % git cherry-pick -x -m 2 $HASH .... для этого. Опция `--abort` выполнит очистку после неудачной первой попытки. ==== Переделка MFC Если вы делаете MFC, и всё идет ужасно неправильно, и вы хотите начать сначала, то самый простой способ — использовать `git reset --hard`, как показано ниже: [source, shell] .... % git reset --hard freebsd/stable/12 .... хотя если у вас есть некоторые ревизии, которые вы хотите сохранить, а другие — нет, использование `git rebase -i` предпочтительнее. ==== Некоторые соображения о MFC При внесении исходных коммитов в стабильные и релизные ветки мы преследуем следующие цели: * Четко обозначить прямые коммиты, отличая их от коммитов, вносящих изменения из другой ветки. * Избегать внесения известных нарушений в стабильные ветки и ветки выпуска релизов (releng). * Позволить разработчикам определять, какие изменения были или не были перенесены из одной ветки в другую. С помощью Subversion мы использовали следующие практики для достижения этих целей: * Использование тегов `MFC` и `MFS` для пометки коммитов, которые сделали слияние изменения из другой ветки. * Объединение (squash) исправляющих (fixup) коммитов с основным коммитом при слиянии изменения. * Запись информации о слияниях для корректной работы `svn mergeinfo --show-revs`. С помощью Git нам потребуется использовать другие стратегии для достижения тех же целей. Этот документ призван определить лучшие практики для коммитов слияния исходного кода с использованием Git, которые достигают этих целей. В целом мы стремимся использовать встроенные возможности Git для достижения этих целей, а не применять практики, основанные на модели Subversion. Общее замечание: в связи с техническими различиями в Git, мы не будем использовать "коммиты слияния" Git (созданные через `git merge`) в стабильных ветках или ветках releng. Вместо этого, когда в документе упоминаются "коммиты слияния", имеется в виду коммит, изначально сделанный в `main`, который реплицируется или "переносится" в стабильную ветку, или коммит из стабильной ветки, который реплицируется в ветку releng с помощью вариации команды `git cherry-pick`. ==== Поиск подходящих хэшей для MFC Git предоставляет встроенную поддержку этого через команды `git cherry` и `git log --cherry`. Эти команды сравнивают исходные различия коммитов (но не другие метаданные, такие как сообщения журнала), чтобы определить, идентичны ли два коммита. Это хорошо работает, когда каждый коммит из `main` переносится как отдельный коммит в стабильную ветку, но перестаёт работать, если несколько коммитов из `main` объединяются в один коммит в стабильной ветке. Проект активно использует `git cherry-pick -x` с сохранением всех строк для обхода этих трудностей и разрабатывает автоматизированные инструменты для использования этого подхода. ==== Стандарты сообщений коммитов ===== Пометка MFC Проект принял следующую практику для пометки MFC: * Используйте флаг `-x` с командой `git cherry-pick`. Это добавляет строку в сообщение коммита, которая включает хэш оригинального коммита при слиянии. Поскольку это добавляется непосредственно Git, коммиттерам не нужно вручную редактировать журнал коммитов при слиянии. При слиянии нескольких коммитов сохраняйте все строки "cherry picked from". ===== Обрезать метаданные? Одной из областей, которая не была чётко задокументирована в Subversion (и даже в CVS), является форматирование метаданных в сообщениях журнала для коммитов MFC. Должны ли они включать метаданные из исходного коммита без изменений или должны быть изменены для отражения информации о самом коммите MFC? Исторически практика различалась, хотя некоторые различия зависят от области. Например, MFC, относящиеся к PR, обычно включают поле PR в MFC, чтобы коммиты MFC включались в аудит-трекер системы отслеживания ошибок. В других областях ситуация менее ясна. Например, Phabricator показывает разницу последнего коммита, помеченного для обзора, поэтому включение URL-адресов Phabricator заменяет основной коммит на завершенные коммиты. Список рецензентов также неясен. Если рецензент одобрил изменение для `main`, означает ли это, что он одобрил коммит MFC? Верно ли это только для идентичного кода или лишь с незначительной доработкой? Очевидно, это неверно для более масштабных доработок. Даже для идентичного кода: что, если коммит не конфликтует, но вносит изменение ABI? Рецензент мог одобрить коммит для `main` из-за нарушения ABI, но может не одобрить слияние того же коммита в неизменном виде. Придется полагаться на собственное наилучшее суждение до тех пор, пока не будут согласованы четкие руководящие принципы. Для MFC, регулируемых re@, добавляются новые поля метаданных, такие как тег Approved by для одобренных коммитов. Эти новые метаданные должны быть добавлены через `git commit --amend` или аналогичные средства после того, как исходный коммит будет проверен и одобрен. Мы также можем захотеть зарезервировать некоторые поля метаданных в коммитах MFC, такие как URL-адреса Phabricator, для использования re@ в будущем. Сохранение существующих метаданных обеспечивает очень простой рабочий процесс. Разработчики используют `git cherry-pick -x` без необходимости редактировать сообщение журнала. Если же мы решим изменять метаданные в MFC, разработчикам придется явно редактировать сообщения журнала с помощью `git cherry-pick --edit` или `git commit --amend`. Однако по сравнению с svn, по крайней мере, существующее сообщение о фиксации может быть предварительно заполнено, а поля метаданных можно добавлять или удалять без необходимости повторного ввода всего сообщения о фиксации. Суть в том, что разработчикам, вероятно, потребуется тщательно готовить свои сообщения о коммитах для MFC, которые не являются тривиальными. [[vendor-import-git]] === Импорт вендоров с Git В этом разделе подробно описывается процедура импорта вендора с использованием Git. ==== Соглашение о наименовании веток Все ветки и теги вендоров начинаются с `vendor/`. Эти ветки и теги видны по умолчанию. [NOTE] ==== Эта глава следует соглашению, что `freebsd` — это имя источника для официального репозитория Git FreeBSD. Если вы используете другое соглашение, замените `freebsd` на используемое вами имя в приведённых ниже примерах. ==== Мы рассмотрим пример обновления mtree NetBSD, который находится в нашем дереве. Ветка вендора для него — `vendor/NetBSD/mtree`. ==== Обновление старого импорта от вендора Деревья вендоров обычно содержат лишь подмножество стороннего программного обеспечения, подходящего для FreeBSD. Эти деревья, как правило, очень малы по сравнению с деревом FreeBSD. Таким образом, рабочие деревья Git довольно компактны и быстры, что делает их предпочтительным методом использования. Убедитесь, что выбранный вами каталог ( `../mtree` ) в настоящее время не существует. [source, shell] .... % git worktree add ../mtree vendor/NetBSD/mtree .... ==== Обновление исходных кодов в ветке вендора Подготовьте полное, чистое дерево исходных кодов вендора. Импортируйте всё, но делайте слияние только тому, что необходимо. Этот пример предполагает, что исходный код NetBSD получен из их зеркала на GitHub в каталоге `~/git/NetBSD`. Учтите, что «вышестоящий репозиторий» мог добавить или удалить файлы, поэтому мы хотим убедиться, что удаления также распространяются. Пакет package:net/rsync[] обычно установлен, поэтому я буду использовать его. [source, shell] .... % cd ../mtree % rsync -va --del --exclude=".git" ~/git/NetBSD/usr.sbin/mtree/ . % git add -A % git status ... % git diff --staged ... % git commit -m "Vendor import of NetBSD's mtree at 2020-12-11" [vendor/NetBSD/mtree 8e7aa25fcf1] Vendor import of NetBSD's mtree at 2020-12-11 7 files changed, 114 insertions(+), 82 deletions(-) % git tag -a vendor/NetBSD/mtree/20201211 .... Крайне важно убедиться, что импортируемый исходный код получен из надежного источника. Многие проекты с открытым исходным кодом используют криптографические подписи для подписывания изменений кода, тегов git и/или tar-архивов с исходным кодом. Всегда проверяйте эти подписи и используйте механизмы изоляции, такие как клетки, chroot, в сочетании с выделенной непривилегированной учетной записью пользователя, отличной от той, которую вы используете регулярно (подробнее см. в разделе «Обновление дерева исходного кода FreeBSD» ниже), пока вы не будете уверены, что импортируемый исходный код выглядит безопасным. Отслеживание разработки в вышестоящем репозитории и периодический просмотр изменений кода в нем могут значительно помочь в повышении качества кода и принести пользу всем участникам. Также рекомендуется изучать результаты git diff перед импортом их в область вендора. Всегда выполняйте команды `git diff` и `git status` и внимательно изучайте результаты. В случае сомнений полезно выполнить `git annotate` на ветке вендора или в вышестоящем git-репозитории, чтобы увидеть, кто и почему внес изменение. В примере выше мы использовали `-m` для иллюстрации, но вам следует составить корректное сообщение в редакторе (используя шаблон сообщения о фиксации). Также важно создать аннотированный тег с помощью `git tag -a`, иначе отправка будет отклонена. Только аннотированные теги разрешены для отправки. Аннотированный тег даёт вам возможность ввести сообщение коммита. Укажите версию, которую вы импортируете, вместе с любыми важными новыми функциями или исправлениями в этой версии. ==== Обновление копии FreeBSD На этом этапе вы можете отправить импорт в `vendor` в наш репозиторий. [source, shell] .... % git push --follow-tags freebsd vendor/NetBSD/mtree .... `--follow-tags` указывает `git push` также отправлять теги, связанные с локально зафиксированной ревизией. ==== Обновление дерева исходных кодов FreeBSD Теперь вам нужно обновить mtree в FreeBSD. Исходные коды находятся в `contrib/mtree`, так как это программное обеспечение из внешних источников. Время от времени нам может потребоваться вносить изменения в предоставленный (contrib) код, чтобы лучше соответствовать потребностям FreeBSD. По возможности, пожалуйста, старайтесь передавать локальные изменения обратно в вышестоящие проекты — это помогает им лучше поддерживать FreeBSD, а также экономит ваше время при разрешении конфликтов в будущем при импорте обновлений. [source, shell] .... % cd ../src % git subtree merge -P contrib/mtree vendor/NetBSD/mtree .... Это создаст коммит слияния поддерева `contrib/mtree` с локальной веткой `vendor/NetBSD/mtree`. Изучите разницу (diff) между результатом слияния и содержимым вышестоящей ветки. Если слияние сократило наши локальные изменения до более тривиальных различий, таких как изменения пустых строк или отступов, попробуйте исправить локальные изменения, чтобы уменьшить разницу с вышестоящей версией, или попытайтесь внести оставшиеся изменения обратно в вышестоящий проект. Если возникли конфликты, вам потребуется устранить их перед коммитом. Включите подробности об объединяемых изменениях в сообщение коммита слияния. Некоторое открытое программное обеспечение включает скрипт `configure`, который генерирует файлы, используемые для определения процесса сборки кода; обычно эти сгенерированные файлы, такие как `config.h`, должны обновляться как часть процесса импорта. При выполнении этого всегда помните, что эти скрипты являются исполняемым кодом, работающим под учётными данными текущего пользователя. Этот процесс всегда должен запускаться в изолированной среде, в идеале внутри клетки, не имеющей сетевого доступа, и с непривилегированной учётной записью; или, как минимум, с выделенной учётной записью, отличной от той, которую вы обычно используете для повседневных задач или для отправки изменений в репозиторий исходного кода FreeBSD. Это минимизирует риск столкновения с ошибками, которые могут привести к потере данных или, в худших случаях, к выполнению злонамеренно внедрённого кода. Использование изолированной клетки также предотвращает обнаружение скриптами configure локально установленных пакетов программного обеспечения, что может привести к неожиданным результатам. При тестировании ваших изменений запускайте их сначала в chroot или в клетке, или даже внутри виртуальной машины, особенно для модификаций ядра или библиотек. Этот подход помогает предотвратить неблагоприятное взаимодействие с вашей рабочей средой. Это может быть особенно полезно для изменений в библиотеках, которые используют многие компоненты базовой системы среди прочего. ==== Перебазирование ваших изменений относительно последней версии исходного дерева FreeBSD Поскольку текущая политика рекомендует избегать слияний (merge), то, если вышестоящая ветка FreeBSD `main` продвинулась вперёд до того, как у вас появится возможность отправить изменения, вам придётся переделывать слияние. Обычный `git rebase` или `git pull --rebase` не умеет перемещать коммит слияния **как коммит слияния**, поэтому вместо этого вам придётся воссоздать коммит. Следующие шаги следует выполнить, чтобы легко воссоздать коммит слияния, как если бы `git rebase --merge-commits` сработал правильно: * Перейдите в корень репозитория * Создайте побочную ветвь `XXX` с **содержимым** дерева со слиянием. * Обновите эту побочную ветку `XXX` для слияния и актуализации с основной веткой FreeBSD `main`. ** В худшем случае вам всё равно придётся разрешать конфликты слияния, если они были, но это должно быть крайне редко. ** Разрешите конфликты и, если необходимо, объедините (collapse) несколько коммитов в один (без конфликтов объединение не требуется) * извлеките (checkout) ветку `main` * создайте ветку `YYY` (позволяет проще откатиться, если что-то пойдет не так) * Повторите слияние поддерева * Вместо разрешения конфликтов от слияния поддерева, извлеките (checkout) содержимое XXX поверх него. ** Завершающая `.` важна, как и нахождение на верхнем уровне репозитория. ** Вместо переключения веток на XXX, он накладывает содержимое XXX поверх репозитория * Сделайте коммит полученному результату с предыдущим сообщением коммита (пример предполагает, что в ветке XXX была только одна операция слияния). * Убедитесь, что ветки одинаковые. * Сделайте любые необходимые проверки, включая привлечение других людей для проверки, если вы считаете, что это необходимо. * Запишите (push) этот коммит. Если вы «снова проиграли в гонке», просто повторите эти шаги (см. рецепт ниже) * Удалите ветки после того, как коммит попадёт в вышестоящий репозиторий. Они одноразовые. Команды, которые можно использовать, следуя приведённому выше примеру с mtree, будут выглядеть следующим образом (символ `#` начинает комментарий, помогающий связать команды с описаниями выше): [source, shell] .... % cd ../src # CD to top of tree % git checkout -b XXX # create new throw-away XXX branch for merge % git fetch freebsd # Get changes from upstream from upstream % git merge freebsd/main # Merge the changes and resolve conflicts % git checkout -b YYY freebsd/main # Create new throw-away YYY branch for redo % git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge % git checkout XXX . # XXX branch has the conflict resolution % git commit -c XXX~1 # -c reuses the commit message from commit before rebase % git diff XXX YYY # Should be empty % git show YYY # Should only have changes you want, and be a merge commit from vendor branch .... Примечание: если что-то пойдет не так с коммитом, вы можете сбросить ветку `YYY`, повторно выполнив команду checkout, которая создала её, с флагом -B, чтобы начать заново: [source, shell] .... % git checkout -B YYY freebsd/main # Создать новую временную ветку YYY, если начать заново будет проще .... ==== Отправка (push) изменений Когда вы считаете, что у вас есть набор изменений, и они хорошие, вы можете отправить их в форк на GitHub или GitLab для просмотра и рецензирования другими. Одна из хороших особенностей Git заключается в том, что он позволяет публиковать черновые версии вашей работы для проверки другими. Хотя Phabricator хорош для проверки содержания, публикация обновленной ветки вендора и коммитов слияния позволяет другим проверить детали, которые в конечном итоге появятся в репозитории. После проверки, когда вы уверены, что это хорошее изменение, вы можете отправить (push) его в репозиторий FreeBSD: [source, shell] .... % git push freebsd YYY:main # put the commit on upstream's 'main' branch % git branch -D XXX # Throw away the throw-a-way branches. % git branch -D YYY .... Примечание: Я использовал `XXX` и `YYY`, чтобы было очевидно, что это ужасные имена, и они не должны покидать вашу машину. Если вы используете такие имена для другой работы, вам нужно будет выбрать другие имена или рискнуть потерять другую работу. В этих именах нет ничего волшебного. В вышестоящий репозиторий вам не разрешат их отправить, но, тем не менее, обратите внимание на точные команды выше. Некоторые команды используют синтаксис, который лишь незначительно отличается от типичного использования, и это различие в поведении критически важно для работы данного рецепта. ==== Как переделать вещи, если это необходимо Если вы попытались выполнить отправку из предыдущего раздела и она завершилась неудачей, то вам следует выполнить следующие действия для «повторного выполнения» операций. Эта последовательность сохраняет коммит с сообщением о коммите всегда на позиции XXX~1 для упрощения коммита. [source, shell] .... % git checkout -B XXX YYY # recreate that throw-away-branch XXX and switch to it % git merge freebsd/main # Merge the changes and resolve conflicts % git checkout -B YYY freebsd/main # Recreate new throw-away YYY branch for redo % git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge % git checkout XXX . # XXX branch has the conflict resolution % git commit -c XXX~1 # -c reuses the commit message from commit before rebase .... Затем проверьте, как описано выше, и отправьте (push), как описано выше, когда будет готово. === Создание новой ветки вендора Существует несколько способов создания новой ветки вендора. Рекомендуемый способ — создать новый репозиторий и затем сделать его слияние с FreeBSD. Например, производится импорт `glorbnitz` версии 3.1415 в дерево FreeBSD. Для простоты мы не будем обрезать этот релиз. Это простая пользовательская команда, которая переводит устройство nitz в различные магические состояния glorb, и она достаточно мала, так что обрезка не сэкономит много. ==== Создайте репозиторий [source, shell] .... % cd /some/where % mkdir glorbnitz % cd glorbnitz % git init % git checkout -b vendor/glorbnitz .... На этом этапе у вас есть новый репозиторий, в котором все новые коммиты будут направляться в ветку `vendor/glorbnitz`. Опытные пользователи Git также могут сделать это непосредственно в своей копии FreeBSD, используя `git checkout --orphan vendor/glorbnitz`, если им так удобнее. ==== Скопируйте себе исходники Поскольку это новая импортированная копия, вы можете просто скопировать файлы исходного кода командой cp, либо использовать tar или даже rsync, как показано выше. И мы добавим всё, предполагая отсутствие файлов с точкой в начале имени. [source, shell] .... % cp -r ~/glorbnitz/* . % git add * .... На этом этапе у вас должна быть чистая копия glorbnitz, готовая к коммиту. [source, shell] .... % git commit -m "Import GlorbNitz frobnosticator revision 3.1415" .... Как и выше, я использовал `-m` для простоты, но вам, вероятно, следует создать сообщение коммита, которое объясняет, что такое Glorb и почему для его получения используется Nitz. Не все это знают, поэтому для вашего реального коммита вам следует руководствоваться разделом crossref:committers-guide[commit-log-message,сообщение коммита], а не имитировать краткий стиль, использованный здесь. ==== Теперь импортируйте его в наш репозиторий Теперь необходимо импортировать ветку в наш репозиторий. [source, shell] .... % cd /path/to/freebsd/repo/src % git remote add glorbnitz /some/where/glorbnitz % git fetch glorbnitz vendor/glorbnitz .... Обратите внимание, что ветка vendor/glorbnitz находится в репозитории. На этом этапе `/some/where/glorbnitz` можно удалить, если хотите. Это было лишь промежуточным шагом для достижения цели. // perhaps the real treasure was the friends it made along the way... ==== Сделайте тег и отправьте (push) Дальнейшие шаги во многом аналогичны процессу обновления ветки вендора, за исключением самого шага обновления ветки вендора. [source, shell] .... % git worktree add ../glorbnitz vendor/glorbnitz % cd ../glorbnitz % git tag --annotate vendor/glorbnitz/3.1415 # Убедитесь, что коммит хороший, с помощью "git show" % git push --follow-tags freebsd vendor/glorbnitz .... Под «хорошим» мы подразумеваем: . Все необходимые файлы присутствуют . Ни один из неправильных файлов не присутствует . Ветка вендора указывает на что-то разумное . Тег выглядит хорошо и имеет аннотацию . Сообщение коммита для тега содержит краткую сводку о нововведениях с момента предыдущего тега ==== Время наконец сделать слияние этого в базовое дерево [source, shell] .... % cd ../src % git subtree add -P contrib/glorbnitz vendor/glorbnitz # Убедитесь, что коммит хороший, с помощью "git show" % git commit --amend # one last sanity check on commit message % git push freebsd .... Здесь «хороший» означает: . Все правильные файлы и ни одного неправильного были объединены слиянием в contrib/glorbnitz. . В дереве нет других изменений. . Сообщения коммитов должны выглядеть crossref:committers-guide[commit-log-message,хорошо]. Они должны содержать сводку изменений с момента последнего слияния с основной веткой FreeBSD `main` и любые предостережения. -. UPDATING должен быть обновлен, если есть что-то важное, например, заметные пользователям изменения, важные аспекты обновления и т.д. +. `RELNOTES` и `UPDATING` должны быть обновлены, если есть что-то важное, например, заметные пользователям изменения, важные аспекты обновления и т.д. [NOTE] ==== Это еще не подключило `glorbnitz` к сборке. Способ сделать это зависит от конкретного импортируемого программного обеспечения и выходит за рамки данного руководства. ==== ===== Сохраняя актуальность Итак, время идёт. Пришло время обновить дерево до последних изменений из вышестоящего репозитория. При переходе на ветку `main` (при checkout) убедитесь, что у вас нет незакоммиченных изменений. Намного проще закоммитить их в отдельную ветку (или использовать `git stash`) перед выполнением следующих действий. Если вы привыкли к `git pull`, мы настоятельно рекомендуем использовать опцию `--ff-only` и дополнительно установить её в качестве опции по умолчанию. В качестве альтернативы, `git pull --rebase` полезен, если у вас есть изменения, проиндексированные (stage) в ветке `main`. [source, shell] .... % git config --global pull.ff only .... Возможно, вам потребуется опустить --global, если вы хотите, чтобы эта настройка применялась только к этому репозиторию. [source, shell] .... % cd freebsd-src % git checkout main % git pull (--ff-only|--rebase) .... Существует распространённая ловушка: команда `git pull` попытается выполнить слияние, что иногда создаёт коммит слияния, которого ранее не существовало. Восстановление после этого может быть затруднительно. Рекомендуется также использовать расширенную форму. [source, shell] .... % cd freebsd-src % git checkout main % git fetch freebsd % git merge --ff-only freebsd/main .... Эти команды сбрасывают ваше дерево к ветке `main`, а затем обновляют его из исходного источника, откуда дерево было первоначально получено (pull). Важно переключиться на `main` перед выполнением этого, чтобы обеспечить продвижение вперёд. Теперь пришло время продвинуть изменения вперёд: [source, shell] .... % git rebase -i main working .... Это вызовет интерактивный экран для изменения настроек по умолчанию. Пока просто выйдите из редактора. Всё должно примениться автоматически. Если нет, то вам потребуется разрешить различия. https://docs.github.com/en/free-pro-team@latest/github/using-git/resolving-merge-conflicts-after-a-git-rebase[Документация GitHub] может помочь вам в этом процессе. [[git-push-upstream]] ===== Время отправить (push) изменения вверх (upstream) Сначала убедитесь, что URL для отправки (push) правильно настроен для вышестоящего репозитория. [source, shell] .... % git remote set-url --push freebsd ssh://git@gitrepo.freebsd.org/src.git .... Затем убедитесь, что имя пользователя и адрес электронной почты настроены правильно. Требуется, чтобы они точно соответствовали записи passwd в кластере FreeBSD. Используйте [source, shell] .... freefall% gen-gitconfig.sh .... на freefall.freebsd.org (при условии, что /usr/local/bin находится в PATH), чтобы получить готовый шаблон конфигурации, который можно использовать напрямую. Следующая команда делает слияние ветки `working` в основную ветку `main` вышестоящего репозитория. Важно, чтобы вы подготовили свои изменения именно так, как хотите видеть их в исходном репозитории FreeBSD, перед выполнением этой операции. Данный синтаксис отправляет (push) ветку `working` в `main`, перемещая ветку `main` вперед. Вы сможете сделать это только в том случае, если результатом будет линейное изменение для `main` (т.е. без слияний). [source, shell] .... % git push freebsd working:main .... Если ваша отправка (push) отклонена из-за проигрыша в гонке коммитов, перебазируйте вашу ветку перед повторной попыткой: [source, shell] .... % git checkout working % git fetch freebsd % git rebase freebsd/main % git push freebsd working:main .... [[git-push-upstream-alt]] ===== Время отправить (push) изменения вверх (альтернативный вариант) Некоторым удобнее делать слияние своих изменений в локальную ветку `main` перед отправкой в удалённый репозиторий. Кроме того, `git arc stage` перемещает изменения из ветки в локальную `main`, когда требуется выполнить только часть изменений из ветки. Инструкции схожи с предыдущим разделом: [source, shell] .... % git checkout main % git merge --ff-only `working` % git push freebsd .... Если вы проиграли гонку, попробуйте снова с [source, shell] .... % git pull --rebase % git push freebsd .... Эти команды получат (fetch) последние изменения из `freebsd/main`, а затем перебазируют (rebase) локальные изменения `main` поверх них, что и требуется, когда вы проиграли гонку коммитов. Примечание: коммиты слияния ветки вендоров не будет работать с этой техникой. ===== Поиск ревизии Subversion Вам нужно убедиться, что вы получили (fetch) примечания (подробности смотрите в разделе crossref:committers-guide[git-mini-daily-use, Ежедневное использование]). Как только вы это сделаете, примечания будут отображаться в команде git log следующим образом: [source, shell] .... % git log .... Если у вас есть конкретная версия, вы можете использовать эту конструкцию: [source, shell] .... % git log --grep revision=XXXX .... чтобы найти конкретную ревизию. Шестнадцатеричное число после 'commit' — это хэш, который можно использовать для ссылки на этот коммит. [[git-faq]] === Часто задаваемые вопросы о Git В этом разделе представлены конкретные ответы на вопросы, которые часто возникают у пользователей и разработчиков. [NOTE] ==== Мы используем общепринятое соглашение, согласно которому источником для репозитория FreeBSD является 'freebsd', а не стандартный 'origin', чтобы позволить людям использовать его для собственной разработки и минимизировать случайные отправки (push) в неправильный репозиторий. ==== ==== Пользователи ===== Как отслеживать -current и -stable, имея только одну копию репозитория? **В:** Хотя место на диске не является большой проблемой, эффективнее использовать только одну копию репозитория. При зеркалировании SVN я мог извлекать несколько деревьев из одного и того же репозитория. Как мне сделать это с помощью Git? **О:** Вы можете использовать рабочие деревья Git. Существует несколько способов сделать это, но самый простой — использовать клон для отслеживания -current и рабочее дерево для отслеживания стабильных выпусков. Хотя использование «голого (bare) репозитория» предлагалось как способ справиться с этим, это более сложно и здесь документироваться не будет. Сначала необходимо клонировать репозиторий FreeBSD, здесь показано клонирование в `freebsd-current` для избежания путаницы. `$URL` — это любой зеркальный сервер, который работает для вас наилучшим образом: [source, shell] .... % git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' $URL freebsd-current .... после того, как он будет клонирован, вы можете просто создать рабочее дерево из него: [source, shell] .... % cd freebsd-current % git worktree add ../freebsd-stable-12 stable/12 .... это извлечёт `stable/12` в каталог с именем `freebsd-stable-12`, который находится на одном уровне с каталогом `freebsd-current`. После создания он обновляется очень похожим образом, как вы могли бы ожидать: [source, shell] .... % cd freebsd-current % git checkout main % git pull --ff-only # changes from upstream now local and current tree updated % cd ../freebsd-stable-12 % git merge --ff-only freebsd/stable/12 # now your stable/12 is up to date too .... Я рекомендую использовать `--ff-only`, так как это безопаснее и позволяет избежать случайного попадания в 'кошмар слияния', когда в вашем дереве появляются дополнительные изменения, вынуждающие выполнять сложное слияние вместо простого. Вот https://adventurist.me/posts/00296[хорошая статья], в которой рассматривается этот вопрос более подробно. ==== Разработчики ===== Ой! Я закоммитил в `main` вместо другой ветки. **В:** Время от времени я ошибаюсь и по ошибке делаю коммит в ветку `main`. Что мне делать? **О:** Во-первых, не паникуйте. Во-вторых, не отправляйте (push) изменения. На самом деле, можно исправить почти всё, если изменения не были отправлены. Все ответы в этом разделе предполагают, что отправки не произошло. Следующий ответ предполагает, что вы закоммитили в `main` и хотите создать ветку с названием `issue`: [source, shell] .... % git checkout -b issue # Create the 'issue' branch % git checkout -B main freebsd/main # Reset main to upstream % git checkout issue # Back to where you were .... ===== Ой! Я закоммитил что-то не в ту ветку! **В:** Я работал над функцией в ветке `wilma`, но случайно сделал коммит изменению, относящемуся к ветке `fred`, в 'wilma'. Что мне делать? **О:** Ответ аналогичен предыдущему, но с использованием выборочного применением коммитов (cherry-pick). Предполагается, что в ветке wilma имеется всего один коммит, однако подход можно обобщить и для более сложных ситуаций. Также предполагается, что это последний коммит в ветке wilma (отсюда использование wilma в команде `git cherry-pick`), но и это можно обобщить. [source, shell] .... # We're on branch wilma % git checkout fred # move to fred branch % git cherry-pick wilma # copy the misplaced commit % git checkout wilma # go back to wilma branch % git reset --hard HEAD^ # move what wilma refers to back 1 commit .... Если это не последний коммит, вы можете выборочно применить (cherry-pick) это одно изменение из wilma к fred, затем использовать `git rebase -i`, чтобы удалить изменение из wilma. [source, shell] .... # Мы находимся на ветке wilma % git checkout fred # перейти на ветку fred % git cherry-pick HASH_OF_CHANGE # скопировать ошибочно размещённый коммит % git rebase -i main wilma # удалить скопированное изменение .... **В:** Но что, если я хочу сделать коммит нескольким изменениям в `main`, но оставить остальные в `wilma` по какой-то причине? **О:** Тот же метод, описанный выше, также работает, если вы хотите «приземлить» части ветки, над которой работаете, в `main` до того, как вся ветка будет готова (скажем, вы заметили несвязанную опечатку или исправили случайную ошибку). Вы можете выборочно применить (cherry-pick) эти изменения в `main`, а затем отправить их в родительский репозиторий. После того, как вы это сделаете, очистка не может быть проще: просто выполните `git rebase -i`. Git заметит, что вы это сделали, и автоматически пропустит общие изменения (даже если вам пришлось изменить сообщение коммита или слегка подкорректировать коммит). Нет необходимости переключаться обратно на wilma, чтобы её поправить: просто делайте rebase! **В:** Я хочу выделить некоторые изменения из ветки `wilma` в ветку `fred` **О:** Более общий ответ будет таким же, как и предыдущий. Вы должны выгрузить(checkout)/создать ветку `fred`, выборочно применить (cherry-pick) нужные изменения из ветки `wilma` по одному, а затем перебазировать (rebase) `wilma`, чтобы удалить те изменения, которые вы выборочно применили. `git rebase -i main wilma` перенесёт вас в редактор, где нужно удалить строки `pick`, соответствующие коммитам, которые вы скопировали в `fred`. Если всё пройдёт хорошо и не будет конфликтов, вы закончили. Если нет, вам нужно будет разрешать конфликты по мере их появления. Другой способ сделать это — выгрузить `wilma`, а затем создать ветку `fred`, указывающую на ту же точку в дереве. Затем вы можете выполнить `git rebase -i` для обеих этих веток, выбирая изменения, которые вы хотите видеть в `fred` или `wilma`, оставляя строки с `pick` и удаляя остальные в редакторе. Некоторые предпочитают создать тег/ветку с названием `pre-split` перед началом, на случай если что-то пойдет не так при разделении. Вы можете отменить это следующей последовательностью: [source, shell] .... % git checkout pre-split # Go back % git branch -D fred # delete the fred branch % git checkout -B wilma # reset the wilma branch % git branch -d pre-split # Pretend it didn't happen .... Последний шаг необязателен. Если вы собираетесь повторить попытку разделения, его можно пропустить. **В:** Но я делал всё по мере прочтения и не увидел ваш совет в конце создать ветку, и теперь `fred` и `wilma` полностью испорчены. Как мне найти, чем `wilma` была до того, как я начал. Я не знаю, сколько раз я всё переставлял. **О:** Не всё потеряно. Вы можете разобраться с этим, если прошло не слишком много времени или не было сделано слишком много коммитов (сотни). Итак, я создал ветку wilma и закоммитил в неё пару изменений, затем решил разделить её на fred и wilma. Ничего странного при этом не произошло, но предположим, что произошло. Способ посмотреть, что вы сделали, — это использовать `git reflog`: [source, shell] .... % git reflog 6ff9c25 (HEAD -> wilma) HEAD@{0}: rebase -i (finish): returning to refs/heads/wilma 6ff9c25 (HEAD -> wilma) HEAD@{1}: rebase -i (start): checkout main 869cbd3 HEAD@{2}: rebase -i (start): checkout wilma a6a5094 (fred) HEAD@{3}: rebase -i (finish): returning to refs/heads/fred a6a5094 (fred) HEAD@{4}: rebase -i (pick): Encourage contributions 1ccd109 (freebsd/main, main) HEAD@{5}: rebase -i (start): checkout main 869cbd3 HEAD@{6}: rebase -i (start): checkout fred 869cbd3 HEAD@{7}: checkout: moving from wilma to fred 869cbd3 HEAD@{8}: commit: Encourage contributions ... % .... Здесь мы видим изменения, которые я внес. Вы можете использовать это, чтобы понять, где что-то пошло не так. Я лишь укажу на несколько моментов. Первый из них — HEAD@{X} является 'коммитоподобной' сущностью, поэтому вы можете использовать это в качестве аргумента команды. Хотя если эта команда вносит что-либо в репозиторий, номера X изменяются. Вы также можете использовать хэш (первый столбец). Далее, 'Encourage contributions' был последним коммитом, который я сделал в `wilma` перед тем, как решил разделить всё. Вы также можете видеть, что тот же хэш присутствует, когда я создал ветку `fred` для этого. Я начал с перебазирования `fred`, и вы видите 'начало', каждый шаг и 'завершение' этого процесса. Хотя нам это здесь не нужно, вы можете точно понять, что произошло. К счастью, чтобы исправить это, вы можете выполнить шаги из предыдущего ответа, но с хэшем `869cbd3` вместо `pre-split`. Хотя это кажется немного многословным, это легко запомнить, поскольку вы делаете одно действие за раз. Вы также можете последовательно применить команды одну за другой: [source, shell] .... % git checkout -B wilma 869cbd3 % git branch -D fred .... и вы готовы попробовать снова. Команда `checkout -B` с хэшем объединяет извлечение (checkout) и создание ветки для него. Использование `-B` вместо `-b` принудительно перемещает уже существующую ветку. В любом случае это работает, что и прекрасно (и ужасно) в Git. Одна из причин, по которой я склонен использовать `git checkout -B xxxx хэш` вместо извлечения (checkout) хэша, а затем создания / перемещения ветки, — это чисто чтобы избежать слегка тревожного сообщения об отделённом HEAD: [source, shell] .... % git checkout 869cbd3 M faq.md Note: checking out '869cbd3'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b HEAD is now at 869cbd3 Encourage contributions % git checkout -B wilma .... это производит тот же эффект, но мне приходится читать гораздо больше, а отрубленные головы (прим перев.: detached HEAD — отрубленная голова) — не тот образ, который мне нравится созерцать. ===== Ой! Я выполнил `git pull`, и это создало коммит слияния, что мне делать? **В:** Я действовал на автопилоте и сделал `git pull` для своего дерева разработки, что создало коммит слияния в `main`. Как мне восстановиться? **О:** Это может произойти, когда вы выполняете извлечение (checkout) с выбранной веткой разработки. Многие разработчики используют `git pull --rebase`, чтобы избежать этой ситуации. Сразу после получения и слияния (pull) у вас в рабочую копию будет извлечен новый коммит слияния. Git поддерживает синтаксис `HEAD^#` для определения родителей коммита слияния: [source, shell] .... git log --oneline HEAD^1 # Look at the first parent's commits git log --oneline HEAD^2 # Look at the second parent's commits .... Из этих журналов вы можете легко определить, какой коммит является вашей разработкой. Затем вы просто сбрасываете свою ветку к соответствующему `HEAD^#`: [source, shell] .... git reset --hard HEAD^1 .... Кроме того, команда `git pull --rebase` на этом этапе перебазирует ваши изменения из ветки 'main' на последнюю версию 'freebsd/main'. **В:** Но мне также нужно исправить мою ветку `main`. Как мне это сделать? **О:** Git отслеживает ветки удалённого репозитория в пространстве имён `freebsd/`. Чтобы исправить вашу ветку `main`, просто заставьте её указывать на удалённую ветку `main`: [source, shell] .... git branch -f main freebsd/main .... Ветви в Git не имеют ничего магического: они всего лишь метки на графе, которые автоматически перемещаются вперед при создании коммитов. Так что вышеописанное работает, потому что вы просто перемещаете метку. Из-за этого нет никаких метаданных о ветке, которые нужно было бы сохранять. ===== Смешивание и сопоставление веток **В:** Итак, у меня есть две ветки `worker` и `async`, которые я хочу объединить в одну ветку под названием `feature` с сохранением коммитов в обеих. **О:** Это задача для выборочного применения (cherry-pick). [source, shell] .... % git checkout worker % git checkout -b feature # create a new branch % git cherry-pick main..async # bring in the changes .... Теперь у вас есть новая ветка под названием `feature`. Эта ветка объединяет коммиты из обеих веток. Вы можете далее работать с ней с помощью `git rebase`. **В:** У меня есть ветка под названием `driver`, и я хочу разделить её на `kernel` и `userland`, чтобы развивать их отдельно и коммитить каждую ветку по мере её готовности. **О:** Это требует небольшой подготовительной работы, но `git rebase` выполнит здесь основную часть работы. [source, shell] .... % git checkout driver # Checkout the driver % git checkout -b kernel # Create kernel branch % git checkout -b userland # Create userland branch .... Теперь у вас есть две идентичные ветки. Значит, пришло время разделить коммиты. Мы предположим, что сначала все коммиты в ветке `driver` попадут либо в ветку `kernel`, либо в ветку `userland`, но не в обе одновременно. [source, shell] .... % git rebase -i main kernel .... и просто включите изменения, которые вы хотите (строкой 'p' или 'pick'), и удалите коммиты, которые не нужны (это звучит пугающе, но в худшем случае вы всегда можете всё отбросить и начать заново с ветки `driver`, если вы только её не переместили). [source, shell] .... % git rebase -i main userland .... и сделайте то же самое, что вы сделали с веткой `kernel `. **В:** Отлично! Я выполнил указанные выше шаги и забыл сделать коммит в ветке `kernel`. Как мне восстановиться? **О:** Вы можете использовать ветку `driver`, чтобы найти хэш коммита, который отсутствует, и выборочно применить его (cherry-pick). [source, shell] .... % git checkout kernel % git log driver % git cherry-pick $HASH .... **В:** Хорошо. У меня такая же ситуация, как и выше, но мои коммиты все перемешаны. Мне нужно, чтобы части одного коммита попали в одну ветку, а остальные — в другую. На самом деле, у меня их несколько. Ваш метод перебазирования с выбором кажется сложным. **О:** В этой ситуации вам лучше обработать исходную ветку, чтобы отделить коммиты, а затем использовать вышеуказанный метод для разделения ветки. Итак, предположим, что есть всего один коммит с чистым деревом. Вы можете использовать либо `git rebase` со строкой `edit`, либо это с коммитом на острие. В любом случае шаги одинаковы. Первое, что нам нужно сделать, — это откатиться на один коммит назад, оставив изменения незакоммиченными в дереве: [source, shell] .... % git reset HEAD^ .... Примечание: НЕ, повторяю, НЕ добавляйте здесь `--hard`, так как это также удалит изменения из вашего дерева. Теперь, если вам повезёт, изменения, которые нужно разделить, полностью укладываются по границам файлов. В этом случае вы можете просто выполнить обычный `git add` для файлов в каждой группе, а затем сделать `git commit`. Примечание: при этом вы потеряете сообщение коммита при выполнении сброса, поэтому если оно вам по какой-то причине нужно, следует сохранить копию (хотя `git log $HASH` может его восстановить). Если вам не повезло, вам придётся разделять файлы. Для этого существует ещё один инструмент, который можно применять по одному файлу за раз. [source, shell] .... git add -i foo/bar.c .... будет последовательно проходить через различия, предлагая вам включить или исключить каждый фрагмент. После завершения, выполните `git commit`, и оставшиеся изменения окажутся в вашем дереве. Вы также можете запускать эту команду несколько раз, даже для нескольких файлов (хотя я считаю удобнее работать с одним файлом за раз и использовать `git rebase -i` для объединения связанных коммитов). ===== Присоединение к организации FreeBSD на GitHub. **В:** Как присоединиться к организации FreeBSD на GitHub? **О:** Подробности смотрите на странице https://wiki.freebsd.org/GitHub#Joining_the_Organisation[нашей вики GitHub]. Вкратце, присоединиться могут все коммиттеры FreeBSD. Лица, не являющиеся коммиттерами, которые запрашивают присоединение, будут рассматриваться в индивидуальном порядке. ==== Клонирование и зеркалирование **В:** Я хочу создать полную зеркальную копию репозитория Git, как мне это сделать? **О:** Если вам нужно только зеркалирование, то [source, shell] .... % git clone --mirror $URL .... сработает. Однако, у этого есть два недостатка, если вы хотите использовать это для чего-то кроме зеркала, которое вы будете переклонировать. Во-первых, это 'голый репозиторий', который содержит базу данных репозитория, но не имеет извлеченного рабочего дерева. Это отлично подходит для зеркалирования, но ужасно для повседневной работы. Существует несколько способов обойти это с помощью `git worktree`: [source, shell] .... % git clone --mirror https://git.freebsd.org/ports.git ports.git % cd ports.git % git worktree add ../ports main % git worktree add ../quarterly branches/2020Q4 % cd ../ports .... Но если вы не используете свой зеркальный репозиторий для дальнейшего локального клонирования, то это неподходящий выбор. Второй недостаток заключается в том, что Git обычно перезаписывает ссылки из вышестоящего репозитория (названия веток, теги и т.д.) , чтобы ваши локальные ссылки могли изменяться независимо от вышестоящего репозитория. Это означает, что вы потеряете изменения, если будете коммитить в свой репозиторий куда-либо, кроме веток приватных проектов. **В:** Так что же я могу сделать вместо этого? **О:** Ну, вы можете поместить все ссылки (refs) вышестоящего репозитория в приватное пространство имён вашего локального репозитория. Git клонирует всё через 'refspec', и refspec по умолчанию выглядит так: [source, shell] .... fetch = +refs/heads/*:refs/remotes/freebsd/* .... что говорит просто получить (fetch) ссылки веток. Однако в репозитории FreeBSD есть и ряд других элементов. Чтобы увидеть их, вы можете добавить явные спецификации ссылок для каждого пространства имен ссылок или получить всё. Чтобы настроить ваш репозиторий для этого: [source, shell] .... git config --add remote.freebsd.fetch '+refs/*:refs/freebsd/*' .... что поместит всё из вышестоящего репозитория в пространство имён `refs/freebsd/` вашего локального репозитория. Обратите внимание, что это также захватывает все несконвертированные ветки вендоров, а количество связанных с ними ссылок довольно велико. Вам потребуется ссылаться на эти ссылки с их полными именами, поскольку они не входят в обычные пространства имён Git. [source, shell] .... git log refs/freebsd/vendor/zlib/1.2.10 .... будет просматривать журнал ветки вендора для zlib, начиная с версии 1.2.10. === Сотрудничество с другими Одним из ключевых моментов качественной разработки программного обеспечения в таком крупном проекте, как FreeBSD, является возможность сотрудничать с другими участниками до отправки своих изменений в дерево исходного кода. Репозитории Git проекта FreeBSD пока не позволяют отправлять пользовательские ветки в репозиторий, поэтому если вы хотите поделиться своими изменениями с другими, вам необходимо использовать другой механизм, например, репозиторий, размещённый в GitLab или GitHub, для обмена изменениями в ветке, созданной пользователем. Следующие инструкции показывают, как создать пользовательскую ветку на основе ветки FreeBSD `main` и отправить её в GitHub. Прежде чем начать, убедитесь, что ваш локальный репозиторий Git актуален и имеет правильно настроенные источники, как показано в разделе crossref:committers-guide[keeping_current,выше]. [source, shell] -```` % git remote -v freebsd https://git.freebsd.org/src.git (fetch) freebsd ssh://git@gitrepo.freebsd.org/src.git (push) ```` +.... +% git remote -v +freebsd https://git.freebsd.org/src.git (fetch) +freebsd ssh://git@gitrepo.freebsd.org/src.git (push) +.... Первым шагом является создание форка https://github.com/freebsd/freebsd-src[FreeBSD] на GitHub, следуя этим https://docs.github.com/en/github/getting-started-with-github/fork-a-repo[инструкциям]. Назначением форка должен быть ваш собственный, личный аккаунт на GitHub (в моём случае gvnn3). Теперь добавьте удаленный репозиторий в вашей локальной системе, который указывает на ваш форк: [source, shell] .... % git remote add github git@github.com:gvnn3/freebsd-src.git % git remote -v github git@github.com:gvnn3/freebsd-src.git (fetch) github git@github.com:gvnn3/freebsd-src.git (push) freebsd https://git.freebsd.org/src.git (fetch) freebsd ssh://git@gitrepo.freebsd.org/src.git (push) .... В этом репозитории вы можете создать ветку crossref:committers-guide[keeping_a_local_branch,как показано выше]. [source, shell] .... % git checkout -b gnn-pr2001-fix .... Вносите любые изменения в своей ветке. Собирайте, тестируйте, и как только будете готовы к совместной работе с другими, настанет время отправить свои изменения в ветку, размещённую в GitHub. Прежде чем отправить изменения, вам нужно будет установить соответствующую вышестоящую ветку (upstream), о чём Git сообщит при первой попытке отправки в ваш удалённый репозиторий +github+: [source, shell] .... % git push github fatal: The current branch gnn-pr2001-fix has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream github gnn-pr2001-fix .... Если установить параметры отправки (push) так, как советует +git+, то это позволяет ему успешно выполниться: [source, shell] .... % git push --set-upstream github gnn-feature Enumerating objects: 20486, done. Counting objects: 100% (20486/20486), done. Delta compression using up to 8 threads Compressing objects: 100% (12202/12202), done. Writing objects: 100% (20180/20180), 56.25 MiB | 13.15 MiB/s, done. Total 20180 (delta 11316), reused 12972 (delta 7770), pack-reused 0 remote: Resolving deltas: 100% (11316/11316), completed with 247 local objects. remote: remote: Create a pull request for 'gnn-feature' on GitHub by visiting: remote: https://github.com/gvnn3/freebsd-src/pull/new/gnn-feature remote: To github.com:gvnn3/freebsd-src.git * [new branch] gnn-feature -> gnn-feature Branch 'gnn-feature' set up to track remote branch 'gnn-feature' from 'github'. .... Последующие изменения в той же ветке будут по умолчанию отправляться корректно: [source, shell] .... % git push Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Delta compression using up to 8 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 314 bytes | 1024 bytes/s, done. Total 3 (delta 1), reused 1 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (1/1), completed with 1 local object. To github.com:gvnn3/freebsd-src.git 9e5243d7b659..cf6aeb8d7dda gnn-feature -> gnn-feature .... На этом этапе ваша работа находится в вашей ветке на +GitHub+, и вы можете поделиться ссылкой с другими участниками. [[github-pull-land]] === Обработка запросов на принятие изменений (pull request) на github В этом разделе описано, как интегрировать запрос на принятие изменений (pull request) из GitHub, отправленный на зеркала FreeBSD в Git на GitHub. Хотя на данный момент это не официальный способ отправки исправлений, иногда таким образом приходят хорошие правки, и проще всего просто перенести их в дерево коммиттера и оттуда отправить (push) в дерево FreeBSD. Аналогичные шаги можно использовать для получать и сливать (pull) ветки из других репозиториев и их использовать их. При коммите запросов на принятие изменений от других следует проявлять особую осторожность, чтобы проверить все изменения и убедиться, что они в точности соответствуют заявленным. Прежде чем начать, убедитесь, что локальный репозиторий Git актуален и имеет правильно настроенные источники, как показано в разделе crossref:committers-guide[keeping_current,выше]. Кроме того, убедитесь, что у вас есть следующие источники: [source, shell] .... % git remote -v freebsd https://git.freebsd.org/src.git (fetch) freebsd ssh://git@gitrepo.freebsd.org/src.git (push) github https://github.com/freebsd/freebsd-src (fetch) github https://github.com/freebsd/freebsd-src (fetch) .... Часто запросы на принятие изменений просты: это запросы, содержащие всего один коммит. В этом случае можно использовать упрощённый подход, хотя подход из предыдущего раздела также будет работать. Здесь создаётся ветка, изменения выборочно применяются, сообщение коммита корректируется и проверяется на адекватность перед отправкой. В этом примере используется ветка `staging`, но она может иметь любое имя. Эта техника работает для любого количества коммитов в запросе на принятие изменений, особенно когда изменения чисто применяются к дереву FreeBSD. Однако, когда коммитов несколько, особенно когда требуются незначительные корректировки, `git rebase -i` работает лучше, чем `git cherry-pick`. Вкратце, эти команды создают ветку; выборочно применяют изменения из запроса на принятие изменений; тестируют их; корректируют сообщения коммитов; и выполняют слияние перемоткой (fast-forward) обратно в `main`. Номер PR ниже обозначен как `$PR`. При корректировке сообщения добавьте `Pull Request: https://github.com/freebsd-src/pull/$PR`. Все запросы на принятие изменений, зафиксированные в репозитории FreeBSD, должны быть проверены как минимум одним человеком. Это не обязательно должен быть тот, кто их фиксирует, но в этом случае тот, кто фиксирует, должен доверять компетентности других рецензентов в проверке коммита. Коммиттеры, которые проводят рецензирование кода у запросов на принятие изменений перед их отправкой в репозиторий, должны добавить строку `Reviewed by:` к коммиту, потому что в этом случае это не подразумевается. Добавьте всех, кто просматривает и одобряет коммит на github, также в `Reviewed by:`. Как всегда, следует позаботиться о том, чтобы изменение делало то, что предполагается, и чтобы в нём не было вредоносного кода. [NOTE] ====== Кроме того, пожалуйста, убедитесь, что имя автора запроса на принятие изменений не является анонимным. Веб-интерфейс редактирования Github генерирует имена вида: [source, shell] .... Author: github-user <38923459+github-user@users.noreply.github.com> .... Автору следует отправить вежливую просьбу предоставить более подходящее имя и/или адрес электронной почты. Следует проявлять особую осторожность, чтобы не допустить ошибок стиля или внедрения вредоносного кода. ====== [source, shell] .... % git fetch github pull/$PR/head:staging % git rebase -i main staging # to move the staging branch forward, adjust commit message here % git checkout main % git pull --ff-only # to get the latest if time has passed % git checkout main % git merge --ff-only staging % git push freebsd --push-option=confirm-author .... [.procedure] ==== Для сложных запросов на принятие изменений с несколькими коммитами, содержащими конфликты, следуйте приведённой ниже схеме. . извлеките запрос на принятие изменений `git checkout github/pull/XXX` . создайте ветку для перебазирования `git checkout -b staging` . перебазируйте ветку `staging` на последнюю версию `main` с помощью `git rebase -i main staging` . разрешите конфликты и проведите все необходимые тестирования . перемотайте (fast-forward) ветку `staging` в `main`, как описано выше . сделайте финальную проверку изменений, чтобы убедиться, что всё в порядке . отправьте в репозиторий Git FreeBSD. Это также будет работать при внесении веток, разработанных в другом месте, в локальное дерево для коммита. ==== После завершения работы с запросом на принятие изменений (pull request), закройте его с помощью веб-интерфейса GitHub. Стоит отметить, что если ваш источник `github` использует `https://`, единственным шагом, для которого потребуется учетная запись GitHub, будет закрытие запроса на принятие изменений. [[vcs-history]] == История системы контроля версий Проект перешёл на crossref:committers-guide[git-primer,git]. Репозиторий исходных кодов FreeBSD перешёл с CVS на Subversion 31 мая 2008 года. Первый настоящий коммит SVN — __r179447__. Репозиторий исходных кодов перешёл с Subversion на Git 23 декабря 2020 года. Последний настоящий коммит svn — __r368820__. Хеш первого настоящего коммита git — __5ef5f51d2bef80b0ede9b10ad5b0e9440b60518c__. Репозиторий `doc/www` FreeBSD перешёл с CVS на Subversion 19 мая 2012 года. Первый настоящий коммит SVN — __r38821__. Репозиторий документации перешёл с Subversion на Git 8 декабря 2020 года. Последний коммит SVN — __r54737__. Первый настоящий хэш коммита git — __3be01a475855e7511ad755b2defd2e0da5d58bbe__. Репозиторий `ports` FreeBSD перешел с CVS на Subversion 14 июля 2012 года. Первый настоящий коммит SVN — __r300894__. Репозиторий ports перешел с Subversion на Git 6 апреля 2021 года. Последний коммит SVN — __r569609__. Первый настоящий хэш коммита git — __ed8d3eda309dd863fb66e04bccaa513eee255cbf__. [[conventions]] == Настройка, соглашения и традиции В качестве нового разработчика необходимо выполнить ряд действий. Первый набор шагов относится исключительно к коммиттерам. Эти шаги должны быть выполнены наставником для тех, кто не является коммиттером. [[conventions-committers]] === Для новых коммиттеров Те, кому предоставлены права на коммит в репозитории FreeBSD, должны выполнить следующие шаги. * Получите одобрение наставника перед внесением каждого из этих изменений! * Все коммиты в [.filename]#src# сначала попадают в FreeBSD-CURRENT, прежде чем быть слитыми в FreeBSD-STABLE. Ветка FreeBSD-STABLE должна сохранять совместимость ABI и API с предыдущими версиями этой ветки. Не делайте слияние изменений, нарушающих эту совместимость. [[commit-steps]] [.procedure] ==== *Шаги для новых коммиттеров* . Добавить автора + [.filename]#doc/shared/authors.adoc# - Добавить информацию об авторе. Последующие шаги зависят от этой информации, и пропуск этого шага приведёт к сбою сборки [.filename]#doc/#. Это относительно простая задача, но она остаётся хорошим первым испытанием навыков работы с системой контроля версий. . Обновить список разработчиков и участников + [.filename]#doc/shared/contrib-committers.adoc# - Добавьте запись, которая затем появится в разделе "Разработчики" extref:{contributors}[Списка контрибьюторов, staff-committers]. Записи сортируются по фамилии. + [.filename]#doc/shared/contrib-additional.adoc# - _Удалить_ запись. Записи отсортированы по имени. -. Добавление статьи в Новости +. Добавить статью в Новости + [.filename]#doc/website/data/en/news/news.toml# - Добавьте запись. Найдите другие записи, объявляющие о новых коммиттерах, и следуйте формату. Используйте дату из письма об утверждении коммиттерских прав. . Добавить PGP-ключ + `{des}` написал сценарий оболочки ([.filename]#doc/documentation/tools/addkey.sh#) для упрощения этого процесса. Для получения дополнительной информации обратитесь к файлу https://cgit.freebsd.org/doc/plain/documentation/static/pgpkeys/README[README]. + Используйте [.filename]#doc/documentation/tools/checkkey.sh# для проверки, что ключи соответствуют как минимум минимальным стандартам лучших практик. + После добавления и проверки ключа добавьте оба обновленных файла в систему контроля версий и затем зафиксируйте (commit) их. Записи в этом файле отсортированы по фамилии. + [NOTE] ====== Очень важно иметь актуальный PGP/GnuPG ключ в репозитории. Ключ может потребоваться для подтверждения личности коммиттера. Например, `{admins}` используют его для восстановления учетной записи. Полный набор ключей пользователей `FreeBSD.org` доступен для скачивания по ссылке link:https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt[https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt]. ====== -. Обновление информации о наставнике и подопечном +. Обновить информацию о наставнике и подопечном + [.filename]#src/share/misc/committers-.dot# - Добавить запись в раздел текущих коммиттеров, где _repository_ - это `doc`, `ports` или `src`, в зависимости от предоставленных прав коммита. + Добавьте запись для каждого дополнительного отношения наставник/подопечный в нижнем разделе. +. Обновить файл mailmap в git ++ +[.filename]#src/.mailmap#, [.filename]#doc/.mailmap# и [.filename]#ports/.mailmap# - Добавьте запись для коммитов, созданных вами до получения статуса коммиттера FreeBSD. ++ +Привязка к вашему адресу FreeBSD позволяет нам проще отслеживать внешних коммиттеров, которые могут быть готовы получить права коммиттера. Вы также можете использовать это для исправления старых имен, опечаток в именах и т.д. в стандартном выводе `git log`. . Сгенерировать пароль Kerberos + См. crossref:committers-guide[kerberos-ldap, Kerberos и LDAP веб-пароль для кластера FreeBSD] для генерации или настройки учётной записи Kerberos для использования с другими сервисами FreeBSD, такими как link:https://bugs.freebsd.org/bugzilla/[база данных отслеживания ошибок] (вы получаете учётную запись для отслеживания ошибок как часть этого шага). . Необязательно: Включить учётную запись Вики + Учётная запись link:https://wiki.freebsd.org[FreeBSD Wiki] — учётная запись на вики позволяет делиться проектами и идеями. Те, у кого ещё нет учётной записи, могут следовать инструкциям на странице link:https://wiki.freebsd.org/Wiki/About[Wiki/About], чтобы её получить. Свяжитесь с mailto:wiki-admin@FreeBSD.org[wiki-admin@FreeBSD.org], если вам нужна помощь с вашей учётной записью на Вики. . Необязательно: Обновить информацию в Вики + Информация в вики — получив доступ к вики, некоторые добавляют записи на страницы https://wiki.freebsd.org/HowWeGotHere[Как мы сюда попали], https://wiki.freebsd.org/IRC/Nicknames[IRC-псевдонимы], https://wiki.freebsd.org/Community/Dogs[Собаки FreeBSD] и/или https://wiki.freebsd.org/Community/Cats[Кошки FreeBSD]. . Необязательно: Обновить порты с личной информацией + [.filename]#ports/astro/xearth/files/freebsd.committers.markers# и [.filename]#src/usr.bin/calendar/calendars/calendar.freebsd# — Некоторые люди добавляют в эти файлы записи о себе, чтобы указать своё местоположение или дату своего дня рождения. . Необязательно: Предотвращение повторных рассылок + Подписчики {dev-commits-doc-all}, {dev-commits-ports-all} или {dev-commits-src-all}, возможно, захотят отписаться, чтобы избежать получения дубликатов сообщений о коммитах и ответов на них. ==== [[conventions-everyone]] === Для всех [[conventions-everyone-steps]] [.procedure] ==== . Представьтесь другим разработчикам, иначе никто не будет иметь представления, кто вы и над чем работаете. Представление не должно быть исчерпывающей биографией — просто напишите абзац или два о том, кто вы, чем планируете заниматься как разработчик в FreeBSD, и кто будет вашим наставником. Отправьте это по электронной почте на {developers-name}, и вы начнёте свой путь! . Войдите на `freefall.FreeBSD.org` и создайте файл [.filename]#/var/forward/пользователь# (где _пользователь_ — это ваше имя пользователя), содержащий адрес электронной почты, на который должны перенаправляться письма, адресованные на _вашеимяпользователя_@FreeBSD.org. Это включает все сообщения о коммитах, а также любую другую почту, адресованную {committers-name} и {developers-name}. Очень большие почтовые ящики, которые заняли постоянное место на `freefall`, могут быть усечены без предупреждения, если потребуется освободить место, поэтому перенаправляйте или сохраняйте их в другом месте. + [NOTE] ====== Если ваша система электронной почты использует SPF со строгими правилами, вам следует исключить `mx2.FreeBSD.org` из проверок SPF. ====== + Из-за высокой нагрузки, которую обработка спама создает на центральных почтовых серверах, обрабатывающих почтовые рассылки, фронтенд-сервер выполняет базовые проверки и может отбрасывать некоторые сообщения на их основе. В настоящее время единственной активной проверкой является наличие корректной DNS-информации для подключающегося хоста, но это может измениться. Некоторые пользователи связывают эти проверки с ложным отбрасыванием легитимной почты. Для отключения данных проверок для вашей почты создайте файл с именем [.filename]#~/.spam_lover# на `freefall.FreeBSD.org`. + [NOTE] ====== Те, кто являются разработчиками, но не коммиттерами, не будут подписаны на рассылки коммиттеров или разработчиков. Подписки определяются правами доступа. ====== ==== [[smtp-setup]] ==== Настройка доступа SMTP Для тех, кто желает отправлять электронные письма через инфраструктуру FreeBSD.org, следуйте приведенным ниже инструкциям: [.procedure] ==== . Направьте ваш почтовый клиент на `smtp.FreeBSD.org:587`. . Включить STARTTLS. . Убедитесь, что ваш адрес `From:` установлен как `_вашеимяпользователя_@FreeBSD.org`. . Для аутентификации можно использовать ваше имя пользователя и пароль FreeBSD Kerberos (см. crossref:committers-guide[kerberos-ldap, Kerberos и LDAP веб-пароль для кластера FreeBSD]). Предпочтительнее использовать принципал `_вашеимяпользователя_/mail`, так как он действителен только для аутентификации к почтовым ресурсам. + [NOTE] ====== При вводе имени пользователя не включайте `@FreeBSD.org`. ====== + .Дополнительные заметки [NOTE] ====== * Будет принимать почту только от `_вашеимяпользователя_@FreeBSD.org`. Если вы аутентифицированы как один пользователь, вам не разрешено отправлять почту от другого. * Будет добавлен заголовок сообщения с именем пользователя SASL: (`Authenticated sender: _имя_пользователя_`). * На хосте действуют различные ограничения по скорости для сокращения попыток взлома перебором паролей. ====== ==== [[smtp-setup-local-mta]] ===== Использование локального MTA для пересылки электронной почты в SMTP-сервис FreeBSD.org Также возможно использовать локальный MTA для пересылки локально отправленных писем на SMTP-серверы FreeBSD.org. [[smtp-setup-local-postfix]] .Использование Postfix [example] ==== Чтобы сообщить локальному экземпляру Postfix, что любое письмо от `_вашеимяпользователя_@FreeBSD.org` должно быть перенаправлено на серверы FreeBSD.org, добавьте это в ваш [.filename]#main.cf#: [.programlisting] .... sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/relayhost_maps smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd smtp_use_tls = yes .... Создайте файл [.filename]#/usr/local/etc/postfix/relayhost_maps# со следующим содержимым: [.programlisting] .... вашеимяпользователя@FreeBSD.org [smtp.freebsd.org]:587 .... Создайте [.filename]#/usr/local/etc/postfix/sasl_passwd# со следующим содержимым: [.programlisting] .... [smtp.freebsd.org]:587 вашеимяпользователя:вашпароль .... Если почтовый сервер используется другими людьми, вы можете захотеть предотвратить отправку ими писем с вашего адреса. Для достижения этой цели добавьте это в ваш [.filename]#main.cf#: [.programlisting] .... smtpd_sender_login_maps = hash:/usr/local/etc/postfix/sender_login_maps smtpd_sender_restrictions = reject_known_sender_login_mismatch .... Создайте файл [.filename]#/usr/local/etc/postfix/sender_login_maps# со следующим содержимым: [.programlisting] .... вашеимяпользователя@FreeBSD.org вашеимялокальногопользователя .... Где _вашеимялокальногопользователя_ — это имя пользователя SASL, используемое для подключения к локальному экземпляру Postfix. ==== [[smtp-setup-local-opensmtpd]] .Использование OpenSMTPD [example] ==== Чтобы указать локальному экземпляру OpenSMTPD, что все письма от `_вашеимяпользователя_@FreeBSD.org` должны быть перенаправлены на серверы FreeBSD.org, добавьте это в ваш [.filename]#smtpd.conf#: [.programlisting] .... action "freebsd" relay host smtp+tls://freebsd@smtp.freebsd.org:587 auth match from any auth вашеимялокальногопользователя mail-from "_вашеимяпользователя_@freebsd.org" for any action "freebsd" .... Где _вашеимялокальногопользователя_ — это имя пользователя SASL, используемое для подключения к локальному экземпляру OpenSMTPD. Создайте файл [.filename]#/usr/local/etc/mail/secrets# со следующим содержимым: [.programlisting] .... freebsd вашеимяпользователя:вашпароль .... ==== [[smtp-setup-local-exim]] .Использование Exim [example] ==== Чтобы направить локальный экземпляр Exim для пересылки всей почты от `_example_@FreeBSD.org` на серверы FreeBSD.org, добавьте это в [.filename]#конфигурацию# Exim: [.programlisting] .... Routers section: (at the top of the list): freebsd_send: driver = manualroute domains = !+local_domains transport = freebsd_smtp route_data = ${lookup {${lc:$sender_address}} lsearch {/usr/local/etc/exim/freebsd_send}} Transport Section: freebsd_smtp: driver = smtp tls_certificate= tls_privatekey= tls_require_ciphers = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+AESGCM:EECDH:EDH+AESGCM:EDH+aRSA:HIGH:!MEDIUM:!LOW:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP:!PSK:!SRP:!DSS dkim_domain = dkim_selector = dkim_private_key= dnssec_request_domains = * hosts_require_auth = smtp.freebsd.org Authenticators: freebsd_plain: driver = plaintext public_name = PLAIN client_send = ^example/mail^examplePassword client_condition = ${if eq{$host}{smtp.freebsd.org}} .... Создайте файл [.filename]#/usr/local/etc/exim/freebsd_send# со следующим содержимым: [.programlisting] .... example@freebsd.org:smtp.freebsd.org::587 .... ==== [[mentors]] === Наставники Все новые разработчики получают наставника на первые несколько месяцев. Наставник отвечает за обучение подопечного правилам и соглашениям проекта и направляет его первые шаги в сообществе разработчиков. Наставник также несёт личную ответственность за действия подопечного в течение этого начального периода. Для коммиттеров: не коммитьте ничего без предварительного одобрения ментора. Задокументируйте это одобрение строкой `Approved by:` в сообщении коммита. Когда наставник решает, что подопечный освоил основы и готов к самостоятельной фиксации изменений, наставник объявляет об этом, выполняя коммит в [.filename]#mentors#. Этот файл находится в сиротской ветке [.filename]#admin# каждого репозитория. Подробная информация о том, как получить доступ к этим веткам, доступна в crossref:committers-guide[admin-branch, ветке "admin"]. [[pre-commit-review]] == Предварительная проверка перед коммитом Рецензирование кода — один из способов повышения качества программного обеспечения. Следующие рекомендации применимы к коммитам в ветку `main` (-CURRENT) репозитория `src`. Другие ветки, а также деревья `ports` и `docs` имеют собственные политики проверки и рецензирования, но данные рекомендации в целом применимы к коммитам, требующим рецензии: * Все нетривиальные изменения должны быть проверены перед их фиксацией в репозитории. * Рецензирование может проводиться по электронной почте, в Bugzilla, в Phabricator или с помощью другого механизма. По возможности рецензирование должно быть публичным. * Разработчик, ответственный за изменение кода, также обязан вносить все необходимые изменения, связанные с проверкой. * Рецензирование кода может быть итеративным процессом, который продолжается до тех пор, пока патч не будет готов к коммиту. В частности, после отправки патча на рецензирование, он должен получить явное подтверждение "выглядит хорошо" перед коммитом. Оно должно быть явным, и это может принимать любую форму, которая имеет смысл для метода рецензирования. * Тайм-ауты не являются заменой проверке. Иногда проверка кода занимает больше времени, чем хотелось бы, особенно для большого по объему функционала. Принятые способы ускорить проверку ваших патчей: * Проверяйте патчи других людей. Если вы помогаете, все будут более охотно делать то же самое для вас; доброжелательность — наша валюта. * Пингуйте патч. Если он срочный, укажите причины, почему для вас важно, чтобы этот патч был принят, и пингуйте каждые пару дней. Если он не срочный, общепринятая вежливая частота пинга — одна неделя. Помните, что вы просите у других профессиональных разработчиков их ценное время. * Обратитесь за помощью в списки рассылки, IRC и т.д. Другие могут либо помочь вам напрямую, либо предложить рецензента. * Разделите ваш патч на несколько меньших патчей, которые основываются друг на друге. Чем меньше ваш патч, тем выше вероятность, что кто-то бегло его просмотрит. + При внесении крупных изменений полезно держать это в уме с самого начала работы, поскольку разбиение крупных изменений на более мелкие часто бывает затруднительно постфактум. Разработчикам следует участвовать в проверках кода как в роли авторов, так и в роли рецензентов. Если кто-то любезно проверил ваш код, вы должны ответить тем же для кого-то другого. Обратите внимание, что хотя любой может проверить и дать обратную связь по патчу, только соответствующий эксперт по теме может одобрить изменение. Обычно это коммиттер, который регулярно работает с рассматриваемым кодом. В некоторых случаях может не оказаться эксперта по предметной области. В таких случаях достаточно проверки опытным разработчиком в сочетании с соответствующим тестированием. [[commit-log-message]] == Журнал сообщений о коммитах В этом разделе содержатся некоторые предложения и традиции по форматированию журналов коммитов. === Почему важны сообщения коммитов? При фиксации изменения в Git, Subversion или другой системе контроля версий (СКВ) вам предлагается написать текст с описанием коммита — сообщение о коммите. Насколько важно это сообщение о коммите? Стоит ли прилагать значительные усилия для его написания? Имеет ли значение, если вы просто напишете `исправлена ошибка`? У большинства проектов более одного разработчика, и они длятся в течение некоторого времени. Сообщения коммитов — это очень важный способ общения с другими разработчиками, как в настоящем, так и в будущем. В FreeBSD сотни активных разработчиков и сотни тысяч коммитов, охватывающих десятилетия истории. За это время сообщество разработчиков осознало, насколько ценны хорошие сообщения к коммитам; иногда эти уроки давались тяжело. Сообщения коммитов служат как минимум трем целям: * Сотрудничество с другими + Коммиты FreeBSD генерируют письма для различных списков рассылки. Они включают сообщение коммита вместе с копией самого патча. Сообщения коммитов также просматриваются с помощью команд, таких как `git log`. Это служит для информирования других разработчиков об изменениях, которые происходят; другой разработчик может захотеть протестировать изменение, может быть заинтересован в теме и захочет просмотреть более подробно, или может иметь свои собственные проекты, которые выиграют от взаимодействия. * Обеспечение возможности обнаружения изменений + В большом проекте с долгой историей может быть сложно найти интересующие изменения при расследовании проблемы или изменения в поведении. Подробные, детальные сообщения о коммитах позволяют искать изменения, которые могут быть релевантны. Например, `git log --since 1year --grep 'USB timeout'`. * Предоставление исторической документации + Сообщения о фиксации служат для документирования изменений для будущих разработчиков, возможно, спустя годы или десятилетия. Этот будущий разработчик может оказаться даже вами, первоначальным автором. Изменение, которое кажется очевидным сегодня, может оказаться совсем не таким в будущем. Команда `git blame` аннотирует каждую строку исходного файла информацией о изменении (хэш и тема коммита), которое её добавило. Теперь, когда важность хорошего сообщения о коммите в FreeBSD несомненна, вот его элементы: === Начните со строки темы Сообщения о коммите должны начинаться с однострочной темы, кратко описывающей изменение. Сама по себе тема должна позволять читателю быстро определить, представляет ли изменение интерес. === Сохраняйте заголовки краткими Строка темы должна быть максимально короткой, но при этом сохранять необходимую информацию. Это повышает эффективность просмотра журнала Git и позволяет команде `git log --oneline` отображать короткий хэш и тему на одной 80-символьной строке. Хорошим эмпирическим правилом является удержание длины ниже 67 символов, а по возможности — около 50 или меньше. === Добавьте к строке темы префикс с указанием компонента, если это применимо Если изменение относится к определённому компоненту, строка темы может быть предварена именем этого компонента и двоеточием (:). По возможности используйте тот же префикс, который применялся в предыдущих коммитах к тем же файлам. ✓ `foo: Add -k option to keep temporary data` Включите префикс в лимит 67 символов, чтобы `git log --oneline` избегал переноса. === Напишите первую букву темы с заглавной буквы Первая буква темы должна быть заглавной. Префикс, если он есть, с заглавной буквы не пишется, если это не требуется (например, `USB:` пишется с заглавной буквы). === Не заканчивайте строку темы знаками препинания Не ставьте точку или другие знаки препинания в конце. В этом отношении строка темы подобна заголовку в газете. === Разделите тему и тело письма пустой строкой Отделите тело от темы пустой строкой. Некоторые тривиальные коммиты не требуют тела и содержат только заголовок. ✓ `ls: Fix typo in usage text` === Ограничьте сообщения до 72 колонок `git log` и `git format-patch` делают отступ в сообщении коммита на четыре пробела. Перенос строк на 72-й колонке обеспечивает соответствующий отступ по правому краю. Ограничение сообщений 72 символами также удерживает сообщение коммита в форматированных патчах ниже рекомендованного RFC 2822 ограничения длины строки электронной почты в 78 символов. Это ограничение хорошо работает с различными инструментами, которые могут отображать сообщения коммитов; перенос строк может быть непоследовательным при большей длине строки. === Используйте настоящее время, повелительное наклонение Это способствует краткости тем и обеспечивает единообразие, включая автоматически генерируемые сообщения коммитов (например, создаваемые `git revert`). Это важно при чтении списка тем коммитов. Думайте о теме как о завершении фразы «при применении это изменение позволит...(when applied, this change will ...)». ✓ `foo: Implement the -k (keep) option` + ✗ `foo: Implemented the -k option` + ✗ `This change implements the -k option in foo` + ✗ `-k option added` === Сосредоточьтесь на том, что и почему, а не на том, как Объясните, чего достигает изменение и почему оно делается, а не как. Не предполагайте, что читатель знаком с проблемой. Объясните предысторию и мотивацию изменения. Включите данные тестирования производительности, если они у вас есть. Если в изменениях есть ограничения или неполные аспекты, опишите их в сообщении коммита. === Подумайте, можно ли части сообщения коммита оформить как комментарии в коде Иногда при написании сообщения коммита вы можете обнаружить, что пишете одно-два предложения, объясняющих какой-то сложный или запутанный аспект изменения. В таких случаях стоит подумать, будет ли полезно иметь это объяснение в виде комментария в самом коде. === Напишите сообщения коммитов для себя в будущем При написании сообщения коммита для изменения у вас есть весь контекст в голове — что вызвало изменение, альтернативные подходы, которые рассматривались и были отклонены, ограничения изменения и так далее. Представьте, что вы возвращаетесь к изменению через год или два, и напишите сообщение коммита таким образом, чтобы оно предоставило этот необходимый контекст. === Сообщения о коммитах должны быть самодостаточными Вы можете включать ссылки на сообщения в почтовых рассылках, сайты с результатами тестирования производительности или ссылки на проверки кода. Однако, сообщение о коммите должно содержать всю соответствующую информацию на случай, если эти ссылки станут недоступны в будущем. Аналогично, коммит может ссылаться на предыдущий коммит, например, в случае исправления ошибки или отката. Помимо идентификатора коммита (ревизии или хеша), включите строку темы из упомянутого коммита (или другую подходящую краткую ссылку). С каждой миграцией системы контроля версий (от CVS к Subversion и затем к Git) идентификаторы ревизий из предыдущих систем могут становиться трудными для отслеживания. === Укажите необходимые метаданные в нижней части Помимо включения информативного сообщения с каждым коммитом, может потребоваться некоторая дополнительная информация. Эта информация состоит из одной или нескольких строк, содержащих ключевое слово или фразу, двоеточие, табуляции для форматирования и затем дополнительную информацию. Для ключевых слов, где допустимы множественные значения (например, `PR:` со списком PR через запятую), разрешается использовать одно и то же ключевое слово несколько раз, чтобы избежать неоднозначности или улучшить читаемость. Ключевые слова или фразы: [.informaltable] [cols="20%,80%", frame="none"] |=== |`PR:` |Номер отчета о проблеме (если есть), на который влияет данный коммит (обычно путем закрытия). Можно указать несколько номеров PR в одной строке, разделяя их запятыми или пробелами. |`Reported by:` |Имя и адрес электронной почты лица, сообщившего о проблеме; для разработчиков — только имя пользователя в кластере FreeBSD. Обычно используется, когда нет PR, например, если проблема была сообщена в почтовой рассылке. |`Submitted by:` + (deprecated) |Это устарело в git; отправляемые патчи должны указывать автора с помощью `git commit --author` с указанием полного имени и действительного email. |`Reviewed by:` a| Имя и адрес электронной почты человека или людей, которые проверили изменение; для разработчиков достаточно указать имя пользователя в кластере FreeBSD. Если патч был отправлен в список рассылки для проверки и получил положительный отзыв, то укажите только название списка. Если рецензент не является участником проекта, укажите имя, электронную почту и, если это порт, внешнюю роль, например, сопровождающего: Проверено разработчиком: [source,shell] .... Reviewed by: username .... Проверено сопровождающим портов, не являющимся разработчиком: [source,shell] .... Reviewed by: Full Name (maintainer) .... |`Tested by:` |Имя и адрес электронной почты человека или людей, которые проверили изменение; для разработчиков — просто имя пользователя в кластере FreeBSD. |`Discussed with:` |Имя и адрес электронной почты человека или людей, которые внесли вклад в исправление, предоставив содержательную обратную связь; для разработчиков — просто имя пользователя в кластере FreeBSD. Обычно используется для упоминания тех, кто не проводил явного рецензирования, тестирования или одобрения изменения, но тем не менее участвовал в обсуждении, связанном с изменением, что привело к улучшениям и лучшему пониманию его влияния на проект FreeBSD. |`Approved by:` a| Имя и адрес электронной почты лица или лиц, утвердивших изменение; для разработчиков — просто имя пользователя в кластере FreeBSD. Есть несколько случаев, когда утверждение является обычной практикой: * когда новый коммиттер находится под наставничеством * коммиты в область дерева, указанную в файле LOCKS (src) * во время цикла выпуска * коммиты в репозиторий, где у вас нет права на коммит (например, коммиттер src делает коммит в docs) * коммиты в порт, поддерживаемый кем-то другим Во время наставничества получите одобрение наставника перед коммитом. Укажите имя пользователя наставника в этом поле и отметьте, что он является наставником: [source,shell] .... Approved by: имя-пользователя-наставника (mentor) .... Если коммиты были утверждены командой, укажите название команды, за которым в скобках следует имя пользователя утверждающего. Например: [source,shell] .... Approved by: re (имя-пользователя) .... |`Obtained from:` |Название проекта (если есть), из которого был получен код. Не используйте эту строку для указания имени отдельного человека. |`Fixes:` |Короткий хэш Git и заголовок коммита, который исправлен этим изменением, как возвращается командой `git log -n 1 --pretty=format:'%h ("%s")' GIT-COMMIT-HASH`. Мы включаем заголовок коммита, чтобы можно было найти указанный коммит даже в случае, если будущая миграция системы контроля версий сделает ссылки по хэшу недействительными. |`MFC after:` |Чтобы получить напоминание по электронной почте о запланированном MFC через определенное время, укажите количество дней, недель или месяцев, после которых планируется выполнить MFC. |`MFC to:` |Если коммиту должно быть сделано слияние в подмножество стабильных веток, укажите названия веток. |`MFH:` |Если коммиту должно быть сделано слияние в квартальную ветку портов, укажите квартальную ветку. Например, `2021Q2`. |`Relnotes:` |Если изменение является кандидатом для включения в примечания к выпуску следующей версии из ветки, установите значение `yes`. +|Кандидатами являются изменения, видимые пользователям, новые функции, нарушения совместимости и т.д. +|Если вы забыли установить эту строку или хотите предоставить более подробную информацию, добавьте запись в файл `RELNOTES` в корне дерева исходного кода src. +|Файл `RELNOTES` используется для формирования примечаний к выпуску для следующего релиза. +|Не используйте строку `Relnotes:` для описания изменения: ее единственное допустимое значение - `yes`. |`Security:` |Если изменение связано с уязвимостью или угрозой безопасности, укажите одну или несколько ссылок либо описание проблемы. По возможности включите URL VuXML или идентификатор CVE. |`Event:` |Описание события, в рамках которого был выполнен этот коммит. Если это повторяющееся событие, добавьте год или даже месяц. Например, это может быть `FooBSDcon 2019`. Идея этой строки — отдать должное конференциям, встречам и другим подобным мероприятиям, а также показать, что их проведение полезно. Пожалуйста, не используйте строку `Sponsored by:` для этого, так как она предназначена для организаций, спонсирующих определённые функции, или разработчиков, работающих над ними. |`Sponsored by:` |Организации, спонсировавшие это изменение (если есть). Разделяйте несколько организаций запятыми. Если только часть работы была спонсирована или разные суммы спонсорской поддержки были предоставлены разным авторам, укажите соответствующую информацию в скобках после каждого имени спонсора. Например, `Example.com (alice, code refactoring), Wormulon (bob), Momcorp (cindy)` показывает, что Alice была спонсирована Example.com для рефакторинга кода, в то время как Wormulon спонсировал работу Bob, а Momcorp спонсировал работу Cindy. Другие авторы либо не были спонсированы, либо решили не указывать спонсорство. |`Pull Request:` |Это изменение было отправлено как запрос на принятие изменений (pull request) или запрос на слияние (merge request) в один из публичных Git-репозиториев FreeBSD только для чтения. Оно должно включать полный URL запроса на включение изменений, так как они часто выполняют роль рецензий кода. Например: `https://github.com/freebsd/freebsd-src/pull/745` |`Co-authored-by:` |Имя и адрес электронной почты дополнительного автора коммита. GitHub содержит подробное описание трейлера Co-authored-by по адресу https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors. |`Signed-off-by:` |ID подтверждает соответствие требованиям https://developercertificate.org/ |`Differential Revision:` |Полный URL обзора в Phabricator. Эта строка __должна быть последней строкой__. Например: `https://reviews.freebsd.org/D1708`. |=== .Журнал изменений для коммита на основе PR [example] ==== Коммит основан на патче из PR, предоставленного Джоном Смитом. Поле "PR" в сообщении коммита заполнено. [.programlisting] .... ... PR: 12345 .... Участник устанавливает автора патча с помощью `git commit --author "John Smith "`. ==== .Журнал изменений для коммита, требующего проверки [example] ==== Вносятся изменения в систему виртуальной памяти. После отправки патчей в соответствующий список рассылки (в данном случае, `freebsd-arch`) и утверждения изменений. [.programlisting] .... ... Reviewed by: -arch .... ==== .Журнал изменений для коммита, требующего одобрения [example] ==== Закоммитить порт после согласования с указанным MAINTAINER, который дал добро на коммит. [.programlisting] .... ... Approved by: abc (maintainer) .... Где _abc_ — имя учётной записи лица, одобрившего коммит. ==== .Журнал изменений для коммита, вносящего код из OpenBSD [example] ==== Коммит некоторого кода на основе работы, выполненной в проекте OpenBSD. [.programlisting] .... ... Obtained from: OpenBSD .... ==== .Журнал коммитов для правки в FreeBSD-CURRENT с запланированным коммитом в FreeBSD-STABLE в последующее время. [example] ==== Коммит некоторого кода, которому будет сделано слияние из ветки FreeBSD-CURRENT в ветку FreeBSD-STABLE через две недели. [.programlisting] .... ... MFC after: 2 weeks .... Где _2_ — количество дней, недель или месяцев, после которых запланировано MFC. Вариант _weeks_ может быть — `day`, `days`, `week`, `weeks`, `month`, `months`. ==== Часто необходимо комбинировать их. Рассмотрим ситуацию, когда пользователь отправил PR с кодом из проекта NetBSD. Разработчик, просматривая PR, видит, что это не та часть дерева, с которой он обычно работает, поэтому он отправляет изменение на рецензирование в список рассылки `arch`. Поскольку изменение сложное, разработчик решает отложить MFC на месяц, чтобы обеспечить достаточное тестирование. Дополнительная информация, которую нужно включить в коммит, будет выглядеть примерно так .Пример объединённого журнала коммитов [example] ==== [.programlisting] .... PR: 54321 Reviewed by: -arch Obtained from: NetBSD MFC after: 1 month Relnotes: yes .... ==== [[pref-license]] == Предпочтительная лицензия для новых файлов Полная политика лицензирования проекта FreeBSD доступна по ссылке link:https://www.FreeBSD.org/internal/software-license/[https://www.FreeBSD.org/internal/software-license]. Остальная часть этого раздела предназначена для того, чтобы помочь вам начать работу. Как правило, если сомневаетесь — спрашивайте. Дать совет гораздо проще, чем исправлять дерево исходного кода. Проект FreeBSD предлагает и использует следующий текст в качестве предпочтительной схемы лицензирования: [.programlisting] .... /* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) [year] [your name] * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * [id for your version control system, if any] */ .... Проект FreeBSD настоятельно не рекомендует использовать так называемую «рекламную оговорку» в новом коде. Из-за большого числа участников проекта FreeBSD соблюдение этой оговорки стало затруднительным для многих коммерческих вендоров. Если ваш код в дереве содержит рекламную оговорку, пожалуйста, рассмотрите возможность её удаления. Более того, пожалуйста, рассмотрите возможность использования вышеуказанной лицензии для вашего кода. Проект FreeBSD не приветствует полностью новые лицензии и вариации стандартных лицензий. Новые лицензии требуют одобрения {core-email} для размещения в репозитории `src`. Чем больше различных лицензий используется в дереве, тем больше проблем это создаёт для тех, кто желает использовать этот код, обычно из-за непредвиденных последствий плохо сформулированной лицензии. Политика проекта требует, чтобы код под некоторыми не-BSD лицензиями размещался только в определённых разделах репозитория, а в некоторых случаях компиляция должна быть условной или даже отключена по умолчанию. Например, ядро GENERIC должно компилироваться только под лицензиями, идентичными или существенно схожими с лицензией BSD. Программное обеспечение под лицензиями GPL, APSL, CDDL и т.п. не должно компилироваться в GENERIC. Разработчикам следует помнить, что в открытом исходном коде правильное понимание «открытости» так же важно, как и правильное понимание «исходного кода», поскольку неправильное обращение с интеллектуальной собственностью имеет серьёзные последствия. Любые вопросы или опасения следует немедленно доводить до сведения основной команды. [[tracking.license.grants]] == Отслеживание лицензий, предоставленных проекту FreeBSD Различное программное обеспечение или данные существуют в репозиториях, где проект FreeBSD получил специальную лицензию для их использования. Примером могут служить шрифты Terminus для использования с man:vt[4]. Здесь автор Димитар Жеков разрешил нам использовать шрифт "Terminus BSD Console" под лицензией BSD с двумя пунктами, а не под обычной Open Font License, которую он обычно применяет. Очевидно, разумно вести учет всех подобных разрешений лицензий. С этой целью {core-email} решил сохранять их архив. Каждый раз, когда проекту FreeBSD предоставляется специальная лицензия, мы требуем уведомлять {core-email}. Разработчики, участвующие в организации такого разрешения, пожалуйста, присылайте детали на {core-email}, включая: * Контактные данные лиц или организаций, предоставляющих специальную лицензию. * Какие файлы, каталоги и т.д. в репозиториях охватываются предоставлением лицензии, включая номера ревизий, в которые был добавлен любой материал с особыми условиями лицензирования. * Дата вступления лицензии в силу. Если не согласовано иное, это будет дата выдачи лицензии авторами соответствующего программного обеспечения. * Текст лицензии. * Примечание о любых ограничениях, исключениях или особых условиях, которые применяются конкретно к использованию лицензионных материалов в FreeBSD. * Любая другая соответствующая информация. Как только {core-email} убедится, что собраны все необходимые данные и они корректны, секретарь отправит подтверждение о получении, подписанное PGP, включая детали лицензии. Это подтверждение будет постоянно архивироваться и служить нашим постоянным свидетельством о предоставлении лицензии. Архив лицензий должен содержать только сведения о предоставленных лицензиях; это не место для обсуждений вопросов лицензирования или других тем. Доступ к данным в архиве лицензий будет предоставляться по запросу в {core-email}. [[spdx.tags]] == Теги SPDX в дереве Проект использует теги https://spdx.dev[SPDX] в нашей исходной базе. На данный момент эти теги выделены отступами, чтобы автоматизированные средства могли программно извлекать лицензионные условия. Все теги _SPDX-License-Identifier_ в дереве следует считать информативными. Все файлы в дереве исходных кодов FreeBSD с этими тегами также содержат копию лицензии, регулирующей использование данного файла. Если возникает противоречие, руководствоваться следует дословным текстом лицензии. Проект старается следовать https://spdx.github.io/spdx-spec/v2.2.2/[Спецификации SPDX, версия 2.2]. Инструкцию, как помечать исходные файлы, и допустимые алгебраические выражения можно найти в https://spdx.github.io/spdx-spec/v2.2.2/SPDX-license-expressions/[Приложении D] и https://spdx.github.io/spdx-spec/v2.2.2/using-SPDX-short-identifiers-in-source-files/[Приложении E]. Проект берет идентификаторы из списка допустимых https://spdx.org/licenses/[кратких лицензионных идентификаторов] SPDX. Проект использует только тег _SPDX-License-Identifier_. По состоянию на март 2021 года примерно 25 000 из 90 000 файлов в дереве были помечены. [[developer.relations]] == Отношения с разработчиками При работе непосредственно с вашим собственным кодом или с кодом, который уже хорошо зарекомендовал себя как ваша зона ответственности, вероятно, нет особой необходимости согласовывать действия с другими коммиттерами перед внесением изменений. Это же относится и к исправлению ошибок в явно заброшенных частях системы (к сожалению, такие области существуют). При изменении частей системы, которые поддерживаются (формально или неформально), рассмотрите возможность запроса рецензирования, как это делал бы разработчик до получения прав коммиттера. Для портов свяжитесь с сопровождающим, указанным в переменной `MAINTAINER` в файле [.filename]#Makefile#. Чтобы определить, поддерживается ли определённая часть дерева, проверьте файл MAINTAINERS в корне дерева. Если там никого не указано, просмотрите историю изменений, чтобы увидеть, кто вносил изменения в прошлом. Чтобы вывести список имён и адресов электронной почты всех авторов коммитов для заданного файла за последние 2 года, а также количество коммитов каждого автора, отсортированных по убыванию количества коммитов, используйте: [source, shell] ---- % git -C /path/to/repo shortlog -sne --since="2 years" -- relative/path/to/file ---- Если запросы остаются без ответа или коммиттер иным образом демонстрирует отсутствие интереса к затронутой области, можно смело выполнять коммит. [IMPORTANT] ==== Избегайте отправки личных писем сопровождающим. Других людей может заинтересовать не только итоговый результат, но и обсуждение. ==== Если есть какие-либо сомнения относительно коммита по любой причине, необходимо провести его рецензирование перед выполнением. Лучше получить критику сразу, чем когда он станет частью репозитория. Если коммит вызывает споры, возможно, стоит рассмотреть возможность отката изменений до разрешения вопроса. Помните, что с системой контроля версий мы всегда можем вернуть всё обратно. Не оспаривайте намерения других. Если они видят иное решение проблемы или даже иную проблему, скорее всего, это не потому, что они глупы, имеют сомнительное происхождение или пытаются разрушить чужой труд, личный имидж или FreeBSD, а просто потому, что у них иной взгляд на мир. Разное — это хорошо. Честно выражайте несогласие. Обосновывайте свою позицию по её достоинствам, будьте честны относительно возможных недостатков и будьте открыты для понимания их решения или даже их видения проблемы. Примите исправление. Все мы не безгрешны. Когда вы совершили ошибку, извинитесь и продолжайте жить дальше. Не корите себя и уж тем более не вините других за свою ошибку. Не тратьте время на смущение или взаимные обвинения — просто исправьте проблему и двигайтесь дальше. Попросите о помощи. Ищите (и предоставляйте) рецензии коллег. Одно из преимуществ открытого программного обеспечения заключается в большом количестве проверяющих; но это не работает, если никто не проверяет код. [[if-in-doubt]] == Если сомневаетесь... Если вы в чем-то не уверены, будь то технический вопрос или соглашение по проекту, обязательно спросите. Если вы промолчите, вы никогда не продвинетесь вперед. Если вопрос связан с технической проблемой, задайте его в публичных списках рассылки. Удержитесь от соблазна написать лично тому, кто знает ответ. Так каждый сможет извлечь пользу из вопроса и ответа. Для административных вопросов и вопросов, связанных с конкретным проектом, обращайтесь в следующем порядке: * Ваш наставник или бывший наставник. * Опытный коммиттер — по IRC, электронной почте и т.д. * Любая команда с ролью ("hat"), так как в ней вам могут дать окончательный ответ. * Если всё ещё не уверены, спросите на {developers-name}. Когда ваш вопрос будет решён, если никто не указал вам на документацию, содержащую ответ на ваш вопрос, задокументируйте его, так как у других возникнет тот же вопрос. [[bugzilla]] == Bugzilla Проект FreeBSD использует Bugzilla для отслеживания ошибок и запросов на изменения. Если вы исправили проблему или реализовали предложение из базы данных PR, обязательно закройте PR. Также будет вежливо, если вы найдёте время закрыть другие PR, связанные с вашими коммитами. Коммиттеры с учётными записями Bugzilla не на ``FreeBSD.org`` могут объединить старую учётную запись с учётной записью `FreeBSD.org`, выполнив следующие шаги: [.procedure] ==== . Войдите, используя старую учетную запись. . Открыть новую ошибку. Выбрать `Services` в качестве продукта и `Bug Tracker` в качестве компонента. В описании ошибки перечислите аккаунты, которые нужно объединить. . Войдите, используя учетную запись `FreeBSD.org`, и оставьте комментарий к только что созданной ошибке, чтобы подтвердить владение. Дополнительные сведения о том, как сгенерировать или установить пароль для вашей учетной записи `FreeBSD.org`, см. в crossref:committers-guide[kerberos-ldap, Kerberos и LDAP веб-пароль для кластера FreeBSD]. . Если необходимо объединить более двух учетных записей, оставьте комментарии от каждой из них. ==== Вы можете узнать больше о Bugzilla на: * extref:{pr-guidelines}[Рекомендации по работе с сообщениями о проблемах FreeBSD] * link:https://www.FreeBSD.org/support/[https://www.FreeBSD.org/support] [[phabricator]] == Phabricator Проект FreeBSD использует https://reviews.freebsd.org[Phabricator] для запросов на рецензирование кода. Подробности можно найти на https://wiki.freebsd.org/Phabricator[странице Phabricator в вики]. Пожалуйста, используйте команду `git arc`, предоставляемую `devel/freebsd-git-devtools` (установите порт или пакет, затем введите `git help arc` для получения документации), для создания и обновления рецензий в Phabricator. Это упростит другим процесс проверки и тестирования ваших патчей. Коммиттеры с учётными записями Phabricator не на ``FreeBSD.org`` могут переименовать старую учётную запись в ``FreeBSD.org``, выполнив следующие шаги: [.procedure] ==== . Измените адрес электронной почты вашей учетной записи Phabricator на ваш `FreeBSD.org` email. . Открыть новую ошибку в нашем трекере ошибок, используя вашу учетную запись `FreeBSD.org`, см. crossref:committers-guide[bugzilla, Bugzilla] для получения дополнительной информации. Выберите `Services` в качестве продукта и `Code Review` в качестве компонента. В описании ошибки запросите переименование вашей учетной записи Phabricator и укажите ссылку на вашего пользователя Phabricator. Например, `https://reviews.freebsd.org/p/bob_example.com/` ==== [IMPORTANT] ==== Учетные записи Phabricator не могут быть объединены, пожалуйста, не создавайте новую учетную запись. ==== [[people]] == Кто есть кто Помимо хранителей репозиториев, есть и другие участники проекта FreeBSD и команды, с которыми вам, скорее всего, предстоит познакомиться в роли коммиттера. Кратко и далеко не исчерпывающе, вот они: `{doceng}`:: doceng — это группа, ответственная за инфраструктуру сборки документации, утверждение новых коммиттеров документации и обеспечение актуальности веб-сайта FreeBSD и документации на FTP-сайте в соответствии с деревом Subversion. Она не является органом по разрешению конфликтов. Подавляющее большинство обсуждений, связанных с документацией, происходит в рассылке {freebsd-doc}. Подробнее о команде doceng можно узнать в её https://www.FreeBSD.org/internal/doceng/[уставе]. Коммиттеры, заинтересованные в работе над документацией, должны ознакомиться с руководством extref:{fdp-primer}[Проект документации FreeBSD: введение для новых участников]. `{re-members}`:: Вот члены команды `{re}`. Эта команда отвечает за установку сроков выпуска и контроль процесса выпуска. Во время заморозки кода, инженеры выпуска обладают окончательным правом принятия решений по всем изменениям в системе для ветки, ожидающей статуса выпуска. Если у вас есть что-то, что вы хотите влить (merge) из FreeBSD-CURRENT в FreeBSD-STABLE (какими бы ни были их значения в любой момент времени), именно с этими людьми нужно обсудить этот вопрос. `{so}`:: `{so-name}` — это link:https://www.FreeBSD.org/security/[ответственный за безопасность FreeBSD], который курирует работу `{security-officer}`. {committers-name}:: {dev-src-all}, {dev-ports-all} и {dev-doc-all} — это списки рассылки, которые система управления версиями использует для отправки сообщений о коммитах. _Никогда_ не отправляйте письма напрямую в эти списки. Отправляйте ответы в этот список только в том случае, если они короткие и непосредственно связаны с коммитом. {developers-name}:: Все коммиттеры подписаны на список рассылки -developers. Этот список был создан для обсуждения вопросов, связанных с сообществом коммиттеров. Примеры включают голосования Core, объявления и т.д. + `{developers-name}` предназначен исключительно для использования коммиттерами FreeBSD. Для разработки FreeBSD коммиттеры должны иметь возможность открыто обсуждать вопросы, которые будут решены до их публичного объявления. Откровенные обсуждения работы в процессе не подходят для открытой публикации и могут навредить FreeBSD. + Все коммиттеры FreeBSD обязаны не публиковать и не пересылать сообщения из {developers-name} за пределы списка рассылки без разрешения всех авторов. Нарушители будут удалены из {developers-name}, что приведёт к приостановке привилегий на коммит. Повторные или вопиющие нарушения могут привести к постоянному лишению привилегий на коммит. + Этот список _не_ предназначен для обзора кода или каких-либо технических обсуждений. На самом деле, использование его в таком качестве вредит проекту FreeBSD, так как создаёт впечатление закрытого списка, где общие решения, затрагивающие всех пользователей FreeBSD, принимаются без "открытости". И последнее, но не менее важное: __никогда, ни при каких обстоятельствах, не отправляйте письмо на {developers-name} с копией (CC:/BCC:) на другой список FreeBSD__. Никогда не отправляйте письмо на другой список рассылки FreeBSD с копией (CC:/BCC:) на {developers-name}. Это может значительно снизить пользу от данного списка. [[ssh.guide]] == Руководство по быстрому началу работы с SSH [.procedure] ==== . Если вы не хотите каждый раз вводить пароль при использовании man:ssh[1] и используете ключи для аутентификации, man:ssh-agent[1] создан для вашего удобства. Если вы хотите использовать man:ssh-agent[1], убедитесь, что запускаете его перед запуском других приложений. Например, пользователи X обычно делают это в [.filename]#.xsession# или [.filename]#.xinitrc#. Подробности см. в man:ssh-agent[1]. . Сгенерируйте пару ключей с помощью man:ssh-keygen[1]. Пара ключей окажется в вашем каталоге [.filename]#$HOME/.ssh/#. + [IMPORTANT] ====== Поддерживаются только ключи ECDSA, Ed25519 или RSA. ====== . Отправьте ваш открытый ключ ([.filename]#$HOME/.ssh/id_ecdsa.pub#, [.filename]#$HOME/.ssh/id_ed25519.pub# или [.filename]#$HOME/.ssh/id_rsa.pub#) человеку, который настраивает вас как коммиттера, чтобы его можно было добавить в [.filename]#yourlogin# в [.filename]#/etc/ssh-keys/# на `freefall`. ==== Теперь man:ssh-add[1] можно использовать для аутентификации один раз за сеанс. Он запрашивает парольную фразу для закрытого ключа и затем сохраняет её в агенте аутентификации (man:ssh-agent[1]). Используйте `ssh-add -d` для удаления ключей, сохранённых в агенте. Проверка с помощью простой удалённой команды: `ssh freefall.FreeBSD.org ls /usr`. Для получения дополнительной информации см. package:security/openssh-portable[], man:ssh[1], man:ssh-add[1], man:ssh-agent[1], man:ssh-keygen[1] и man:scp[1]. Для информации о добавлении, изменении или удалении ключей man:ssh[1], см. https://wiki.freebsd.org/clusteradm/ssh-keys[эту статью]. [[coverity]] == Доступность Coverity(R) для коммиттеров FreeBSD Все разработчики FreeBSD могут получить доступ к результатам анализа Coverity для всего программного обеспечения проекта FreeBSD. Все, кто заинтересован в доступе к результатам автоматического анализа Coverity, могут зарегистрироваться на http://scan.coverity.com/[Coverity Scan]. В вики FreeBSD есть мини-руководство для разработчиков, которые заинтересованы в работе с отчетами анализа Coverity(R): https://wiki.freebsd.org/CoverityPrevent[https://wiki.freebsd.org/CoverityPrevent]. Обратите внимание, что это мини-руководство доступно только разработчикам FreeBSD, поэтому если вы не можете открыть эту страницу, вам нужно будет попросить добавить вас в соответствующий список доступа к вики. Наконец, все разработчики FreeBSD, которые собираются использовать Coverity(R), всегда могут запросить дополнительные детали и информацию об использовании, задав любые вопросы в списке рассылки разработчиков FreeBSD. [[rules]] == Большой список правил коммиттеров FreeBSD Все участники проекта FreeBSD должны соблюдать _Кодекс поведения_, доступный по ссылке link:https://www.FreeBSD.org/internal/code-of-conduct/[https://www.FreeBSD.org/internal/code-of-conduct]. Как коммиттеры, вы представляете публичное лицо проекта, и ваше поведение оказывает существенное влияние на его общественное восприятие. Это руководство расширяет разделы _Кодекса поведения_, относящиеся к коммиттерам. . Уважайте других коммиттеров. . Уважайте других участников. . Обсудите любые значительные изменения _перед_ коммитом. . Уважайте существующих сопровождающих (если они указаны в поле `MAINTAINER` в файле [.filename]#Makefile# или в файле [.filename]#MAINTAINER# в корневом каталоге). . Любое оспариваемое изменение должно быть отменено до разрешения спора, если этого потребует сопровождающий. Изменения, связанные с безопасностью, могут перекрыть пожелания сопровождающего по усмотрению Ответственного за безопасность. . Изменения попадают в FreeBSD-CURRENT до FreeBSD-STABLE, если только это явно не разрешено инженером выпуска или если они не применимы к FreeBSD-CURRENT. Любое нетривиальное или не срочное изменение, которое применимо, также должно оставаться в FreeBSD-CURRENT как минимум 3 дня перед слиянием, чтобы его можно было достаточно протестировать. Инженер выпуска имеет те же полномочия в отношении ветки FreeBSD-STABLE, что и сопровождающий, согласно правилу №5. . Не устраивайте публичные разборки с другими разработчиками; это выглядит плохо. . Соблюдайте все периоды заморозки кода и своевременно читайте рассылки `committers` и `developers`, чтобы знать, когда действует заморозка кода. . Если сомневаетесь в каком-либо действии — сначала спросите! . Проверьте свои изменения перед их применением. . Не вносите изменения в предоставленное программное обеспечение без _явного_ одобрения соответствующих сопровождающих. Как уже отмечалось, нарушение некоторых из этих правил может стать основанием для временного лишения прав на коммиты или, при повторных нарушениях, для их постоянного отзыва. Отдельные члены Основной Команды (Core Team) имеют право временно приостановить права на коммиты до тех пор, пока основная команда в полном составе не рассмотрит вопрос. В случае «чрезвычайной ситуации» (например, если коммиттер наносит ущерб репозиторию), временное лишение прав может также быть осуществлено хранителями репозитория. Только Основная Команда 2/3 большинства голосов имеет право приостановить права на коммиты сроком более чем на неделю или отозвать их полностью. Это правило существует не для того, чтобы сделать основную команду сборищем жестоких диктаторов, которые могут избавляться от коммиттеров так же легко, как от пустых банок из-под газировки, а чтобы дать проекту своего рода предохранительный клапан. Если кто-то выходит из-под контроля, важно иметь возможность немедленно принять меры, а не быть парализованными дискуссией. Во всех случаях коммиттер, чьи права приостановлены или отозваны, имеет право на «слушание» в основной команде, где определяется общая продолжительность приостановки. Коммиттер, чьи права приостановлены, также может запросить пересмотр решения через 30 дней и каждые 30 дней после этого (если общий срок приостановки не менее 30 дней). Коммиттер, чьи права были полностью отозваны, может запросить пересмотр по истечении 6 месяцев. Эта политика пересмотра _строго неформальна_, и во всех случаях основная команда оставляет за собой право как удовлетворить, так и проигнорировать запрос на пересмотр, если считает первоначальное решение правильным. Во всех остальных аспектах работы проекта основная команда является подмножеством коммиттеров и связана __теми же правилами__. Тот факт, что кто-то входит в основную команду, не означает, что им позволено выходить за рамки обозначенных здесь границ; «особые полномочия» основной команды активируются только при действиях в качестве группы, а не индивидуально. Как отдельные лица, члены основной команды — это прежде всего коммиттеры, и только во вторую очередь — основная команда. === Подробности [[respect]] . Уважайте других коммиттеров. + Это означает, что вы должны относиться к другим коммиттерам как к коллегам-разработчикам, каковыми они и являются. Несмотря на наши периодические попытки доказать обратное, коммиттером не становятся по глупости, и ничто не раздражает больше, чем когда коллеги относятся к вам именно так. Независимо от того, испытываем ли мы всегда уважение друг к другу или нет (у всех бывают плохие дни), мы должны _относиться_ к другим коммиттерам с уважением всегда — как на публичных форумах, так и в личной переписке. + Способность долгосрочного сотрудничества — это самое ценное достояние проекта, гораздо более важное, чем любые изменения в коде, и превращение споров о коде в проблемы, влияющие на нашу способность гармонично работать вместе, ни при каких обстоятельствах не стоит того. + Для соблюдения этого правила не отправляйте электронные письма, когда вы злитесь или ведёте себя таким образом, который может показаться другим излишне конфронтационным. Сначала успокойтесь, затем подумайте, как наиболее эффективно донести свою точку зрения, чтобы убедить других в своей правоте, а не просто выпустить пар для кратковременного облегчения за счёт долгосрочного конфликта. Иначе это обернётся не только крайне нерациональной тратой сил, но и тем, что повторяющиеся проявления публичной агрессии, мешающие нашей совместной работе, будут строго пресекаться руководством проекта и могут привести к приостановке или лишению ваших прав на коммит. Руководство проекта будет учитывать как публичные, так и приватные сообщения, представленные на его рассмотрение. Оно не будет требовать раскрытия приватной переписки, но примет её во внимание, если участники, вовлечённые в жалобу, предоставят её добровольно. + Всё это никогда не является вариантом, который руководство проекта хоть сколько-нибудь радует, но единство важнее. Никакое количество кода или полезных советов не стоит того, чтобы этим пожертвовать. . Уважайте других участников. + Вы не всегда были коммиттером. Когда-то вы были контрибьютором. Помните об этом всегда. Вспомните, каково это — пытаться получить помощь и внимание. Не забывайте, что ваша работа в качестве контрибьютора была для вас очень важна. Вспомните, каково это. Не отговаривайте, не принижайте и не унижайте контрибьюторов. Относитесь к ним с уважением. Они — наши будущие коммиттеры. Они так же важны для проекта, как и коммиттеры. Их вклад так же важен и значим, как и ваш. В конце концов, вы сами сделали множество вкладов, прежде чем стали коммиттером. Всегда помните об этом. + Учитывайте моменты, поднятые в разделе crossref:committers-guide[respect,Уважайте других коммиттеров], и применяйте их также к контрибьюторам. . Обсудите любые значительные изменения _перед_ коммитом. + Репозиторий — это не место, где изменения первоначально отправляются на проверку корректности или обсуждаются, сначала это происходит в почтовых рассылках или с помощью сервиса Phabricator. Коммит произойдет только после того, как будет достигнуто некое подобие консенсуса. Это не означает, что требуется разрешение для исправления каждой очевидной синтаксической ошибки или опечатки на странице руководства, просто полезно развить чутьё, когда предлагаемое изменение не столь очевидно и требует предварительного обсуждения. Люди действительно не против масштабных изменений, если результат явно лучше того, что было раньше, им просто не нравится, когда эти изменения становятся _неожиданностью_. Самый лучший способ убедиться, что всё идёт по правильному пути, — это провести рецензирование кода одним или несколькими другими коммиттерами. + Если сомневаетесь, запросите рецензию! . Уважайте существующих сопровождающих, если они указаны. + Многие части FreeBSD не "являются чьей-то собственностью" в том смысле, что конкретный человек вскочит и начнёт кричать, если вы внесёте изменения в "его" область, но всё же лучше сначала проверить. Одно из используемых соглашений — добавление строки `maintainer` в [.filename]#Makefile# для любого пакета или поддерева, за которые активно отвечает один или несколько людей; см. extref:{developers-handbook}policies[Рекомендации и политики дерева исходного кода, policies] для документации по этому поводу. Если у участков кода есть несколько сопровождающих, изменения в затронутых областях, внесённые одним сопровождающим, должны быть проверены хотя бы одним другим сопровождающим. В случаях, когда "сопровождение" чего-либо неясно, посмотрите логи репозитория для соответствующих файлов и проверьте, работал ли кто-то недавно или преимущественно в этой области. . Любое оспариваемое изменение должно быть отменено до разрешения спора, если этого потребует сопровождающий. Изменения, связанные с безопасностью, могут перекрыть пожелания сопровождающего по усмотрению Ответственного за безопасность. + Это может быть трудно принять во время конфликтов (когда каждая сторона убеждена, что она права, конечно), но система контроля версий делает ненужным продолжение споров, когда гораздо проще просто отменить спорное изменение, успокоить всех и затем попытаться выяснить, как лучше поступить. Если окажется, что изменение всё-таки было правильным, его можно легко вернуть. Если же нет, то пользователям не придётся мириться с ошибочным изменением в дереве, пока все активно обсуждают его достоинства. Люди _очень_ редко требуют отмены изменений в репозитории, поскольку обсуждение обычно выявляет плохие или спорные изменения ещё до коммита, но в таких редких случаях отмена должна производиться без споров, чтобы можно было сразу перейти к выяснению, было ли изменение ошибочным или нет. . Изменения вносятся в FreeBSD-CURRENT до FreeBSD-STABLE, если это не разрешено специально инженером выпуска или если они не применимы к FreeBSD-CURRENT. Любое нетривиальное или несрочное изменение, которое применимо, также должно оставаться в FreeBSD-CURRENT как минимум 3 дня перед слиянием, чтобы его можно было достаточно протестировать. Инженер выпуска имеет те же полномочия в отношении ветки FreeBSD-STABLE, как указано в правиле №5. + Это ещё один вопрос, о котором не стоит спорить, поскольку инженер выпуска несёт окончательную ответственность (и получает по шапке), если изменение окажется неудачным. Пожалуйста, уважайте это и оказывайте инженеру выпуска полное сотрудничество, когда дело касается ветки FreeBSD-STABLE. Управление FreeBSD-STABLE может часто казаться излишне консервативным для случайного наблюдателя, но также стоит помнить, что консерватизм — это отличительная черта FreeBSD-STABLE, и там действуют другие правила, чем в FreeBSD-CURRENT. Также нет смысла в том, чтобы FreeBSD-CURRENT был испытательным полигоном, если изменения немедленно переносятся в FreeBSD-STABLE. Изменения должны быть протестированы разработчиками FreeBSD-CURRENT, поэтому дайте некоторое время перед слиянием, если только исправление в FreeBSD-STABLE не является критическим, срочным или настолько очевидным, что дальнейшее тестирование не требуется (исправления опечаток в руководствах, очевидные исправления ошибок/опечаток и т.д.). Другими словами, руководствуйтесь здравым смыслом. + Изменения в ветках безопасности (например, `releng/9.3`) должны быть одобрены членом группы — `{security-officer}` или, в некоторых случаях, членом группы — `{re}`. . Не устраивайте публичные разборки с другими разработчиками; это выглядит плохо. + Этот проект поддерживает публичный имидж, который очень важен для всех нас, особенно если мы хотим продолжать привлекать новых участников. Бывают случаи, когда, несмотря на все усилия сохранять самообладание, люди теряют терпение и обмениваются резкими словами. Лучшее, что можно сделать в таких ситуациях, — минимизировать последствия, пока все не остынут. Не выносите гневные слова на публику и не пересылайте личную переписку или другие частные сообщения в публичные списки рассылки, почтовые алиасы, каналы мгновенных сообщений или социальные сети. То, что люди говорят один на один, часто менее приукрашено, чем их публичные высказывания, и такие сообщения не имеют места в публичном пространстве — они только усугубляют и без того сложную ситуацию. Если человек, отправляющий гневное сообщение, хотя бы проявил такт и отправил его лично, проявите такт и вы — оставьте это в тайне. Если вы чувствуете, что другой разработчик относится к вам несправедливо, и это причиняет вам страдания, обратитесь к Основной команде (Core team), а не выносите это на публику. Основная команда постарается выступить в роли миротворцев и вернуть ситуацию в разумное русло. Если спор касается изменений в кодовой базе и участники не могут прийти к согласию, основная команда может назначить третью сторону, устраивающую всех, для разрешения спора. Все вовлечённые стороны должны согласиться с решением, принятым этой третьей стороной. . Соблюдайте все периоды заморозки кода и своевременно читайте рассылки `committers` и `developers`, чтобы знать, когда действует заморозка кода. + Внесение неподтверждённых изменений во время заморозки кода — это серьёзная ошибка, и от коммиттеров ожидается, что они будут в курсе происходящего, прежде чем, вернувшись после долгого отсутствия, закоммитить 10 мегабайт накопленных изменений. Те, кто злоупотребляет этим на регулярной основе, будут лишены прав на коммиты до возвращения из Лагеря весёлого перевоспитания FreeBSD, который мы проводим в Гренландии. . Если сомневаетесь в каком-либо действии — сначала спросите! + Многие ошибки совершаются из-за того, что кто-то торопится и просто предполагает, что знает правильный способ что-то сделать. Если вы не делали этого раньше, велика вероятность, что вы на самом деле не знаете, как у нас принято делать, и вам действительно нужно сначала спросить, иначе вы рискуете полностью опозориться на публике. Нет ничего постыдного в вопросе «как, черт возьми, это сделать?» Мы уже знаем, что вы умный человек; иначе вы не были бы коммиттером. . Проверьте свои изменения перед их применением. + Если ваши изменения касаются ядра, убедитесь, что вы по-прежнему можете компилировать как GENERIC, так и LINT. Если ваши изменения касаются других частей системы, убедитесь, что вы по-прежнему можете компилировать пользовательское пространство с помощью `make buildworld`. Если ваши изменения относятся к ветке, убедитесь, что тестирование проводится на машине, которая работает с этим кодом. Если ваше изменение может нарушить работу другой архитектуры, обязательно протестируйте его на всех поддерживаемых архитектурах. Пожалуйста, убедитесь, что ваше изменение работает для crossref:committers-guide[compilers,поддерживаемых инструментов сборки]. Пожалуйста, обратитесь к https://www.FreeBSD.org/internal/[Внутренней странице FreeBSD] для получения списка доступных ресурсов. По мере добавления других архитектур в список поддерживаемых платформ FreeBSD будут предоставлены соответствующие общие ресурсы для тестирования. . Не вносите изменения в предоставленное программное обеспечение без _явного_ одобрения соответствующих сопровождающих. + Предоставленное программное обеспечение — это всё, что находится в деревьях каталогов [.filename]#src/contrib#, [.filename]#src/crypto# или [.filename]#src/sys/contrib#. + Упомянутые выше деревья предназначены для предоставленного программного обеспечения, обычно импортируемого в ветку вендора. Фиксация изменений там может вызвать ненужные проблемы при импорте более новых версий программного обеспечения. В общем случае рекомендуется отправлять исправления напрямую вендору. Исправления могут быть сначала зафиксированы в FreeBSD с разрешения сопровождающего. + Причины изменения стороннего программного обеспечения варьируются от желания строго контролировать тесно связанную зависимость до отсутствия переносимости в каноническом репозитории с их кодом. Независимо от причины, усилия по минимизации нагрузки на поддержку форка полезны для других сопровождающих. Избегайте внесения тривиальных или косметических изменений в файлы, так как это усложняет каждое последующее слияние: такие патчи необходимо вручную перепроверять при каждом импорте. + Если конкретное программное обеспечение не имеет сопровождающего, вам предлагается взять на себя ответственность за него. Если вы не уверены в текущем сопровождении, напишите на {freebsd-arch} и уточните. === Политика поддержки нескольких архитектур В попытке упростить поддержку переносимости FreeBSD на платформы, которые мы поддерживаем, ядро системы разработало следующее предписание: [.blockquote] Основные проектные работы (включая значительные изменения API и ABI) должны подтвердить свою работоспособность как минимум на одной платформе Уровня 1 перед тем, как они могут быть включены в дерево исходного кода. Разработчики также должны учитывать нашу политику уровней поддержки аппаратных архитектур в долгосрочной перспективе. Эти правила предназначены для предоставления рекомендаций в процессе разработки и отличаются от требований к функциям и архитектурам, указанным в этом разделе. Правила уровней поддержки функций для архитектур на момент выпуска более строгие, чем правила для изменений в процессе разработки. [[compilers]] === Политика по использованию нескольких компиляторов Базовая система FreeBSD собирается как с Clang, так и с GCC. Проект делает это тщательно и контролируемо, чтобы максимизировать преимущества от этой дополнительной работы, сводя эту работу к минимуму. Поддержка обоих компиляторов повышает гибкость для наших пользователей. У этих компиляторов разные сильные и слабые стороны, и их совместная поддержка позволяет пользователям выбирать наиболее подходящий для их задач. Clang и GCC поддерживают схожие диалекты C и C++, что требует относительно небольшого количества условного кода. Проект получает улучшенное покрытие кода и повышает его качество, используя возможности обоих компиляторов. Поддержка этого диапазона позволяет проекту собираться в большем количестве пользовательских окружений и задействовать больше CI-окружений, увеличивая удобство для пользователей и предоставляя им больше инструментов для тестирования. Тщательно ограничивая диапазон поддерживаемых версий современными версиями этих компиляторов, проект избегает чрезмерного увеличения матрицы тестирования. Устаревшие и малоизвестные компиляторы, а также старые диалекты языков, имеют крайне ограниченную поддержку, позволяющую собирать пользовательские программы, но без ограничений на сборку базовой системы с их помощью. Точный баланс продолжает развиваться, чтобы гарантировать, что преимущества дополнительной работы остаются выше накладываемых ею затрат. Раньше проект поддерживал очень старые компиляторы Intel или старые версии GCC, но мы заменили поддержку этих устаревших компиляторов на тщательно выбранный диапазон современных компиляторов. В этом разделе описано, где мы используем разные компиляторы и какие ожидания с этим связаны. Базовая система FreeBSD включает в себя компилятор Clang, входящий в дерево исходного кода. Поскольку он является частью дерева, этот компилятор обладает наибольшей поддержкой. Все изменения должны компилироваться с ним перед коммитом. Полное тестирование, соответствующее изменениям, должно проводиться с этим компилятором. Базовая система FreeBSD также поддерживает различные версии Clang и GCC в качестве компиляторов, не входящих в дерево исходного кода. Для крупных или рискованных изменений коммиттеры должны выполнить тестовую сборку с поддерживаемой версией GCC. Компиляторы, не входящие в дерево исходного кода, доступны в виде пакетов. Компиляторы GCC доступны в виде пакетов `${TARGET_ARCH}-gcc${VERSION}`, например package:devel/freebsd-gcc14@aarch64[aarch64-gcc14]. Компиляторы Clang доступны в виде пакетов `llvm${VERSION}`, например package:devel/llvm18[llvm18]. Проект запускает автоматизированные задачи CI для сборки всего с использованием этих компиляторов. Ожидается, что коммиттеры исправят задачи, которые они сломали своими изменениями. Коммиттеры могут тестировать сборки пользовательского пространства или отдельных ядер, установив переменную `CROSS_TOOLCHAIN` в имя пакета, например `CROSS_TOOLCHAIN=aarch64-gcc14` или `CROSS_TOOLCHAIN=llvm18`. Для сборки universe или tinderbox, `USE_GCC_TOOLCHAINS=gcc${VERSION}` собирает все архитектуры с использованием соответствующих пакетов компиляторов GCC. Для сборки universe или tinderbox с использованием Clang, не входящего в дерево исходного кода, передайте `CROSS_TOOLCHAIN=llvm${VERSION}`. Обратите внимание, что хотя все архитектуры в базовой системе могут быть скомпилированы с помощью Clang, только несколько архитектур могут быть полностью собраны с помощью GCC. Проект FreeBSD также имеет несколько CI-пайплайнов на GitHub. Для запросов на принятие изменений (pull request) на GitHub и некоторых веток, отправленных в форки на GitHub, выполняется ряд задач кросс-компиляции. Они тестируют сборку FreeBSD с использованием версий Clang, которые отстают от встроенного компилятора на одну или несколько основных версий. Проект FreeBSD также обновляет компиляторы. И Clang, и GCC быстро развиваются. Некоторые изменения, такие как удаление устаревших объявлений и определений функций в стиле K&R, будут внесены в дерево до появления нового компилятора. Коммиттерам следует учитывать это и быть готовыми к проверке проблем в своём коде или изменениях с этими новыми компиляторами. Кроме того, сразу после появления новой версии компилятора в дереве, может потребоваться компиляция с использованием старой версии, если есть подозрение на необнаруженную регрессию. В дополнение к компилятору, LLD от LLVM и binutils от GNU используются компилятором косвенно. Коммиттеры должны учитывать различия в синтаксисе ассемблера и особенностях компоновщиков, а также обеспечивать работоспособность обоих вариантов. Эти компоненты будут тестироваться в рамках CI-задач FreeBSD для Clang или GCC. Проект FreeBSD предоставляет заголовочные файлы и библиотеки, которые позволяют использовать другие компиляторы для сборки программного обеспечения, не входящего в базовую систему. Эти заголовочные файлы поддерживают создание среды, соответствующей стандартам, включая более ранние диалекты ANSI-C, начиная с C89, а также другие специфичные случаи, выявленные нашей обширной коллекцией портов. Эта поддержка ограничивает отказ от старых стандартов в таких местах, как заголовочные файлы, но не мешает обновлению базовой системы до более новых диалектов. Также она не требует, чтобы базовая система целиком компилировалась с использованием этих старых стандартов. Нарушение этой поддержки приведёт к сбоям в сборке пакетов из коллекции портов, поэтому по возможности этого следует избегать, а при обнаружении проблем — оперативно их исправлять. Система сборки FreeBSD в настоящее время поддерживает эти различные среды. По мере добавления новых предупреждений в компиляторы проект старается их исправлять. Однако иногда эти предупреждения требуют значительной переработки, поэтому они подавляются каким-либо образом с использованием переменных make, которые вычисляют правильное значение в зависимости от версии компилятора. Разработчики должны учитывать это и обеспечивать правильную условную обработку любых флагов, специфичных для компилятора. ==== Текущие версии компиляторов Версии поддерживаемых компиляторов для конкретной ветки, такой как `main` или `stable/X`, со временем меняются. Авторитетным источником информации о поддерживаемых версиях компиляторов являются автоматизированные задачи CI, тестируемые в кросс-сборках GitHub Actions и Jenkins. -Для ветки `main` встроенным компилятором в настоящее время является Clang 19. В настоящее время GCC 12, 13 и 14 тестируются для amd64 через задания CI в Jenkins. Clang 14 и 18 тестируются для aarch64 и arm64 в кросс-сборках GitHub. +[.tblbasic] +[cols="10*", options="header"] +|=== +|Ветка | Компилятор ветки +|llvm12 | llvm13 | llvm14 | llvm15 | llvm18 +|amd64-gcc12 | amd64-gcc13 | amd64-gcc14 + +|main | llvm 19 +| | | | Y | Y +| Y | Y | Y + +|stable/15 | llvm 19 +| | | Y | | Y +| Y | Y | Y + +|stable/14 | llvm 19 +| Y | Y | Y | | +| Y | | Y + +|stable/13 | llvm 19 +| Y | Y | Y | | +| Y | | Y +|=== + +Набор инструментов разработки GCC тестируется для amd64 через задания CI в Jenkins. Набор инструментов разработки LLVM тестируется для aarch64 и arm64 в кросс-сборках GitHub. === Другие предложения При внесении изменений в документацию перед коммитом проверяйте орфографию. Для всех XML-документов убедитесь в корректности директив форматирования, выполнив `make lint` и package:textproc/igor[]. Для страниц руководства запустите package:sysutils/manck[] и package:textproc/igor[] на странице руководства, чтобы проверить, что все перекрестные ссылки и ссылки на файлы корректны, а также что страница руководства имеет все необходимые `MLINKS`. Не смешивайте исправления стиля с новой функциональностью. Исправление стиля — это любое изменение, которое не меняет функциональность кода. Смешивание изменений затрудняет понимание изменений функциональности при запросе различий между версиями, что может скрыть новые ошибки. Не включайте изменения пробелов вместе с изменениями содержимого в коммитах для [.filename]#doc/#. Лишний шум в различиях значительно усложняет работу переводчиков. Вместо этого вносите исправления стиля или пробелов в отдельных коммитах, явно обозначенных как таковые в сообщении коммита. === Устаревающие функции Когда необходимо удалить функциональность из программного обеспечения в базовой системе, по возможности следуйте этим рекомендациям: . Упоминание о том, что опция, утилита или интерфейс устарели, содержится в руководстве и, возможно, в примечаниях к выпуску. Использование устаревшей функции вызывает предупреждение. . Опция, утилита или интерфейс сохраняются до следующего мажорного (точка-ноль) релиза. . Опция, утилита или интерфейс удалены и больше не документируются. Они считаются устаревшими. Также обычно рекомендуется указать их удаление в примечаниях к выпуску. === Конфиденциальность и приватность . Большая часть работы над FreeBSD выполняется публично. + FreeBSD — это _открытый_ проект. Это означает, что не только любой может использовать исходный код, но и большая часть процесса разработки открыта для публичного изучения. . Некоторые конфиденциальные вопросы должны оставаться в тайне или быть под запретом на разглашение. + К сожалению, полной прозрачности быть не может. Как разработчик FreeBSD, вы будете иметь определенную степень привилегированного доступа к информации. Следовательно, от вас ожидается соблюдение определенных требований конфиденциальности. Иногда необходимость конфиденциальности исходит от внешних сотрудников или имеет конкретный временной лимит. Однако в большинстве случаев это вопрос неразглашения частных переписок. . Ответственный за безопасность обладает исключительным правом публикации уведомлений о безопасности. + Где есть проблемы безопасности, затрагивающие множество различных операционных систем, FreeBSD часто зависит от раннего доступа, чтобы иметь возможность подготовить уведомления для согласованного выпуска. Если разработчики FreeBSD не могут быть доверены в вопросах поддержания безопасности, такой ранний доступ предоставлен не будет. Ответственный за безопасность контролирует доступ к информации об уязвимостях до их публикации и определяет время выпуска всех уведомлений. Он может запросить помощь при условии конфиденциальности у любого разработчика с соответствующими знаниями для подготовки исправлений безопасности. . Коммуникации с Основной командой (Core Team) сохраняются в конфиденциальности столько времени, сколько необходимо. + Коммуникации с Основной командой изначально будут рассматриваться как конфиденциальные. Однако в конечном итоге большая часть деятельности Основной команды будет обобщена в ежемесячных или квартальных отчетах ядра. Будет уделено внимание тому, чтобы избежать разглашения каких-либо чувствительных деталей. Записи по некоторым особо чувствительным темам могут вообще не попадать в отчеты и будут храниться только в частных архивах Основной команды. . Соглашения о неразглашении могут потребоваться для доступа к определенной коммерчески чувствительной информации. + Доступ к определенным коммерчески чувствительным данным может быть предоставлен только при подписании Соглашения о неразглашении. Перед заключением каких-либо юридически обязывающих соглашений необходимо проконсультироваться с юридическим отделом Фонда FreeBSD. . Приватные сообщения не должны становиться публичными без разрешения. + Помимо указанных выше конкретных требований, существует общее правило не публиковать личную переписку между разработчиками без согласия всех вовлеченных сторон. Перед пересылкой сообщения в публичную рассылку, размещением на форуме или веб-сайте, доступном не только для исходных корреспондентов, необходимо запросить разрешение. . Общение в каналах, предназначенных только для проекта или с ограниченным доступом, должно оставаться конфиденциальным. + Аналогично личным сообщениям, некоторые внутренние каналы связи, включая почтовые рассылки только для коммиттеров FreeBSD и IRC-каналы с ограниченным доступом, считаются частной перепиской. Для публикации материалов из этих источников требуется разрешение. . Основная команда может одобрить публикацию. + В случаях, когда получение разрешения непрактично из-за количества корреспондентов или когда разрешение на публикацию необоснованно отклоняется, Основная команда может одобрить раскрытие таких частных вопросов, которые заслуживают более широкой публикации. [[archs]] == Поддержка множественных архитектур FreeBSD — это высокопортативная операционная система, предназначенная для работы на множестве различных типов аппаратных архитектур. Поддержание четкого разделения между машинозависимым (MD) и машинонезависимым (MI) кодом, а также минимизация MD-кода являются важной частью нашей стратегии по сохранению гибкости в отношении текущих тенденций в аппаратном обеспечении. Каждая новая аппаратная архитектура, поддерживаемая FreeBSD, существенно увеличивает затраты на поддержку кода, инструментальных средств и управление выпусками. Это также значительно повышает стоимость эффективного тестирования изменений в ядре. Таким образом, существует серьезная мотивация для разграничения уровней поддержки различных архитектур, оставаясь при этом сильными в нескольких ключевых архитектурах, которые рассматриваются как «целевая аудитория» FreeBSD. === Заявление об общих намерениях Проект FreeBSD ориентирован на "коммерческие готовые рабочие станции, серверы и высокопроизводительные встраиваемые системы производственного уровня". Сохраняя фокус на узком наборе архитектур, актуальных для этих сред, проект FreeBSD способен поддерживать высокий уровень качества, стабильности и производительности, а также минимизировать нагрузку на различные команды поддержки проекта, такие как команда портов, команда документации, офицер безопасности и команды разработки релизов. Разнообразие в поддержке оборудования расширяет возможности потребителей FreeBSD, предлагая новые функции и варианты использования, однако эти преимущества всегда должны тщательно оцениваться с учётом реальных затрат на поддержку дополнительных платформ. Проект FreeBSD разделяет целевые платформы на четыре уровня. Каждый уровень включает список гарантий, на которые могут рассчитывать пользователи, а также обязательства проекта и разработчиков по выполнению этих гарантий. Эти списки определяют минимальные гарантии для каждого уровня. Проект и разработчики могут предоставлять дополнительные уровни поддержки, превышающие минимальные гарантии для данного уровня, но такая дополнительная поддержка не гарантируется. Каждая целевая платформа назначается на определённый уровень для каждой стабильной ветви. В результате, целевая платформа может быть назначена на разные уровни в параллельных стабильных ветках. === Целевые платформы Поддержка аппаратной платформы состоит из двух компонентов: поддержки ядра и пользовательских двоичных интерфейсов приложений (ABI). Поддержка платформы на уровне ядра включает в себя всё необходимое для запуска ядра FreeBSD на аппаратной платформе, например, зависящее от машины управление виртуальной памятью и драйверы устройств. Пользовательский ABI определяет интерфейс для взаимодействия пользовательских процессов с ядром FreeBSD и базовыми системными библиотеками. Пользовательский ABI включает интерфейсы системных вызовов, расположение и семантику публичных структур данных, а также расположение и семантику аргументов, передаваемых подпрограммам. Некоторые компоненты ABI могут быть определены спецификациями, такими как расположение объектов исключений C++ или соглашения о вызовах для функций C. Ядро FreeBSD также использует ABI (иногда называемый Kernel Binary Interface (KBI)), который включает семантику и расположение публичных структур данных, а также расположение и семантику аргументов публичных функций внутри самого ядра. Ядро FreeBSD может поддерживать несколько пользовательских ABI. Например, ядро FreeBSD amd64 поддерживает пользовательские ABI FreeBSD amd64 и i386, а также пользовательские ABI Linux x86_64 и i386. Ядро FreeBSD должно поддерживать "родной" ABI в качестве ABI по умолчанию. "Родной" ABI, как правило, разделяет определённые свойства с ABI ядра, такие как соглашение о вызовах в C, размеры базовых типов и т.д. Уровни определены как для ядер, так и для пользовательских ABI. В общем случае ядро платформы и ABI FreeBSD назначаются на один и тот же уровень. ==== Уровень 1: Полностью поддерживаемые архитектуры Уровень 1 включает наиболее зрелые платформы FreeBSD. Они поддерживаются офицером безопасности, инженерами выпуска и командой управления портами. Ожидается, что архитектуры Уровня 1 соответствуют производственному качеству во всех аспектах операционной системы FreeBSD, включая среды установки и разработки. Проект FreeBSD предоставляет следующие гарантии пользователям платформ Уровня 1: * Официальные образы релизов FreeBSD будут предоставлены командой разработки релизов. * Двоичные обновления и исправления исходного кода для Security Advisories и Errata Notices будут предоставляться для поддерживаемых выпусков. * Исходные патчи для бюллетеней безопасности будут предоставлены для поддерживаемых веток. * Двоичные обновления и исправления исходного кода для кросс-платформенных выпусков Security Advisories обычно предоставляются во время объявления. * Изменения в пользовательских ABI, как правило, включают прослойки совместимости (shim) для обеспечения корректной работы бинарных файлов, скомпилированных для любой стабильной ветки, где платформа относится к Уровню 1. Эти прослойки могут быть отключены в стандартной установке. Если прослойки совместимости не предоставляются для изменения ABI, их отсутствие будет явно указано в примечаниях к выпуску. * Изменения в определённых частях ABI ядра будут включать прослойки совместимости для обеспечения корректной работы модулей ядра, скомпилированных для самой старой поддерживаемой версии в ветке. Обратите внимание, что не все части ABI ядра защищены. * Официальные бинарные пакеты для стороннего программного обеспечения будут предоставлены командой портов. Для встраиваемых архитектур эти пакеты могут быть кросс-собранными на архитектуре другого типа. * Наиболее подходящие порты должны либо собираться, либо иметь соответствующие фильтры, чтобы предотвратить сборку неподходящих. * Новые функции, которые не являются специфичными для платформы, будут полностью работоспособны на всех архитектурах Уровня 1. * Функции и прослойки совместимости, используемые программами, скомпилированными для старых стабильных веток, могут быть удалены в новых основных версиях. Такие изменения будут четко документированы в примечаниях к выпуску. * Уровень 1 платформ должен быть полностью документирован. Основные операции будут описаны в Руководстве FreeBSD. * Уровень 1 платформ будет включен в дерево исходных кодов. * Платформы Уровня 1 должны быть самодостаточными, используя либо встроенный инструментарий, либо внешний инструментарий. Если требуется внешний инструментарий, будут предоставлены официальные бинарные пакеты для него. Для обеспечения зрелости платформ Уровня 1 проект FreeBSD будет поддерживать следующие ресурсы для разработки: * Сборка и автоматизация тестирования поддерживаются либо в кластере FreeBSD.org, либо в другом месте, легко доступном для всех разработчиков. Для встраиваемых платформ можно использовать эмулятор, доступный в кластере FreeBSD.org, вместо реального оборудования. * Включение в цели `make universe` и `make tinderbox`. * Выделенное оборудование в одном из кластеров FreeBSD для сборки пакетов (нативно или через qemu-user). Совокупно, разработчики должны обеспечить следующее для поддержания статуса платформы Уровня 1: * Изменения в дереве исходного кода не должны заведомо нарушать сборку платформы Уровня 1. * Уровень 1 архитектур должен обладать зрелой, здоровой экосистемой пользователей и активных разработчиков. * Разработчики должны иметь возможность собирать пакеты на широко доступных, невстраиваемых системах Уровня 1. Это может означать как нативные сборки, если невстраиваемые системы широко доступны для рассматриваемой платформы, так и кросс-сборки, выполняемые на другой архитектуре Уровня 1. * Изменения не должны нарушать ABI пользовательского пространства. Если изменение ABI необходимо, совместимость ABI для существующих бинарных файлов должна обеспечиваться с помощью версионирования символов или увеличения версий разделяемых библиотек. * Изменения, которым сделано слияние в стабильные ветки, не должны нарушать защищенные части ABI ядра. Если требуется изменение ABI ядра, изменение должно быть модифицировано для сохранения функциональности существующих модулей ядра. ==== Уровень 2: Развивающиеся и нишевые архитектуры Уровень 2 включает в себя функциональные, но менее развитые платформы FreeBSD. Они не поддерживаются офицером безопасности, инженерами выпуска и командой управления портами. Платформы Уровня 2 могут быть кандидатами в платформы Уровня 1, которые всё ещё находятся в активной разработке. Архитектуры, достигшие конца жизненного цикла, также могут быть переведены из статуса Уровня 1 на Уровень 2 по мере сокращения доступности ресурсов для поддержания системы в состоянии производственного качества. Хорошо поддерживаемые нишевые архитектуры также могут относиться к Уровню 2. Проект FreeBSD предоставляет следующие гарантии пользователям платформ Уровня 2: * Инфраструктура портов должна включать базовую поддержку архитектур Уровня 2, достаточную для сборки портов и пакетов. Это включает поддержку базовых пакетов, таких как ports-mgmt/pkg, но нет гарантии, что произвольные порты будут собираемыми или работоспособными. * Новые функции, которые не являются специфичными для платформы, должны быть реализуемы на всех архитектурах уровня Уровень 2, если они не реализованы. * Уровень 2 платформ будет включен в дерево исходных кодов. * Платформы Уровня 2 должны быть самодостаточными, используя либо встроенный инструментарий, либо внешний инструментарий. Если требуется внешний инструментарий, будут предоставлены официальные бинарные пакеты для него. * Уровень 2 платформ должен обеспечивать функциональные ядра и пользовательские среды, даже если официальный дистрибутив не предоставляется. Для поддержания зрелости платформ Уровня 2 проект FreeBSD будет поддерживать следующие ресурсы для разработки: * Включение в цели `make universe` и `make tinderbox`. Совместно разработчики должны обеспечить следующее для поддержания статуса платформы Уровня 2: * Изменения в дереве исходного кода не должны заведомо нарушать сборку платформы Уровня 2. * Уровень 2 архитектур должен иметь активную экосистему пользователей и разработчиков. * Хотя изменения, нарушающие ABI пользовательского пространства, допустимы, не следует делать это без веской причины. Значительные изменения ABI пользовательского пространства должны ограничиваться основными версиями. * Новые функции, которые еще не реализованы в архитектурах Уровня 2, должны предоставлять возможность их отключения на этих архитектурах. ==== Уровень 3: Экспериментальные архитектуры Уровень 3 включает платформы с частичной поддержкой FreeBSD. Они _не_ поддерживаются офицером безопасности, инженерами выпуска релизов и командой управления портами. Уровень 3 включает архитектуры на ранних стадиях разработки, предназначенные для неосновных аппаратных платформ или считающиеся устаревшими системами, которые вряд ли получат широкое применение в будущем. Первоначальная поддержка платформ Уровня 3 может находиться в отдельном репозитории, а не в основном репозитории исходного кода. Проект FreeBSD не предоставляет никаких гарантий пользователям платформ Уровня 3 и не обязуется выделять ресурсы для поддержки разработки. Платформы Уровня 3 могут не всегда собираться, и ни одно ABI ядра или пользовательского пространства не считается стабильным. ==== Неподдерживаемые архитектуры Другие платформы не поддерживаются проектом в какой-либо форме. Ранее проект описывал их как системы Уровня 4. После перехода платформы в статус неподдерживаемой, вся поддержка платформы удаляется из исходного кода, портов и документации. Обратите внимание, что поддержка в портах должна сохраняться до тех пор, пока платформа поддерживается в ветке, поддерживаемой портами. === Политика изменения уровня архитектуры Системы могут быть перемещены с одного уровня на другой только с одобрения Основной команды FreeBSD, которая принимает это решение совместно с Security Officer, Release Engineering и командами управления портами. Для перевода платформы на более высокий уровень все недостающие гарантии поддержки должны быть выполнены до завершения повышения. [[ports]] == Специфичные FAQ по портам [[ports-qa-adding]] === Добавление нового порта [[ports-qa-add-new]] ==== Как добавить новый порт? Добавление порта в дерево относительно просто. Как только порт готов к добавлению, как описано далее crossref:committers-guide[ports-qa-add-new-extra,здесь], необходимо добавить запись каталога порта в [.filename]#Makefile# соответствующей категории. В этом [.filename]#Makefile# порты перечислены в алфавитном порядке и добавлены в переменную `SUBDIR`, например: [.programlisting] .... SUBDIR += newport .... После того как порт и Makefile его категории готовы, новый порт можно закоммитить: [source, shell] .... % git add category/Makefile category/newport % git commit % git push .... [TIP] ==== Не забудьте crossref:committers-guide[port-commit-message-formats,настроить git-хуки для дерева портов, как описано здесь]; специальный хук был разработан для проверки [.filename]#Makefile# каждой категории. ==== [[ports-qa-add-new-extra]] ==== Есть ли что-то еще, что мне нужно знать при добавлении нового порта? Проверьте порт, желательно убедиться, что он компилируется и собирается в пакеты правильно. В главе extref:{porters-handbook}testing[Руководства портировщика по тестированию] содержатся более подробные инструкции. См. разделы extref:{porters-handbook}testing[Portclippy / Portfmt, testing-portclippy] и extref:{porters-handbook}testing[poudriere, testing-poudriere]. Вам не обязательно устранять все предупреждения, но убедитесь, что исправили простые. Если порт поступил от отправителя, который ранее не участвовал в Проекте, добавьте имя этого человека в раздел extref:{contributors}[Дополнительные участники, contrib-additional] списка участников FreeBSD. Закройте PR, если порт был отправлен как PR. Чтобы закрыть PR, измените состояние на `Issue Resolved` и установите решение как `Fixed`. [NOTE] ==== Если по какой-то причине использование extref:{porters-handbook}testing[poudriere, testing-poudriere] для тестирования нового порта невозможно, минимальный набор тестирования включает следующую последовательность: [source, shell] .... # make install # make package # make deinstall # pkg add package you built above # make deinstall # make reinstall # make package .... Обратите внимание, что poudriere является эталоном для сборки пакетов. Если порт не собирается в poudriere, он будет удалён. ==== [[ports-qa-removing]] === Удаление существующего порта [[ports-qa-remove-one]] ==== Как удалить существующий порт? Сначала прочитайте раздел о копиях репозиториев. Перед удалением порта необходимо убедиться, что от него не зависят другие порты. * Убедитесь, что нет зависимостей от порта в коллекции портов: ** Имя пакета порта (PKGNAME) появляется ровно в одной строке в последнем файле INDEX. ** Ни один другой порт не содержит ссылок на каталог порта или PKGNAME в своих Makefiles + [TIP] ==== При использовании Git рассмотрите возможность использования man:git-grep[1], так как он значительно быстрее, чем `grep -r`. ==== + * Затем удалите порт: + [.procedure] ==== * Удалите файлы и каталог порта с помощью `git rm`. * Удалите указание `SUBDIR` для порта в [.filename]#Makefile# родительского каталога. * Добавьте запись в [.filename]#ports/MOVED#. * Удалите порт из [.filename]#ports/LEGAL#, если он там присутствует. ==== Альтернативно, вы можете использовать скрипт rmport из [.filename]#ports/Tools/scripts#. Этот скрипт был написан {vd}. При отправке вопросов об этом скрипте в {freebsd-ports}, пожалуйста, также копируйте {crees}, текущего сопровождающего. [[ports-qa-move-port]] === Как переместить порт в новое место? [.procedure] ==== . Выполните тщательную проверку коллекции портов на наличие зависимостей от старого расположения или имени порта и обновите их. Запуск `grep` по файлу [.filename]#INDEX# недостаточен, поскольку некоторые порты имеют зависимости, включённые через параметры компиляции. Рекомендуется выполнить полный поиск с помощью man:git-grep[1] по коллекции портов. . Удалите запись `SUBDIR` из Makefile старой категории и добавьте запись `SUBDIR` в Makefile новой категории. . Добавьте запись в [.filename]#ports/MOVED#. . Поищите записи в xml-файлах внутри [.filename]#ports/security/vuxml# и скорректируйте их соответствующим образом. В частности, проверьте предыдущие пакеты с новым именем, версия которых может включать новый порт. . Переместите порт с помощью `git mv`. . Зафиксируйте изменения. ==== [[ports-qa-copy-port]] === Как скопировать порт в новое место? [.procedure] ==== . Скопируйте порт с помощью `cp -R old-cat/old-port new-cat/new-port`. . Добавьте новый порт в файл [.filename]#new-cat/Makefile#. . Измените содержимое в [.filename]#new-cat/new-port#. . Зафиксируйте изменения. ==== [[ports-qa-freeze]] === Заморозка портов [[ports-qa-freeze-what]] ==== Что такое «заморозка портов»? «Заморозка портов» (ports freeze) — это ограниченное состояние, в которое дерево портов переводилось перед выпуском релиза. Оно использовалось для обеспечения более высокого качества пакетов, поставляемых с релизом. Обычно это длилось несколько недель. В течение этого времени исправлялись проблемы со сборкой, а также строились пакеты для релиза. Эта практика больше не применяется, так как пакеты для релизов теперь собираются из текущей стабильной квартальной ветки. Для получения дополнительной информации о том, как делать слияние коммитов в квартальную ветку, см. crossref:committers-guide[ports-qa-misc-request-mfh, Какова процедура получения разрешения на слияние коммита с квартальной веткой?]. [[ports-qa-quarterly]] === Квартальные ветки [[ports-qa-misc-request-mfh]] ==== Какова процедура получения разрешения на слияние коммита с квартальной веткой? По состоянию на 30 ноября 2020 года явное одобрение для внесения изменений в квартальную ветку не требуется. [[ports-qa-misc-commit-mfh]] ==== Какова процедура слияния коммитов в квартальную ветку? Слияние коммитов в квартальную ветку (процесс, который мы по историческим причинам называем MFH) очень похоже на MFC коммитов в репозитории src, поэтому в основном: [source, shell] .... % git checkout 2021Q2 % git cherry-pick -x $HASH (verify everything is OK, for example by doing a build test) % git push .... где `$HASH` — это хэш коммита, который вы хотите скопировать в квартальную ветку. Параметр `-x` гарантирует, что хэш `$HASH` из ветки `main` будет включён в новое сообщение коммита в квартальной ветке. [[ports-qa-new-category]] === Создание новой категории [[ports-qa-new-category-how]] ==== Какова процедура создания новой категории? -Пожалуйста, ознакомьтесь с extref:{porters-handbook}makefiles/[Предложение новой категории, proposing-categories] в Руководстве FreeBSD по созданию портов. После выполнения этой процедуры и назначения PR в группе — {portmgr}, решение об одобрении принимается ими. Если решение положительное, их обязанностью является: +Пожалуйста, ознакомьтесь с extref:{porters-handbook}makefiles[Предложение новой категории, proposing-categories] в Руководстве FreeBSD по созданию портов. После выполнения этой процедуры и назначения PR в группе — {portmgr}, решение об одобрении принимается ими. Если решение положительное, их обязанностью является: [.procedure] ==== . Выполните все необходимые перемещения. (Это применимо только к физическим категориям.) . Обновите определение `VALID_CATEGORIES` в файле [.filename]#ports/Mk/bsd.port.mk#. . Назначить PR обратно на вас. ==== [[ports-qa-new-category-physical]] ==== Что мне нужно сделать для создания новой физической категории? [.procedure] ==== . Обновите [.filename]#Makefile# каждого перемещенного порта. Пока не подключайте новую категорию к сборке. + Для этого вам потребуется: + [.procedure] ====== . Измените `CATEGORIES` порта (это была цель упражнения, помните?). Новая категория указана первой. Это поможет убедиться, что PKGORIGIN указан правильно. . Выполните команду `make describe`. Поскольку команда `make index` верхнего уровня, которую вы запустите через несколько шагов, является итерацией `make describe` для всей иерархии портов, обнаружение ошибок на этом этапе сэкономит время, избавив от необходимости перезапускать этот шаг позже. . Если вы хотите быть действительно тщательным, сейчас может быть подходящее время запустить man:portlint[1]. ====== + . Проверьте, что значения ``PKGORIGIN`` указаны верно. Система портов использует запись `CATEGORIES` каждого порта для создания его `PKGORIGIN`, который служит для связи установленных пакетов с директорией порта, из которого они были собраны. Если эта запись неверна, такие распространённые инструменты для работы с портами, как man:pkg-version[8] и man:portupgrade[1], не будут работать. + Для этого используйте инструмент [.filename]#chkorigin.sh#: `env PORTSDIR=/path/to/ports sh -e /path/to/ports/Tools/scripts/chkorigin.sh`. Это проверит каждый порт в дереве портов, даже те, которые не связаны со сборкой, поэтому вы можете запустить его сразу после операции перемещения. Подсказка: не забудьте проверить ``PKGORIGIN`` для всех подчинённых портов (slave ports) тех портов, которые вы только что переместили! . На вашей локальной системе протестируйте предлагаемые изменения: сначала закомментируйте записи SUBDIR в файлах [.filename]##Makefile## старых категорий портов; затем включите сборку новой категории в [.filename]#ports/Makefile#. Запустите `make checksubdirs` в затронутых каталогах категорий, чтобы проверить записи SUBDIR. Затем в каталоге [.filename]#ports/# выполните `make index`. Это может занять более 40 минут даже на современных системах; однако это необходимый шаг для предотвращения проблем у других пользователей. . После этого можно зафиксировать обновлённый файл [.filename]#ports/Makefile#, чтобы подключить новую категорию к сборке, а также сделать коммит изменениям в файле [.filename]#Makefile# для старой категории или категорий. . Добавьте соответствующие записи в [.filename]#ports/MOVED#. . Обновите документацию, изменив: ** extref:{porters-handbook}makefiles/[список категорий, porting-categories] в Руководстве FreeBSD по созданию портов + . Только после того, как все вышеперечисленное будет выполнено и больше никто не сообщает о проблемах с новыми портами, старые порты следует удалить из их прежних мест в репозитории. ==== ==== Что мне нужно сделать для создания новой виртуальной категории? Это намного проще, чем физическая категория. Требуется всего несколько изменений: * extref:{porters-handbook}makefiles/[список категорий, porting-categories] в Руководстве FreeBSD по созданию портов [[ports-qa-misc-questions]] === Разные вопросы [[ports-qa-misc-blanket-approval]] ==== Существуют ли изменения, которые можно зафиксировать без запроса одобрения у сопровождающего? Общее одобрение для большинства портов применяется к следующим типам исправлений: * Большинство изменений инфраструктуры порта (то есть модернизация без изменения функциональности). Например, это включает переход на новые макросы `USES`, включение подробных сборок и переход на новые синтаксисы системы портов. * Тривиальные и _проверенные_ исправления для сборки и выполнения. * Документация или изменения метаданных для портов, такие как [.filename]#pkg-descr# или `COMMENT`. [IMPORTANT] ==== Исключениями являются любые компоненты, поддерживаемые {portmgr} или {security-officer}. Несанкционированные коммиты в порты, которые поддерживаются этими группами, недопустимы. ==== [[ports-qa-misc-correctly-building]] ==== Как узнать, мой порт собирается правильно или нет? Пакеты собираются несколько раз в неделю. Если сборка порта завершается неудачно, сопровождающий получит письмо от `pkg-fallout@FreeBSD.org`. -Отчеты по всем сборкам пакетов (официальные, экспериментальные и без регрессии) агрегируются на link:pkg-status.FreeBSD.org[pkg-status.FreeBSD.org]. +Отчеты по всем сборкам пакетов (официальные, экспериментальные и без регрессии) агрегируются на link:https://pkg-status.FreeBSD.org[pkg-status.FreeBSD.org]. [[ports-qa-misc-INDEX]] ==== Я добавил новый порт. Нужно ли добавлять его в [.filename]#INDEX#? Нет. Файл может быть создан выполнением команды `make index`, или можно загрузить предварительно сгенерированную версию с помощью `make fetchindex`. [[ports-qa-misc-no-touch]] ==== Есть ли другие файлы, которые мне нельзя изменять? Любой файл непосредственно в [.filename]#ports/# или любой файл в подкаталоге, название которого начинается с заглавной буквы ([.filename]#Mk/#, [.filename]#Tools/# и т.д.). В частности, {portmgr} очень ревностно относится к [.filename]#ports/Mk/bsd.port*.mk#, поэтому не вносите изменения в эти файлы, если не хотите навлечь на себя их гнев. [[ports-qa-misc-updated-distfile]] ==== Как правильно обновить контрольную сумму для distfile порта, если файл изменился без изменения версии? Когда контрольная сумма файла дистрибутива обновляется из-за того, что автор обновил файл без изменения ревизии порта, сообщение коммита включает сводку соответствующих различий между оригинальным и новым файлом дистрибутива, чтобы убедиться, что файл дистрибутива не был повреждён или злонамеренно изменён. Если текущая версия порта находится в дереве портов уже некоторое время, копия старого файла дистрибутива обычно доступна на FTP-серверах; в противном случае следует связаться с автором или сопровождающим, чтобы выяснить, почему файл дистрибутива изменился. [[ports-exp-run]] ==== Как можно запросить экспериментальную тестовую сборку дерева портов (exp-run)? Перед коммитом изменений, оказывающих значительное влияние на порты, необходимо выполнить тестовый прогон (exp-run). Исправление может относиться как к дереву портов, так и к базовой системе. Полные сборки пакетов будут выполнены с патчами, предоставленными отправителем, и отправитель обязан исправить обнаруженные проблемы _(падения сборки и т.п.)_ перед коммитом. [.procedure] ==== . Перейдите по ссылке link:https://bugs.freebsd.org/submit[Страница создания новой PR в Bugzilla]. . Выберите продукт, к которому относится ваш патч. . Заполните отчёт об ошибке как обычно. Не забудьте приложить исправление. . Если вверху написано «Показать дополнительные поля (Show Advanced Fields)», нажмите на это. Теперь будет написано «Скрыть дополнительные поля (Hide Advanced Fields)». Станут доступны многие новые поля. Если уже написано «Скрыть дополнительные поля», ничего делать не нужно. . В разделе «Flags» установите флаг «exp-run» в значение `?`. Для всех остальных полей при наведении курсора на любое поле отображаются дополнительные сведения. . Отправьте. Дождитесь завершения сборки. . {portmgr} ответит с информацией возможных падениях. . В зависимости от последствий: ** Если последствий нет, процедура останавливается здесь, и изменение может быть закоммичено, ожидая любых других необходимых утверждений. ... Если возникнут проблемы, их _необходимо_ исправить, либо напрямую в дереве портов, либо добавив изменения в предоставленный патч. ... После этого вернитесь к шагу 6, указав, что проблема устранена, и дождитесь повторного запуска exp-run. Повторяйте, пока остаются неисправные порты. ==== [[non-committers]] == Проблемы, характерные для разработчиков, не являющихся коммиттерами Несколько людей, имеющих доступ к машинам FreeBSD, не обладают правами на коммиты. Почти все положения этого документа применимы и к таким разработчикам (за исключением аспектов, специфичных для коммитов и связанного с ними членства в рассылках). В частности, мы рекомендуем ознакомиться со следующим: * crossref:committers-guide[admin,Административные детали] * crossref:committers-guide[conventions-everyone, Для всех] + [NOTE] ==== Попросите вашего наставника добавить вас в список "Дополнительные участники" ([.filename]#doc/shared/contrib-additional.adoc#), если вас там еще нет. ==== * crossref:committers-guide[developer.relations, Отношения с разработчиками] * crossref:committers-guide[ssh.guide, Руководство по быстрому началу работы с SSH] * crossref:committers-guide[rules, Большой список правил коммиттеров FreeBSD] [[google-analytics]] == Информация о Google Analytics По состоянию на 12 декабря 2012 года на сайте проекта FreeBSD был включен Google Analytics для сбора анонимной статистики использования сайта. [NOTE] ==== По состоянию на 3 марта 2022 года Google Analytics был удалён из проекта FreeBSD. ==== [[misc]] == Разные вопросы === Как получить доступ к people.FreeBSD.org для размещения личной или проектной информации? `people.FreeBSD.org` — это то же самое, что и `freefall.FreeBSD.org`. Просто создайте каталог [.filename]#public_html#. Всё, что вы поместите в этот каталог, будет автоматически доступно по адресу https://people.FreeBSD.org/[https://people.FreeBSD.org/]. === Где хранятся архивы списков рассылки? Списки рассылки архивируются в [.filename]#/local/mail# на `freefall.FreeBSD.org`. === Я хочу стать наставником нового коммиттера. Какой процесс мне нужно пройти? См. документ https://www.freebsd.org/internal/new-account/[Процедура создания новой учётной записи] на внутренних страницах. [[benefits]] == Преимущества и привилегии для коммиттеров FreeBSD [[benefits-recognition]] === Признание Признание в качестве квалифицированного инженера-программиста — это самая долговечная ценность. Кроме того, возможность работать с одними из лучших специалистов, о встрече с которыми мечтает любой инженер, — это отличный бонус! [[benefits-freebsdmall]] === FreeBSD Mall Коммиттеры FreeBSD могут бесплатно получить набор из 4 CD или DVD на конференциях через http://www.freebsdmall.com[FreeBSD Mall, Inc.]. [[benefits-gandi]] === `Gandi.net` https://gandi.net[Gandi] предоставляет услуги хостинга веб-сайтов, облачных вычислений, регистрации доменов и сертификатов X.509. Gandi предоставляет скидку E-rate всем разработчикам FreeBSD. Чтобы упростить процесс получения скидки, сначала создайте учетную запись Gandi, заполните платежные данные и выберите валюту. Затем отправьте письмо по адресу mailto:non-profit@gandi.net[non-profit@gandi.net] с вашего адреса `@freebsd.org`, указав ваш идентификатор Gandi. [[benefits-rsync]] === `rsync.net` https://rsync.net[rsync.net] предоставляет облачное хранилище для резервного копирования вне офиса, оптимизированное для пользователей UNIX. Их сервис полностью работает на FreeBSD и ZFS. rsync.net предоставляет бесплатный аккаунт на 500 ГБ навсегда разработчикам FreeBSD. Просто зарегистрируйтесь по адресу https://www.rsync.net/freebsd.html[https://www.rsync.net/freebsd.html], используя ваш адрес `@freebsd.org`, чтобы получить этот бесплатный аккаунт. diff --git a/documentation/content/ru/articles/committers-guide/_index.po b/documentation/content/ru/articles/committers-guide/_index.po index 3fdd1f69a3..8bcab0d188 100644 --- a/documentation/content/ru/articles/committers-guide/_index.po +++ b/documentation/content/ru/articles/committers-guide/_index.po @@ -1,12137 +1,12159 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-08-17 20:53+0100\n" -"PO-Revision-Date: 2025-10-30 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/committers-guide/_index.adoc:1 #, no-wrap msgid "Introductory information for FreeBSD committers" msgstr "Вводная информация для коммиттеров FreeBSD" #. type: Title = #: documentation/content/en/articles/committers-guide/_index.adoc:1 #: documentation/content/en/articles/committers-guide/_index.adoc:12 #, no-wrap msgid "Committer's Guide" msgstr "Руководство коммиттера" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:45 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:48 msgid "" "This document provides information for the FreeBSD committer community. All " "new committers should read this document before they start, and existing " "committers are strongly encouraged to review it from time to time." msgstr "" "В этом документе представлена информация для сообщества коммиттеров FreeBSD. " "Все новые коммиттеры должны прочитать этот документ перед началом работы, а " "существующим коммиттерам настоятельно рекомендуется периодически его " "пересматривать." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:53 msgid "" "Almost all FreeBSD developers have commit rights to one or more " "repositories. However, a few developers do not, and some of the information " "here applies to them as well. (For instance, some people only have rights " "to work with the Problem Report database.) Please see crossref:committers-" "guide[non-committers, Issues Specific to Developers Who Are Not Committers] " "for more information." msgstr "" "Почти все разработчики FreeBSD имеют права на коммит в один или несколько " "репозиториев. Однако некоторые разработчики не имеют таких прав, и часть " "информации здесь применима и к ним. (Например, некоторые люди имеют права " "только для работы с базой данных отчетов о проблемах.) Дополнительную " "информацию можно найти в crossref:committers-guide[non-committers, Вопросы, " "специфичные для разработчиков без прав на коммит]." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:55 msgid "" "This document may also be of interest to members of the FreeBSD community " "who want to learn more about how the project works." msgstr "" "Этот документ также может быть интересен участникам сообщества FreeBSD, " "которые хотят узнать больше о том, как работает проект." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:57 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/committers-guide/_index.adoc:61 #, no-wrap msgid "Administrative Details" msgstr "Административные детали" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:68 #, no-wrap msgid "_Login Methods_" msgstr "_Способ логина_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:70 #, no-wrap msgid "man:ssh[1], protocol 2 only" msgstr "man:ssh[1], только протокол версии 2" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:71 #, no-wrap msgid "_Main Shell Host_" msgstr "_Главный хост для входа в оболочку_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:73 #, no-wrap msgid "`freefall.FreeBSD.org`" msgstr "`freefall.FreeBSD.org`" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:74 #, no-wrap msgid "_Reference Machines_" msgstr "_Референсные машины_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:76 #, no-wrap msgid "`ref*.FreeBSD.org`, `universe*.freeBSD.org` (see also link:https://www.FreeBSD.org/internal/machines/[FreeBSD Project Hosts])" msgstr "`ref*.FreeBSD.org`, `universe*.freeBSD.org` (см. также ссылку link:https://www.FreeBSD.org/internal/machines/[Хосты проекта FreeBSD])" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:77 #, no-wrap msgid "_SMTP Host_" msgstr "_Узел SMTP_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:79 #, no-wrap msgid "`smtp.FreeBSD.org:587` (see also crossref:committers-guide[smtp-setup, SMTP Access Setup])." msgstr "`smtp.FreeBSD.org:587` (см. также crossref:committers-guide[smtp-setup, Настройка доступа SMTP])." #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:80 #, no-wrap msgid "`_src/_` Git Repository" msgstr "`_src/_` Git-репозиторий" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:82 #, no-wrap msgid "`ssh://git@gitrepo.FreeBSD.org/src.git`" msgstr "`ssh://git@gitrepo.FreeBSD.org/src.git`" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:83 #, no-wrap msgid "`_doc/_` Git Repository" msgstr "`_doc/_` Git-репозиторий" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:85 #, no-wrap msgid "`ssh://git@gitrepo.FreeBSD.org/doc.git`" msgstr "`ssh://git@gitrepo.FreeBSD.org/doc.git`" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:86 #, no-wrap msgid "`_ports/_` Git Repository" msgstr "`_ports/_` Git-репозиторий" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:88 #, no-wrap msgid "`ssh://git@gitrepo.FreeBSD.org/ports.git`" msgstr "`ssh://git@gitrepo.FreeBSD.org/ports.git`" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:89 #, no-wrap msgid "_Internal Mailing Lists_" msgstr "_Внутренние списки рассылки_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:91 #, no-wrap msgid "developers (technically called all-developers), doc-developers, doc-committers, ports-developers, ports-committers, src-developers, src-committers. (Each project repository has its own -developers and -committers mailing lists. Archives for these lists can be found in the files [.filename]#/local/mail/repository-name-developers-archive# and [.filename]#/local/mail/repository-name-committers-archive# on `freefall.FreeBSD.org`.)" msgstr "developers (технически называемый all-developers), doc-developers, doc-committers, ports-developers, ports-committers, src-developers, src-committers. (Каждый репозиторий проекта имеет свои собственные списки рассылки -developers и -committers. Архивы этих списков можно найти в файлах [.filename]#/local/mail/repository-name-developers-archive# и [.filename]#/local/mail/repository-name-committers-archive# на `freefall.FreeBSD.org`.)" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:92 #, no-wrap msgid "_Core Team monthly reports_" msgstr "_Ежемесячные отчеты основной команды (Core Team)_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:94 #, no-wrap msgid "[.filename]#/home/core/public/reports# on the `FreeBSD.org` cluster." msgstr "[.filename]#/home/core/public/reports# на кластере `FreeBSD.org`." #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:95 #, no-wrap msgid "_Ports Management Team monthly reports_" msgstr "_Ежемесячные отчеты команды управления портами_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:97 #, no-wrap msgid "[.filename]#/home/portmgr/public/monthly-reports# on the `FreeBSD.org` cluster." msgstr "[.filename]#/home/portmgr/public/monthly-reports# в кластере `FreeBSD.org`." #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:98 #, no-wrap msgid "_Noteworthy `src/` Git Branches:_" msgstr "_Важные ветки Git в `src/`:_" #. type: Table #: documentation/content/en/articles/committers-guide/_index.adoc:99 #, no-wrap msgid "`stable/n` (`n`-STABLE), `main` (-CURRENT)" msgstr "`stable/n` (`n`-STABLE), `main` (-CURRENT)" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:103 #, no-wrap msgid "" "man:ssh[1] is required to connect to the project hosts. For more information,\n" "\tsee crossref:committers-guide[ssh.guide, SSH Quick-Start Guide].\n" msgstr "" -"Для подключения к хостам проекта требуется man:ssh[1]. Дополнительную " -"информацию\n" -"можно найти в crossref:committers-guide[ssh.guide, Руководстве по быстрому " -"началу работы с SSH].\n" +"Для подключения к хостам проекта требуется man:ssh[1]. Дополнительную информацию\n" +"можно найти в crossref:committers-guide[ssh.guide, Руководстве по быстрому началу работы с SSH].\n" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:105 msgid "Useful links:" msgstr "Полезные ссылки:" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:107 msgid "link:https://www.FreeBSD.org/internal/[FreeBSD Project Internal Pages]" msgstr "" "link:https://www.FreeBSD.org/internal/[Внутренние страницы проекта FreeBSD]" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:108 msgid "link:https://www.FreeBSD.org/internal/machines/[FreeBSD Project Hosts]" msgstr "link:https://www.FreeBSD.org/internal/machines/[Узлы проекта FreeBSD]" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:109 msgid "" "link:https://www.FreeBSD.org/administration/[FreeBSD Project Administrative " "Groups]" msgstr "" "link:https://www.FreeBSD.org/administration/[Административные группы проекта " "FreeBSD]" #. type: Title == #: documentation/content/en/articles/committers-guide/_index.adoc:111 #, no-wrap msgid "OpenPGP Keys for FreeBSD" msgstr "Ключи OpenPGP для FreeBSD" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:116 msgid "" "Cryptographic keys conforming to the OpenPGP (__Pretty Good Privacy__) " "standard are used by the FreeBSD project to authenticate committers. " "Messages carrying important information like public SSH keys can be signed " "with the OpenPGP key to prove that they are really from the committer. See " "https://nostarch.com/releases/pgp_release.pdf[PGP & GPG: Email for the " "Practical Paranoid by Michael Lucas] and https://en.wikipedia.org/wiki/" "Pretty_Good_Privacy[] for more information." msgstr "" "Криптографические ключи, соответствующие стандарту OpenPGP (__Pretty Good " "Privacy__), используются проектом FreeBSD для аутентификации коммиттеров. " "Сообщения, содержащие важную информацию, такие как публичные SSH-ключи, " "могут быть подписаны с помощью OpenPGP-ключа, чтобы доказать, что они " "действительно отправлены коммиттером. Дополнительную информацию можно найти " "в https://nostarch.com/releases/pgp_release.pdf[PGP & GPG: Email for the " "Practical Paranoid от Michael Lucas] и https://en.wikipedia.org/wiki/" "Pretty_Good_Privacy[]." #. type: Title === #: documentation/content/en/articles/committers-guide/_index.adoc:118 #, no-wrap msgid "Creating a Key" msgstr "Создание ключа" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:122 msgid "" "Existing keys can be used, but should be checked with [." "filename]#documentation/tools/checkkey.sh# first. In this case, make sure " "the key has a FreeBSD user ID." msgstr "" "Существующие ключи можно использовать, но сначала их следует проверить с " "помощью [.filename]#documentation/tools/checkkey.sh#. В этом случае " "убедитесь, что у ключа есть FreeBSD user ID." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:124 msgid "" "For those who do not yet have an OpenPGP key, or need a new key to meet " "FreeBSD security requirements, here we show how to generate one." msgstr "" "Для тех, у кого ещё нет ключа OpenPGP или требуется новый ключ, " "соответствующий требованиям безопасности FreeBSD, здесь показано, как его " "сгенерировать." #. type: delimited block = 4 #: documentation/content/en/articles/committers-guide/_index.adoc:129 msgid "" "Install [.filename]#security/gnupg#. Enter these lines in [.filename]#~/." "gnupg/gpg.conf# to set minimum acceptable defaults for signing and new key " "preferences (see the link:https://www.gnupg.org/documentation/manuals/gnupg/" "GPG-Options.html[GnuPG options documentation] for more details):" msgstr "" "Установите [.filename]#security/gnupg#. Добавьте следующие строки в [." "filename]#~/.gnupg/gpg.conf#, чтобы задать минимально приемлемые настройки " "для подписи и предпочтений новых ключей (подробнее см. в link:https://www." "gnupg.org/documentation/manuals/gnupg/GPG-Options.html[документации по " "опциям GnuPG]):" #. type: delimited block . 4 #: documentation/content/en/articles/committers-guide/_index.adoc:136 #, no-wrap msgid "" "# Sorted list of preferred algorithms for signing (strongest to weakest).\n" "personal-digest-preferences SHA512 SHA384 SHA256 SHA224\n" "# Default preferences for new keys\n" "default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 CAMELLIA256 AES192 CAMELLIA192 AES CAMELLIA128 CAST5 BZIP2 ZLIB ZIP Uncompressed\n" msgstr "" "# Sorted list of preferred algorithms for signing (strongest to weakest).\n" "personal-digest-preferences SHA512 SHA384 SHA256 SHA224\n" "# Default preferences for new keys\n" "default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 CAMELLIA256 AES192 CAMELLIA192 AES CAMELLIA128 CAST5 BZIP2 ZLIB ZIP Uncompressed\n" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:138 msgid "Generate a key:" msgstr "Сгенерировать ключ:" #. type: delimited block . 4 #: documentation/content/en/articles/committers-guide/_index.adoc:145 #, no-wrap msgid "" "% gpg --full-gen-key\n" "gpg (GnuPG) 2.1.8; Copyright (C) 2015 Free Software Foundation, Inc.\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" msgstr "" "% gpg --full-gen-key\n" "gpg (GnuPG) 2.1.8; Copyright (C) 2015 Free Software Foundation, Inc.\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" #. type: delimited block . 4 #: documentation/content/en/articles/committers-guide/_index.adoc:166 #, no-wrap msgid "" "Warning: using insecure memory!\n" "Please select what kind of key you want:\n" " (1) RSA and RSA (default)\n" " (2) DSA and Elgamal\n" " (3) DSA (sign only)\n" " (4) RSA (sign only)\n" "Your selection? 1\n" "RSA keys may be between 1024 and 4096 bits long.\n" "What keysize do you want? (2048) 2048 <.>\n" "Requested keysize is 2048 bits\n" "Please specify how long the key should be valid.\n" "\t 0 = key does not expire\n" " = key expires in n days\n" " w = key expires in n weeks\n" " m = key expires in n months\n" " y = key expires in n years\n" "Key is valid for? (0) 3y <.>\n" "Key expires at Wed Nov 4 17:20:20 2015 MST\n" "Is this correct? (y/N) y\n" "GnuPG needs to construct a user ID to identify your key.\n" msgstr "" "Warning: using insecure memory!\n" "Please select what kind of key you want:\n" " (1) RSA and RSA (default)\n" " (2) DSA and Elgamal\n" " (3) DSA (sign only)\n" " (4) RSA (sign only)\n" "Your selection? 1\n" "RSA keys may be between 1024 and 4096 bits long.\n" "What keysize do you want? (2048) 2048 <.>\n" "Requested keysize is 2048 bits\n" "Please specify how long the key should be valid.\n" "\t 0 = key does not expire\n" " = key expires in n days\n" " w = key expires in n weeks\n" " m = key expires in n months\n" " y = key expires in n years\n" "Key is valid for? (0) 3y <.>\n" "Key expires at Wed Nov 4 17:20:20 2015 MST\n" "Is this correct? (y/N) y\n" "GnuPG needs to construct a user ID to identify your key.\n" #. type: delimited block . 4 #: documentation/content/en/articles/committers-guide/_index.adoc:172 #, no-wrap msgid "" "Real name: Chucky Daemon <.>\n" "Email address: notreal@example.com\n" "Comment:\n" "You selected this USER-ID:\n" "\"Chucky Daemon \"\n" msgstr "" "Real name: Chucky Daemon <.>\n" "Email address: notreal@example.com\n" "Comment:\n" "You selected this USER-ID:\n" "\"Chucky Daemon \"\n" #. type: delimited block . 4 #: documentation/content/en/articles/committers-guide/_index.adoc:175 #, no-wrap msgid "" "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o\n" "You need a Passphrase to protect your secret key.\n" msgstr "" "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o\n" "You need a Passphrase to protect your secret key.\n" #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:178 msgid "" "2048-bit keys with a three-year expiration provide adequate protection at " "present (2022-10)." msgstr "" "2048-битные ключи с трехлетним сроком действия обеспечивают достаточную " "защиту на данный момент (2022-10)." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:180 msgid "" "A three year key lifespan is short enough to obsolete keys weakened by " "advancing computer power, but long enough to reduce key management problems." msgstr "" "Срок действия ключа в три года достаточно мал, чтобы устаревшие ключи, " "ослабленные растущей мощностью компьютеров, перестали использоваться, но " "достаточно велик, чтобы уменьшить проблемы управления ключами." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:182 msgid "" "Use your real name here, preferably matching that shown on government-issued " "ID to make it easier for others to verify your identity. Text that may help " "others identify you can be entered in the `Comment` section." msgstr "" "Используйте здесь своё настоящее имя, предпочтительно совпадающее с " "указанным в удостоверении личности, выданном государством, чтобы другим было " "проще подтвердить вашу личность. Текст, который может помочь другим " "идентифицировать вас, можно ввести в раздел `Комментарий`." #. type: Plain text #: documentation/content/en/articles/committers-guide/_index.adoc:186 msgid "" "After the email address is entered, a passphrase is requested. Methods of " "creating a secure passphrase are contentious. Rather than suggest a single " "way, here are some links to sites that describe various methods: https://" "world.std.com/~reinhold/diceware.html[], https://www.iusmentis.com/security/" "passphrasefaq/[], https://xkcd.com/936/[], https://en.wikipedia.org/wiki/" "Passphrase[]." msgstr "" "После ввода адреса электронной почты запрашивается парольная фраза. Методы " "создания безопасной парольной фразы вызывают споры. Вместо того чтобы " "предлагать один способ, вот несколько ссылок на сайты, описывающие различные " "методы: https://world.std.com/~reinhold/diceware.html[], https://www." "iusmentis.com/security/passphrasefaq/[], https://xkcd.com/936/[], https://en." "wikipedia.org/wiki/Passphrase[]." #. type: delimited block = 4 #: documentation/content/en/articles/committers-guide/_index.adoc:190 msgid "" "Protect the private key and passphrase. If either the private key or " "passphrase may have been compromised or disclosed, immediately notify mailto:" "accounts@FreeBSD.org[accounts@FreeBSD.org] and revoke the key." msgstr "" "Защитите закрытый ключ и парольную фразу. Если закрытый ключ или парольная " "фраза могли быть скомпрометированы или раскрыты, немедленно уведомите mailto:" "accounts@FreeBSD.org[accounts@FreeBSD.org] и отзовите ключ." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:193 +#: documentation/content/en/articles/committers-guide/_index.adoc:192 msgid "" "Committing the new key is shown in crossref:committers-guide[commit-steps, " "Steps for New Committers]." msgstr "" "Фиксация нового ключа показана в crossref:committers-guide[commit-steps, " "Шаги для новых коммиттеров]." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:195 +#: documentation/content/en/articles/committers-guide/_index.adoc:194 #, no-wrap msgid "Kerberos and LDAP web Password for FreeBSD Cluster" msgstr "Kerberos и LDAP веб-пароль для кластера FreeBSD" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:200 +#: documentation/content/en/articles/committers-guide/_index.adoc:199 msgid "" "The FreeBSD cluster requires a Kerberos password to access certain " "services. The Kerberos password also serves as the LDAP web password, since " "LDAP is proxying to Kerberos in the cluster. Some of the services which " "require this include:" msgstr "" "Кластер FreeBSD требует пароль Kerberos для доступа к определенным сервисам. " "Пароль Kerberos также служит веб-паролем LDAP, поскольку LDAP проксирует " "запросы к Kerberos в кластере. Некоторые из сервисов, требующих его, " "включают:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:202 +#: documentation/content/en/articles/committers-guide/_index.adoc:201 msgid "https://bugs.freebsd.org/bugzilla[Bugzilla]" msgstr "https://bugs.freebsd.org/bugzilla[Bugzilla]" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:204 +#: documentation/content/en/articles/committers-guide/_index.adoc:203 msgid "" "To create a new Kerberos account in the FreeBSD cluster, or to reset a " "Kerberos password for an existing account using a random password generator:" msgstr "" "Для создания новой учетной записи Kerberos в кластере FreeBSD или сброса " "пароля Kerberos для существующей учетной записи с использованием генератора " "случайных паролей:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:208 +#: documentation/content/en/articles/committers-guide/_index.adoc:207 #, no-wrap msgid "% ssh kpasswd.freebsd.org\n" msgstr "% ssh kpasswd.freebsd.org\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:213 +#: documentation/content/en/articles/committers-guide/_index.adoc:212 msgid "This must be done from a machine outside of the FreeBSD.org cluster." msgstr "" "Это должно быть выполнено с компьютера за пределами кластера FreeBSD.org." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:216 +#: documentation/content/en/articles/committers-guide/_index.adoc:215 msgid "" "A Kerberos password can also be set manually by logging into `freefall." "FreeBSD.org` and running:" msgstr "" "Пароль Kerberos также можно установить вручную, войдя в `freefall.FreeBSD." "org` и выполнив:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:220 +#: documentation/content/en/articles/committers-guide/_index.adoc:219 #, no-wrap msgid "% kpasswd\n" msgstr "% kpasswd\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:226 +#: documentation/content/en/articles/committers-guide/_index.adoc:225 msgid "" "Unless the Kerberos-authenticated services of the FreeBSD.org cluster have " "been used previously, `Client unknown` will be shown. This error means that " "the `ssh kpasswd.freebsd.org` method shown above must be used first to " "initialize the Kerberos account." msgstr "" "Если ранее не использовались аутентифицированные через Kerberos службы " "кластера FreeBSD.org, будет отображено сообщение `Client unknown`. Эта " "ошибка означает, что сначала необходимо использовать метод `ssh kpasswd." "freebsd.org`, показанный выше, для инициализации учётной записи Kerberos." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:229 +#: documentation/content/en/articles/committers-guide/_index.adoc:228 #, no-wrap msgid "Commit Bit Types" msgstr "Типы битов коммита (прав на коммит)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:235 +#: documentation/content/en/articles/committers-guide/_index.adoc:234 msgid "" "The FreeBSD repository has a number of components which, when combined, " "support the basic operating system source, documentation, third party " "application ports infrastructure, and various maintained utilities. When " "FreeBSD commit bits are allocated, the areas of the tree where the bit may " "be used are specified. Generally, the areas associated with a bit reflect " "who authorized the allocation of the commit bit. Additional areas of " "authority may be added at a later date: when this occurs, the committer " "should follow normal commit bit allocation procedures for that area of the " "tree, seeking approval from the appropriate entity and possibly getting a " "mentor for that area for some period of time." msgstr "" "Репозиторий FreeBSD содержит ряд компонентов, которые в совокупности " "поддерживают исходный код базовой операционной системы, документацию, " "инфраструктуру портов сторонних приложений и различные поддерживаемые " "утилиты. При выделении прав на коммит (commit bits) в FreeBSD указываются " "области дерева, где эти права могут быть использованы. Как правило, области, " "связанные с правами, отражают, кто авторизовал их выделение. Дополнительные " "области полномочий могут быть добавлены позже: в этом случае коммиттер " "должен следовать стандартной процедуре выделения прав на коммит для " "соответствующей области дерева, получив одобрение от соответствующей " "инстанции и, возможно, наставника для этой области на некоторый период " "времени." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:241 +#: documentation/content/en/articles/committers-guide/_index.adoc:240 #, no-wrap msgid "__Committer Type__" msgstr "__Тип коммиттера__" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:242 +#: documentation/content/en/articles/committers-guide/_index.adoc:241 #, no-wrap msgid "__Responsible__" msgstr "__Ответственный__" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:244 +#: documentation/content/en/articles/committers-guide/_index.adoc:243 #, no-wrap msgid "__Tree Components__" msgstr "__Компоненты дерева исходного кода__" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:245 +#: documentation/content/en/articles/committers-guide/_index.adoc:244 #, no-wrap msgid "src" msgstr "src" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:246 +#: documentation/content/en/articles/committers-guide/_index.adoc:245 #, no-wrap msgid "srcmgr@" msgstr "srcmgr@" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:248 +#: documentation/content/en/articles/committers-guide/_index.adoc:247 #, no-wrap msgid "src/" msgstr "src/" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:249 +#: documentation/content/en/articles/committers-guide/_index.adoc:248 #, no-wrap msgid "doc" msgstr "doc" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:250 +#: documentation/content/en/articles/committers-guide/_index.adoc:249 #, no-wrap msgid "doceng@" msgstr "doceng@" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:252 +#: documentation/content/en/articles/committers-guide/_index.adoc:251 #, no-wrap msgid "doc/, ports/, src/ documentation" msgstr "документация doc/, ports/, src/" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:253 +#: documentation/content/en/articles/committers-guide/_index.adoc:252 #, no-wrap msgid "ports" msgstr "ports" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:254 +#: documentation/content/en/articles/committers-guide/_index.adoc:253 #, no-wrap msgid "portmgr@" msgstr "portmgr@" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:255 +#: documentation/content/en/articles/committers-guide/_index.adoc:254 #, no-wrap msgid "ports/" msgstr "ports/" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:260 +#: documentation/content/en/articles/committers-guide/_index.adoc:259 msgid "" "Commit bits allocated prior to the development of the notion of areas of " "authority may be appropriate for use in many parts of the tree. However, " "common sense dictates that a committer who has not previously worked in an " "area of the tree seek review prior to committing, seek approval from the " "appropriate responsible party, and/or work with a mentor. Since the rules " "regarding code maintenance differ by area of the tree, this is as much for " "the benefit of the committer working in an area of less familiarity as it is " "for others working on the tree." msgstr "" "Биты коммитов, выделенные до разработки концепции областей ответственности, " "могут быть подходящими для использования во многих частях дерева. Однако " "здравый смысл подсказывает, что коммиттер, ранее не работавший в " "определённой области дерева, должен перед коммитом получить рецензирование " "(review), согласование от соответствующего ответственного лица и/или " "работать с наставником. Поскольку правила поддержки кода различаются в " "зависимости от области дерева, это важно как для самого коммиттера, " "работающего в менее знакомой области, так и для других участников, " "работающих с деревом." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:262 +#: documentation/content/en/articles/committers-guide/_index.adoc:261 msgid "" "Committers are encouraged to seek review for their work as part of the " "normal development process, regardless of the area of the tree where the " "work is occurring." msgstr "" "Коммиттерам рекомендуется запрашивать рецензирование своей работы в рамках " "обычного процесса разработки, независимо от области дерева, в которой " "происходит работа." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:263 +#: documentation/content/en/articles/committers-guide/_index.adoc:262 #, no-wrap msgid "Policy for Committer Activity in Other Trees" msgstr "Политика активности коммиттеров в других деревьях" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:266 +#: documentation/content/en/articles/committers-guide/_index.adoc:265 msgid "" "All committers may modify [.filename]#src/share/misc/committers-*.dot#, [." "filename]#src/usr.bin/calendar/calendars/calendar.freebsd#, and [." "filename]#ports/astro/xearth/files#." msgstr "" "Все коммиттеры могут изменять файлы [.filename]#src/share/misc/committers-*." "dot#, [.filename]#src/usr.bin/calendar/calendars/calendar.freebsd# и [." "filename]#ports/astro/xearth/files#." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:267 +#: documentation/content/en/articles/committers-guide/_index.adoc:266 msgid "" "doc committers may commit documentation changes to [.filename]#src# files, " "such as manual pages, READMEs, fortune databases, calendar files, and " "comment fixes without approval from a src committer, subject to the normal " "care and tending of commits." msgstr "" "Документационные коммиттеры могут вносить изменения в документацию в файлы [." "filename]#src#, такие как руководства, README, базы данных fortune, " "календарные файлы и исправления комментариев, без одобрения коммиттера src, " "при условии соблюдения обычных правил и внимания к коммитам." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:269 +#: documentation/content/en/articles/committers-guide/_index.adoc:268 msgid "" "Any committer may make changes to any other tree with an \"Approved by\" " "from a non-mentored committer with the appropriate bit. Mentored committers " "can provide a \"Reviewed by\" but not an \"Approved by\"." msgstr "" "Любой коммиттер может вносить изменения в любое другое дерево с пометкой " "\"Approved by\" от некурируемого коммиттера с соответствующими правами. " "Курируемые коммиттеры (имеющие наставника) могут предоставлять пометку " "\"Reviewed by\", но не \"Approved by\"." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:270 +#: documentation/content/en/articles/committers-guide/_index.adoc:269 msgid "" "Committers can acquire an additional bit by the usual process of finding a " "mentor who will propose them to srcmgr, doceng, or portmgr, as appropriate. " "When approved, they will be added to 'access' and the normal mentoring " "period will ensue, which will involve a continuing of \"Approved by\" for " "some period." msgstr "" "Коммиттеры могут получить дополнительный бит по обычному процессу: найти " "наставника, который предложит их srcmgr, doceng или portmgr, в зависимости " "от ситуации. После одобрения их добавят в 'access', и начнётся стандартный " "период наставничества, который будет включать продолжение отметки \"Approved " "by\" в течение некоторого времени." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:272 +#: documentation/content/en/articles/committers-guide/_index.adoc:271 #, no-wrap msgid "Documentation Implicit (Blanket) Approval" msgstr "Неявное (по умолчанию) одобрение для документации" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:276 +#: documentation/content/en/articles/committers-guide/_index.adoc:275 msgid "" "Some types of fixes have \"blanket approval\" from the {doceng}, allowing " "any committer to fix those categories of problems on any part of the doc " "tree. These fixes do not need approval or review from a doc committer if " "the author doesn't have a doc commit bit." msgstr "" "Некоторые типы исправлений имеют \"одобрение по умолчанию\" от {doceng}, что " "позволяет любому коммиттеру исправлять эти категории проблем в любой части " "дерева документации. Эти исправления не требуют одобрения или проверки от " "коммиттера документации, если у автора нет прав на коммит в документацию." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:278 +#: documentation/content/en/articles/committers-guide/_index.adoc:277 msgid "Blanket approval applies to these types of fixes:" msgstr "Общее одобрение применяется к следующим типам исправлений:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:280 +#: documentation/content/en/articles/committers-guide/_index.adoc:279 msgid "Typos" msgstr "Опечатки" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:281 +#: documentation/content/en/articles/committers-guide/_index.adoc:280 msgid "Trivial fixes" msgstr "Тривиальные исправления" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:283 +#: documentation/content/en/articles/committers-guide/_index.adoc:282 msgid "" "Punctuation, URLs, dates, paths and file names with outdated or incorrect " "information, and other common mistakes that may confound the readers." msgstr "" "Пунктуация, URL-адреса, даты, пути и имена файлов с устаревшей или " "некорректной информацией, а также другие распространённые ошибки, которые " "могут ввести читателей в заблуждение." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:286 +#: documentation/content/en/articles/committers-guide/_index.adoc:285 msgid "" "Over the years, some implicit approvals were granted in the doc tree. This " "list shows the most common cases:" msgstr "" "За годы в дереве документации были неявно одобрены некоторые случаи. Этот " "список показывает наиболее распространённые из них:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:288 +#: documentation/content/en/articles/committers-guide/_index.adoc:287 msgid "" "Changes in [.filename]#documentation/content/en/books/porters-handbook/" "versions/_index.adoc#" msgstr "" "Изменения в [.filename]#documentation/content/ru/books/porters-handbook/" "versions/_index.adoc#" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:290 +#: documentation/content/en/articles/committers-guide/_index.adoc:289 msgid "" "extref:{porters-handbook}versions/[__FreeBSD_version Values (Porter's " "Handbook)], mainly used for src committers." msgstr "" "extref:{porters-handbook}versions[Значения __FreeBSD_version (Руководство по " "созданию портов)], в основном используется коммиттерами src." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:291 +#: documentation/content/en/articles/committers-guide/_index.adoc:290 msgid "Changes in [.filename]#doc/shared/contrib-additional.adoc#" msgstr "Изменения в [.filename]#doc/shared/contrib-additional.adoc#" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:293 +#: documentation/content/en/articles/committers-guide/_index.adoc:292 msgid "" "extref:{contributors}[Additional FreeBSD Contributors, contrib-additional] " "maintenance." msgstr "" "Сопровождение раздела extref:{contributors}[Дополнительные участники " "FreeBSD, contrib-additional]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:294 +#: documentation/content/en/articles/committers-guide/_index.adoc:293 msgid "All link:#commit-steps[Steps for New Committers], doc related" msgstr "" "Все link:#commit-steps[Шаги для новых коммиттеров], связанные с документацией" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:295 +#: documentation/content/en/articles/committers-guide/_index.adoc:294 msgid "Security advisories; Errata Notices; Releases;" msgstr "Рекомендации по безопасности; Уведомления об ошибках; Релизы;" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:297 +#: documentation/content/en/articles/committers-guide/_index.adoc:296 msgid "Used by {security-officer} and {re}." msgstr "{security-officer} и {re} используют эти разделы." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:298 +#: documentation/content/en/articles/committers-guide/_index.adoc:297 msgid "Changes in [.filename]#website/content/en/donations/donors.adoc#" msgstr "Изменения в [.filename]#website/content/ru/donations/donors.adoc#" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:300 +#: documentation/content/en/articles/committers-guide/_index.adoc:299 msgid "Used by {donations}." msgstr "{donations} использует этот документ." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:302 +#: documentation/content/en/articles/committers-guide/_index.adoc:301 msgid "" "Before any commit, a build test is necessary; see the 'Overview' and 'The " "FreeBSD Documentation Build Process' sections of the extref:{fdp-primer}" "[FreeBSD Documentation Project Primer for New Contributors] for more details." msgstr "" "Перед любым коммитом необходимо выполнить тестовую сборку; подробности см. в " "разделах «Обзор» и «Процесс сборки документации FreeBSD» extref:{fdp-primer}" "[Руководства для новых участников проекта документации FreeBSD]." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:304 +#: documentation/content/en/articles/committers-guide/_index.adoc:303 #, no-wrap msgid "Git Primer" msgstr "Руководство по Git" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:307 +#: documentation/content/en/articles/committers-guide/_index.adoc:306 #, no-wrap msgid "Git basics" msgstr "Основы Git" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:314 +#: documentation/content/en/articles/committers-guide/_index.adoc:313 msgid "" "When one searches for \"Git Primer\" a number of good ones come up. Daniel " "Miessler's link:https://danielmiessler.com/study/git/[A git primer] and " "Willie Willus' link:https://gist.github.com/" "williewillus/068e9a8543de3a7ef80adb2938657b6b[Git - Quick Primer] are both " "good overviews. The Git book is also complete, but much longer https://git-" "scm.com/book/en/v2. There is also this website https://dangitgit.com/ for " "common traps and pitfalls of Git, in case you need guidance to fix things " "up. Finally, an introduction link:https://eagain.net/articles/git-for-" "computer-scientists/[targeted at computer scientists] has proven helpful to " "some at explaining the Git world view." msgstr "" "При поиске по ключевым словам \"Git Primer\" можно найти множество хороших " "материалов. Страницы Дэниела Милера link:https://danielmiessler.com/study/" "git/[Введение в Git] и Вилли Виллуса link:https://gist.github.com/" "williewillus/068e9a8543de3a7ef80adb2938657b6b[Git - Краткое введение] " "являются хорошими обзорами. Книга по Git также полная, но гораздо длиннее: " -"https://git-scm.com/book/en/v2. Также обратите внимание на сайт " -"https://dangitgit.com/, посвящённый распространённым ловушкам и подводным " -"камням Git, на случай, если вам нужно исправить ошибки. Наконец, введение, " -"link:https://eagain.net/articles/git-for-computer-scientists/[" -"ориентированное на компьютерных учёных], оказалось полезным для некоторых в " -"объяснении мировоззрения Git." +"https://git-scm.com/book/en/v2. Также обратите внимание на сайт https://" +"dangitgit.com/, посвящённый распространённым ловушкам и подводным камням " +"Git, на случай, если вам нужно исправить ошибки. Наконец, введение, link:" +"https://eagain.net/articles/git-for-computer-scientists/[ориентированное на " +"компьютерных учёных], оказалось полезным для некоторых в объяснении " +"мировоззрения Git." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:316 +#: documentation/content/en/articles/committers-guide/_index.adoc:315 msgid "" "This document will assume that you've read through it and will try not to " "belabor the basics (though it will cover them briefly)." msgstr "" "Этот документ предполагает, что вы уже читали про это, и постарается не " "повторять основы (хотя кратко их рассмотрит)." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:318 +#: documentation/content/en/articles/committers-guide/_index.adoc:317 #, no-wrap msgid "Git Mini Primer" msgstr "Мини-руководство по Git" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:321 +#: documentation/content/en/articles/committers-guide/_index.adoc:320 msgid "" "This primer is less ambitiously scoped than the old Subversion Primer, but " "should cover the basics." msgstr "" "Это руководство имеет менее амбициозные цели, чем старое руководство по " "Subversion, но должно охватить основы." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:322 +#: documentation/content/en/articles/committers-guide/_index.adoc:321 #, no-wrap msgid "Scope" msgstr "Область применения" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:328 +#: documentation/content/en/articles/committers-guide/_index.adoc:327 msgid "" "If you want to download FreeBSD, compile it from sources, and generally keep " "up to date that way, this primer is for you. It covers getting the sources, " "updating the sources, bisecting and touches briefly on how to cope with a " "few local changes. It covers the basics, and tries to give good pointers to " "more in-depth treatment for when the reader finds the basics insufficient. " "Other sections of this guide cover more advanced topics related to " "contributing to the project." msgstr "" "Если вы хотите загрузить FreeBSD, собрать его из исходных кодов и в целом " "поддерживать актуальность таким способом, это руководство для вас. Оно " "охватывает получение исходных кодов, их обновление, бинарный поиск (bisect) " "и кратко затрагивает способы работы с локальными изменениями. В нём изложены " "основы, а также даны полезные ссылки на более глубокие материалы для " "случаев, когда читателю будет недостаточно базовой информации. Другие " "разделы этого руководства посвящены более сложным темам, связанным с " "участием в проекте." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:332 +#: documentation/content/en/articles/committers-guide/_index.adoc:331 msgid "" "The goal of this section is to highlight those bits of Git needed to track " "sources. They assume a basic understanding of Git. There are many primers " "for Git on the web, but the https://git-scm.com/book/en/v2[Git Book] " "provides one of the better treatments." msgstr "" "Цель этого раздела — выделить те аспекты Git, которые необходимы для " "отслеживания исходных кодов. Предполагается базовое понимание Git. В " "интернете есть множество вводных руководств по Git, но https://git-scm.com/" "book/en/v2[Книга по Git] предлагает одно из лучших изложений." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:334 +#: documentation/content/en/articles/committers-guide/_index.adoc:333 #, no-wrap msgid "Getting Started For Developers" msgstr "Начало работы для разработчиков" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:337 +#: documentation/content/en/articles/committers-guide/_index.adoc:336 msgid "" "This section describes the read-write access for committers to push the " "commits from developers or contributors." msgstr "" "Этот раздел описывает доступ на чтение и запись для коммиттеров, чтобы " "отправлять коммиты от разработчиков или контрибьюторов." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:339 +#: documentation/content/en/articles/committers-guide/_index.adoc:338 #, no-wrap msgid "Daily use" msgstr "Повседневное использование" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:344 +#: documentation/content/en/articles/committers-guide/_index.adoc:343 msgid "" "In the examples below, replace `${repo}` with the name of the desired " "FreeBSD repository: `doc`, `ports`, or `src`." msgstr "" "В приведенных ниже примерах замените `${repo}` на имя нужного репозитория " "FreeBSD: `doc`, `ports` или `src`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:347 +#: documentation/content/en/articles/committers-guide/_index.adoc:346 msgid "Clone the repository:" msgstr "Клонировать репозиторий:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:351 +#: documentation/content/en/articles/committers-guide/_index.adoc:350 #, no-wrap msgid "% git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' https://git.freebsd.org/${repo}.git\n" msgstr "% git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' https://git.freebsd.org/${repo}.git\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:354 +#: documentation/content/en/articles/committers-guide/_index.adoc:353 msgid "Then you should have the official mirrors as your remote:" msgstr "" "В результате у вас в качестве удалённых (remote) должны быть официальные " "зеркала:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:360 +#: documentation/content/en/articles/committers-guide/_index.adoc:359 #, no-wrap msgid "" "% git remote -v\n" "freebsd https://git.freebsd.org/${repo}.git (fetch)\n" "freebsd https://git.freebsd.org/${repo}.git (push)\n" msgstr "" "% git remote -v\n" "freebsd https://git.freebsd.org/${repo}.git (fetch)\n" "freebsd https://git.freebsd.org/${repo}.git (push)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:363 +#: documentation/content/en/articles/committers-guide/_index.adoc:362 msgid "Configure the FreeBSD committer data:" msgstr "Настройка данных коммиттера FreeBSD:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:366 +#: documentation/content/en/articles/committers-guide/_index.adoc:365 msgid "" "The commit hook in repo.freebsd.org checks the \"Commit\" field matches the " "committer's information in FreeBSD.org. The easiest way to get the " "suggested config is by executing `/usr/local/bin/gen-gitconfig.sh` script on " "freefall:" msgstr "" "Хук для коммита в repo.freebsd.org проверяет, что поле \"Commit\" " "соответствует информации о коммиттере в FreeBSD.org. Самый простой способ " "получить предлагаемую конфигурацию — выполнить скрипт `/usr/local/bin/gen-" "gitconfig.sh` на freefall:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:373 +#: documentation/content/en/articles/committers-guide/_index.adoc:372 #, no-wrap msgid "" "% gen-gitconfig.sh\n" "[...]\n" "% git config user.name (your name in gecos)\n" "% git config user.email (your login)@FreeBSD.org\n" msgstr "" "% gen-gitconfig.sh\n" "[...]\n" "% git config user.name (your name in gecos)\n" "% git config user.email (your login)@FreeBSD.org\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:376 +#: documentation/content/en/articles/committers-guide/_index.adoc:375 msgid "Set the push URL:" msgstr "Установите URL для отправки (push URL):" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:380 +#: documentation/content/en/articles/committers-guide/_index.adoc:379 #, no-wrap msgid "% git remote set-url --push freebsd git@gitrepo.freebsd.org:${repo}.git\n" msgstr "% git remote set-url --push freebsd git@gitrepo.freebsd.org:${repo}.git\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:383 +#: documentation/content/en/articles/committers-guide/_index.adoc:382 msgid "" "Then you should have separated fetch and push URLs as the most efficient " "setup:" msgstr "" "В таком случае у вас должны быть раздельные URL для извлечения (fetch) и " "отправки (push) как наиболее эффективная настройка:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:389 +#: documentation/content/en/articles/committers-guide/_index.adoc:388 #, no-wrap msgid "" "% git remote -v\n" "freebsd https://git.freebsd.org/${repo}.git (fetch)\n" "freebsd git@gitrepo.freebsd.org:${repo}.git (push)\n" msgstr "" "% git remote -v\n" "freebsd https://git.freebsd.org/${repo}.git (fetch)\n" "freebsd git@gitrepo.freebsd.org:${repo}.git (push)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:392 +#: documentation/content/en/articles/committers-guide/_index.adoc:391 msgid "" "Again, note that `gitrepo.freebsd.org` has been canonicalized to `repo." "freebsd.org`." msgstr "" "Еще раз обратите внимание, что `gitrepo.freebsd.org` является псевдонимом " "для `repo.freebsd.org`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:394 +#: documentation/content/en/articles/committers-guide/_index.adoc:393 msgid "Install commit message template hook:" msgstr "Установка хука для шаблона сообщения коммита:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:396 +#: documentation/content/en/articles/committers-guide/_index.adoc:395 msgid "For doc repository:" msgstr "Для репозитория документации:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:401 +#: documentation/content/en/articles/committers-guide/_index.adoc:400 #, no-wrap msgid "" "% cd .git/hooks\n" "% ln -s ../../.hooks/prepare-commit-msg\n" msgstr "" "% cd .git/hooks\n" "% ln -s ../../.hooks/prepare-commit-msg\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:404 +#: documentation/content/en/articles/committers-guide/_index.adoc:403 msgid "For ports repository:" msgstr "Для репозитория портов:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:408 +#: documentation/content/en/articles/committers-guide/_index.adoc:407 #, no-wrap msgid "% git config --add core.hooksPath .hooks\n" msgstr "% git config --add core.hooksPath .hooks\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:411 +#: documentation/content/en/articles/committers-guide/_index.adoc:410 msgid "For src repository:" msgstr "Для репозитория src:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:416 +#: documentation/content/en/articles/committers-guide/_index.adoc:415 #, no-wrap msgid "" "% cd .git/hooks\n" "% ln -s ../../tools/tools/git/hooks/prepare-commit-msg\n" msgstr "" "% cd .git/hooks\n" "% ln -s ../../tools/tools/git/hooks/prepare-commit-msg\n" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:419 +#: documentation/content/en/articles/committers-guide/_index.adoc:418 #, no-wrap msgid "\"admin\" branch" msgstr "Ветка \"admin\"" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:422 +#: documentation/content/en/articles/committers-guide/_index.adoc:421 msgid "" "The `access` and `mentors` files are stored in an orphan branch, `internal/" "admin`, in each repository." msgstr "" "Файлы `access` и `mentors` хранятся в отдельной (orphan) ветке `internal/" "admin` в каждом репозитории." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:424 +#: documentation/content/en/articles/committers-guide/_index.adoc:423 msgid "" "Following example is how to check out the `internal/admin` branch to a local " "branch named `admin`:" msgstr "" "Следующий пример показывает, как переключиться (check out) на ветку " "`internal/admin` в локальной ветке с именем `admin`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:430 +#: documentation/content/en/articles/committers-guide/_index.adoc:429 #, no-wrap msgid "" "% git config --add remote.freebsd.fetch '+refs/internal/*:refs/internal/*'\n" "% git fetch\n" "% git checkout -b admin internal/admin\n" msgstr "" "% git config --add remote.freebsd.fetch '+refs/internal/*:refs/internal/*'\n" "% git fetch\n" "% git checkout -b admin internal/admin\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:432 +#: documentation/content/en/articles/committers-guide/_index.adoc:431 msgid "Alternatively, you can add a worktree for the `admin` branch:" msgstr "" "В качестве альтернативы вы можете добавить рабочее дерево для ветки `admin`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:436 +#: documentation/content/en/articles/committers-guide/_index.adoc:435 #, no-wrap msgid "git worktree add -b admin ../${repo}-admin internal/admin\n" msgstr "git worktree add -b admin ../${repo}-admin internal/admin\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:440 +#: documentation/content/en/articles/committers-guide/_index.adoc:439 msgid "" "For browsing `internal/admin` branch on web: `https://cgit.freebsd.org/" "${repo}/log/?h=internal/admin`" msgstr "" "Для просмотра ветки `internal/admin` в веб-интерфейсе: `https://cgit.freebsd." "org/${repo}/log/?h=internal/admin`" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:442 +#: documentation/content/en/articles/committers-guide/_index.adoc:441 msgid "For pushing, specify the full refspec:" msgstr "Для отправки (push) укажите полную спецификацию ссылки:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:446 +#: documentation/content/en/articles/committers-guide/_index.adoc:445 #, no-wrap msgid "git push freebsd HEAD:refs/internal/admin\n" msgstr "git push freebsd HEAD:refs/internal/admin\n" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:448 +#: documentation/content/en/articles/committers-guide/_index.adoc:447 #, no-wrap msgid "Keeping Current With The FreeBSD src Tree" msgstr "Как поддерживать актуальную копию дерева исходных кодов FreeBSD src" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:455 +#: documentation/content/en/articles/committers-guide/_index.adoc:454 msgid "" "First step: cloning a tree. This downloads the entire tree. There are two " "ways to download. Most people will want to do a deep clone of the " "repository. However, there are times when you may wish to do a shallow " "clone." msgstr "" "Первый шаг: клонирование дерева. Это загружает всё дерево целиком. " "Существует два способа загрузки. Большинству пользователей потребуется " "глубокое клонирование репозитория. Однако бывают случаи, когда может " "потребоваться поверхностное клонирование." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:456 +#: documentation/content/en/articles/committers-guide/_index.adoc:455 #, no-wrap msgid "Branch Names" msgstr "Названия веток" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:458 +#: documentation/content/en/articles/committers-guide/_index.adoc:457 msgid "FreeBSD-CURRENT uses the `main` branch." msgstr "FreeBSD-CURRENT использует ветку `main`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:460 +#: documentation/content/en/articles/committers-guide/_index.adoc:459 msgid "`main` is the default branch." msgstr "`main` — это ветка по умолчанию." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:462 +#: documentation/content/en/articles/committers-guide/_index.adoc:461 msgid "For FreeBSD-STABLE, branch names include `stable/12` and `stable/13`." msgstr "Для FreeBSD-STABLE названия веток включают `stable/12` и `stable/13`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:464 +#: documentation/content/en/articles/committers-guide/_index.adoc:463 msgid "" "For FreeBSD-RELEASE, release engineering branch names include `releng/12.4` " "and `releng/13.2`." msgstr "" -"Для FreeBSD-RELEASE, названия веток разработки выпусков включают `releng/12." -"4` и `releng/13.2`." +"Для FreeBSD-RELEASE, названия веток разработки выпусков включают " +"`releng/12.4` и `releng/13.2`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:466 +#: documentation/content/en/articles/committers-guide/_index.adoc:465 msgid "https://www.freebsd.org/releng/[] shows:" msgstr "https://www.freebsd.org/releng/[] отображает:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:468 +#: documentation/content/en/articles/committers-guide/_index.adoc:467 msgid "`main` and `stable/⋯` branches open" msgstr "ветки `main` и `stable/⋯` открыты" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:469 +#: documentation/content/en/articles/committers-guide/_index.adoc:468 msgid "`releng/⋯` branches, each of which is frozen when a release is tagged." msgstr "" "ветки `releng/⋯`, каждая из которых замораживается при создании тега релиза." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:471 +#: documentation/content/en/articles/committers-guide/_index.adoc:470 msgid "Examples:" msgstr "Примеры:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:473 +#: documentation/content/en/articles/committers-guide/_index.adoc:472 msgid "" "tag https://cgit.freebsd.org/src/tag/?h=release/13.1.0[release/13.1.0] on " "the https://cgit.freebsd.org/src/log/?h=releng/13.1[releng/13.1] branch" msgstr "" "тег https://cgit.freebsd.org/src/tag/?h=release/13.1.0[release/13.1.0] на " "ветке https://cgit.freebsd.org/src/log/?h=releng/13.1[releng/13.1]" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:474 +#: documentation/content/en/articles/committers-guide/_index.adoc:473 msgid "" "tag https://cgit.freebsd.org/src/tag/?h=release/13.2.0[release/13.2.0] on " "the https://cgit.freebsd.org/src/log/?h=releng/13.2[releng/13.2] branch." msgstr "" "тег https://cgit.freebsd.org/src/tag/?h=release/13.2.0[release/13.2.0] на " "ветке https://cgit.freebsd.org/src/log/?h=releng/13.2[releng/13.2]." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:475 +#: documentation/content/en/articles/committers-guide/_index.adoc:474 #, no-wrap msgid "Repositories" msgstr "Репозитории" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:478 +#: documentation/content/en/articles/committers-guide/_index.adoc:477 msgid "" "Please see the crossref:committers-guide[admin,Administrative Details] for " "the latest information on where to get FreeBSD sources. $URL below can be " "obtained from that page." msgstr "" -"Пожалуйста, обратитесь к разделу crossref:committers-guide[" -"admin,Административные детали] для получения актуальной информации о том, " -"где взять исходные коды FreeBSD. Значение $URL ниже можно получить с этой " +"Пожалуйста, обратитесь к разделу crossref:committers-guide[admin," +"Административные детали] для получения актуальной информации о том, где " +"взять исходные коды FreeBSD. Значение $URL ниже можно получить с этой " "страницы." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:481 +#: documentation/content/en/articles/committers-guide/_index.adoc:480 msgid "" "Note: The project doesn't use submodules as they are a poor fit for our " "workflows and development model. How we track changes in third-party " "applications is discussed elsewhere and generally of little concern to the " "casual user." msgstr "" "Примечание: Проект не использует подмодули, так как они плохо подходят для " "наших рабочих процессов и модели разработки. То, как мы отслеживаем " "изменения в сторонних приложениях, обсуждается в другом месте и, как " "правило, мало интересует обычного пользователя." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:482 +#: documentation/content/en/articles/committers-guide/_index.adoc:481 #, no-wrap msgid "Deep Clone" msgstr "Полный клон" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:486 +#: documentation/content/en/articles/committers-guide/_index.adoc:485 msgid "" "A deep clone pulls in the entire tree, as well as all the history and " "branches. It is the easiest to do. It also allows you to use Git's " "worktree feature to have all your active branches checked out into separate " "directories but with only one copy of the repository." msgstr "" "Полный клон загружает всё дерево целиком, включая всю историю и ветки. Это " "самый простой способ. Он также позволяет использовать функцию Git " "`worktree`, чтобы все активные ветки были извлечены в отдельные каталоги, но " "с единственной копией репозитория." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:489 +#: documentation/content/en/articles/committers-guide/_index.adoc:488 #, no-wrap msgid "% git clone -o freebsd $URL -b branch []\n" msgstr "% git clone -o freebsd $URL -b branch []\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:494 +#: documentation/content/en/articles/committers-guide/_index.adoc:493 msgid "" "will create a deep clone. `branch` should be one of the branches listed in " "the previous section. If no `branch` is given: the default (`main`) will be " "used. If no `` is given: the name of the new directory will " "match the name of the repo ([.filename]#doc#, [.filename]#ports# or [." "filename]#src#)." msgstr "" "создаст полную копию. `branch` должна быть одной из веток, перечисленных в " "предыдущем разделе. Если параметр `branch` не указан: будет использоваться " "ветка по умолчанию (`main`). Если параметр `` не указан: имя " "нового каталога будет соответствовать имени репозитория ([.filename]#doc#, [." "filename]#ports# или [.filename]#src#)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:499 +#: documentation/content/en/articles/committers-guide/_index.adoc:498 msgid "" "You will want a deep clone if you are interested in the history, plan on " "making local changes, or plan on working on more than one branch. It is the " "easiest to keep up to date as well. If you are interested in the history, " "but are working with only one branch and are short on space, you can also " "use --single-branch to only download the one branch (though some merge " "commits will not reference the merged-from branch which may be important for " "some users who are interested in detailed versions of history)." msgstr "" "Вам понадобится полный клон, если вас интересует история, вы планируете " "вносить локальные изменения или работать более чем с одной веткой. Это также " "самый простой способ поддерживать актуальность. Если вас интересует история, " "но вы работаете только с одной веткой и у вас мало места, вы также можете " "использовать `--single-branch`, чтобы загрузить только одну ветку (хотя " "некоторые коммиты слияния не будут ссылаться на ветку, из которой произошло " "слияние, что может быть важно для некоторых пользователей, интересующихся " "детальными версиями истории)." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:500 +#: documentation/content/en/articles/committers-guide/_index.adoc:499 #, no-wrap msgid "Shallow Clone" msgstr "Частичный клон" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:506 +#: documentation/content/en/articles/committers-guide/_index.adoc:505 msgid "" "A shallow clone copies just the most current code, but none or little of the " "history. This can be useful when you need to build a specific revision of " "FreeBSD, or when you are just starting out and plan to track the tree more " "fully. You can also use it to limit history to only so many revisions. " "However, see below for a significant limitation of this approach." msgstr "" "Частичный клон копирует только самый актуальный код, но не включает или " "включает лишь малую часть истории. Это может быть полезно, когда вам нужно " "собрать определённую ревизию FreeBSD или когда вы только начинаете и " "планируете более полно отслеживать дерево. Также вы можете использовать его, " "чтобы ограничить историю только определённым количеством ревизий. Однако " "обратите внимание на существенное ограничение этого подхода, описанное ниже." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:510 +#: documentation/content/en/articles/committers-guide/_index.adoc:509 #, no-wrap msgid "% git clone -o freebsd -b branch --depth 1 $URL [dir]\n" msgstr "% git clone -o freebsd -b branch --depth 1 $URL [dir]\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:515 +#: documentation/content/en/articles/committers-guide/_index.adoc:514 msgid "" "This clones the repository, but only has the most recent version in the " "repository. The rest of the history is not downloaded. Should you change " "your mind later, you can do `git fetch --unshallow` to get the old history." msgstr "" "Это клонирует репозиторий, но будет содержать только самую последнюю версию " "в репозитории. Остальная история не загружается. Если позже вы передумаете, " "вы можете выполнить `git fetch --unshallow`, чтобы получить старую историю." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:520 +#: documentation/content/en/articles/committers-guide/_index.adoc:519 msgid "" "When you make a shallow clone, you will lose the commit count in your uname " "output. This can make it more difficult to determine if your system needs " "to be updated when a security advisory is issued." msgstr "" "При частичном клонировании вы потеряете счетчик коммитов в выводе команды " "uname. Это может затруднить определение необходимости обновления системы при " "выпуске бюллетеня безопасности." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:522 +#: documentation/content/en/articles/committers-guide/_index.adoc:521 #, no-wrap msgid "Building" msgstr "Сборка" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:526 +#: documentation/content/en/articles/committers-guide/_index.adoc:525 msgid "" "Once you've downloaded, building is done as described in the handbook, e.g.:" msgstr "" "После загрузки сборка выполняется так, как описано в руководстве, например:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:533 +#: documentation/content/en/articles/committers-guide/_index.adoc:532 #, no-wrap msgid "" "% cd src\n" "% make buildworld\n" "% make buildkernel\n" "% make installkernel\n" "% make installworld\n" msgstr "" "% cd src\n" "% make buildworld\n" "% make buildkernel\n" "% make installkernel\n" "% make installworld\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:535 +#: documentation/content/en/articles/committers-guide/_index.adoc:534 msgid "so that won't be covered in depth here." msgstr "так что здесь это не будет рассматриваться подробно." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:538 +#: documentation/content/en/articles/committers-guide/_index.adoc:537 msgid "" -"If you want to build a custom kernel, extref:{handbook}[the kernel config " -"section, kernelconfig] of the FreeBSD Handbook recommends creating a file " -"MYKERNEL under sys/${ARCH}/conf with your changes against GENERIC. To have " -"MYKERNEL disregarded by Git, it can be added to .git/info/exclude." +"If you want to build a custom kernel, extref:{handbook}kernelconfig[the " +"kernel config section, kernelconfig] of the FreeBSD Handbook recommends " +"creating a file MYKERNEL under sys/${ARCH}/conf with your changes against " +"GENERIC. To have MYKERNEL disregarded by Git, it can be added to .git/info/" +"exclude." msgstr "" "Если вы хотите собрать собственное ядро, в extref:{handbook}kernelconfig[" "разделе конфигурации ядра, kernelconfig] руководства FreeBSD рекомендуется " "создать файл MYKERNEL в sys/${ARCH}/conf с вашими изменениями на основе " "GENERIC. Чтобы Git игнорировал MYKERNEL, его можно добавить в .git/info/" "exclude." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:539 +#: documentation/content/en/articles/committers-guide/_index.adoc:538 #, no-wrap msgid "Updating" msgstr "Обновление" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:543 +#: documentation/content/en/articles/committers-guide/_index.adoc:542 msgid "" "To update both types of trees uses the same commands. This pulls in all the " "revisions since your last update." msgstr "" "Для обновления обоих типов деревьев используются одинаковые команды. Это " "загружает (pull) все изменения, сделанные после последнего обновления." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:546 +#: documentation/content/en/articles/committers-guide/_index.adoc:545 #, no-wrap msgid "% git pull --ff-only\n" msgstr "% git pull --ff-only\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:551 +#: documentation/content/en/articles/committers-guide/_index.adoc:550 msgid "" "will update the tree. In Git, a 'fast forward' merge is one that only needs " "to set a new branch pointer and doesn't need to re-create the commits. By " "always doing a fast forward merge/pull, you'll ensure that you have an exact " "copy of the FreeBSD tree. This will be important if you want to maintain " "local patches." msgstr "" "обновит дерево. В Git 'перемотка' (fast forward) — это слияние, которое " "только перемещает указатель ветки и не требует пересоздания коммитов. Если " "всегда выполнять слияние/загрузку (merge/pull) с перемоткой, это гарантирует " "точную копию дерева FreeBSD. Это важно, если вы хотите поддерживать " "локальные патчи." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:554 +#: documentation/content/en/articles/committers-guide/_index.adoc:553 msgid "" "See below for how to manage local changes. The simplest is to use `--" "autostash` on the `git pull` command, but more sophisticated options are " "available." msgstr "" "См. ниже, как управлять локальными изменениями. Самый простой способ — " "использовать `--autostash` в команде `git pull`, но доступны и более сложные " "варианты." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:555 +#: documentation/content/en/articles/committers-guide/_index.adoc:554 #, no-wrap msgid "Selecting a Specific Version" msgstr "Выбор конкретной версии" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:559 +#: documentation/content/en/articles/committers-guide/_index.adoc:558 msgid "" "In Git, `git checkout` checks out both branches and specific versions. " "Git's versions are the long hashes rather than a sequential number." msgstr "" "В Git команда `git checkout` используется для переключения как между " "ветками, так и между конкретными версиями. Версии в Git представляют собой " "длинные хеши, а не последовательные номера." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:561 +#: documentation/content/en/articles/committers-guide/_index.adoc:560 msgid "" "When you checkout a specific version, just specify the hash you want on the " "command line (the git log command can help you decide which hash you might " "want):" msgstr "" "Когда вы извлекаете конкретную версию, просто укажите нужный хэш в командной " "строке (команда `git log` может помочь вам определиться, какой хэш выбрать):" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:564 +#: documentation/content/en/articles/committers-guide/_index.adoc:563 #, no-wrap msgid "% git checkout 08b8197a74\n" msgstr "% git checkout 08b8197a74\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:567 +#: documentation/content/en/articles/committers-guide/_index.adoc:566 msgid "" "and you have that checked out. You will be greeted with a message similar " "to the following:" msgstr "" "и вам это скопировано (checkout). Вы увидите сообщение, похожее на следующее:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:570 +#: documentation/content/en/articles/committers-guide/_index.adoc:569 #, no-wrap msgid "Note: checking out '08b8197a742a96964d2924391bf9fdfeb788865d'.\n" msgstr "Note: checking out '08b8197a742a96964d2924391bf9fdfeb788865d'.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:574 +#: documentation/content/en/articles/committers-guide/_index.adoc:573 #, no-wrap msgid "" "You are in a 'detached HEAD' state. You can look around, make experimental\n" "changes and commit them, and you can discard any commits you make in this\n" "state without impacting any branches by performing another checkout.\n" msgstr "" "You are in a 'detached HEAD' state. You can look around, make experimental\n" "changes and commit them, and you can discard any commits you make in this\n" "state without impacting any branches by performing another checkout.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:577 -#: documentation/content/en/articles/committers-guide/_index.adoc:1746 +#: documentation/content/en/articles/committers-guide/_index.adoc:576 +#: documentation/content/en/articles/committers-guide/_index.adoc:1745 #, no-wrap msgid "" "If you want to create a new branch to retain commits you create, you may\n" "do so (now or later) by using -b with the checkout command again. Example:\n" msgstr "" "If you want to create a new branch to retain commits you create, you may\n" "do so (now or later) by using -b with the checkout command again. Example:\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:579 -#: documentation/content/en/articles/committers-guide/_index.adoc:1748 +#: documentation/content/en/articles/committers-guide/_index.adoc:578 +#: documentation/content/en/articles/committers-guide/_index.adoc:1747 #, no-wrap msgid " git checkout -b \n" msgstr " git checkout -b \n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:581 +#: documentation/content/en/articles/committers-guide/_index.adoc:580 #, no-wrap msgid "HEAD is now at 08b8197a742a hook gpiokeys.4 to the build\n" msgstr "HEAD is now at 08b8197a742a hook gpiokeys.4 to the build\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:585 +#: documentation/content/en/articles/committers-guide/_index.adoc:584 msgid "" "where the last line is generated from the hash you are checking out and the " "first line of the commit message from that revision. The hash can be " "abbreviated to the shortest unique length. Git itself is inconsistent about " "how many digits it displays." msgstr "" "где последняя строка формируется из хэша, который вы использовали для " "извлечения рабочей копии, и первой строки сообщения коммита из этой ревизии. " "Хэш может быть сокращен до минимальной уникальной длины. Сам Git не всегда " "последователен в том, сколько цифр он отображает." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:586 +#: documentation/content/en/articles/committers-guide/_index.adoc:585 #, no-wrap msgid "Bisecting" msgstr "Бинарный поиск (bisect)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:590 +#: documentation/content/en/articles/committers-guide/_index.adoc:589 msgid "" "Sometimes, things go wrong. The last version worked, but the one you just " "updated to does not. A developer may ask you to bisect the problem to track " "down which commit caused the regression." msgstr "" "Иногда что-то идёт не так. Последняя версия работала, но только что " "обновлённая — нет. Разработчик может попросить вас провести бинарный поиск " "проблемы, чтобы определить, какой коммит вызвал регрессию." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:595 +#: documentation/content/en/articles/committers-guide/_index.adoc:594 msgid "" "Git makes bisecting changes easy with a powerful `git bisect` command. " "Here's a brief outline of how to use it. For more information, you can view " "https://www.metaltoad.com/blog/beginners-guide-git-bisect-process-" "elimination or https://git-scm.com/docs/git-bisect for more details. The " "man git-bisect page is good at describing what can go wrong, what to do when " "versions won't build, when you want to use terms other than 'good' and " "'bad', etc, none of which will be covered here." msgstr "" "Git упрощает поиск изменений с помощью мощной команды `git bisect`. Вот " "краткое описание, как её использовать. Для получения дополнительной " "информации вы можете посмотреть https://www.metaltoad.com/blog/beginners-" "guide-git-bisect-process-elimination или https://git-scm.com/docs/git-" "bisect. Страница man git-bisect хорошо описывает, что может пойти не так, " "что делать, когда версии не собираются, в каких ситуациях вам лучше " "использовать другие условия поиска, а не 'хорошо (good)' и 'плохо (bad)', и " "так далее, но это здесь не будет рассматриваться." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:602 +#: documentation/content/en/articles/committers-guide/_index.adoc:601 msgid "" "`git bisect start --first-parent` will start the bisection process. Next, " "you need to tell a range to go through. `git bisect good XXXXXX` will tell " "it the working version and `git bisect bad XXXXX` will tell it the bad " "version. The bad version will almost always be HEAD (a special tag for what " "you have checked out). The good version will be the last one you checked " "out. The `--first-parent` argument is necessary so that subsequent `git " "bisect` commands do not try to check out a vendor branch which lacks the " "full FreeBSD source tree." msgstr "" "`git bisect start --first-parent` запустит процесс бинарного поиска. Далее " "необходимо указать диапазон для проверки. `git bisect good XXXXXX` укажет " "рабочую версию, а `git bisect bad XXXXX` — нерабочую версию. Нерабочая " "версия почти всегда будет HEAD (специальный тег для текущего состояния). " "Рабочая версия будет последней, которую вы проверяли. Аргумент `--first-" "parent` необходим, чтобы последующие команды `git bisect` не пытались " "переключиться на ветку вендора, в которой отсутствует полное дерево " "исходников FreeBSD." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:606 +#: documentation/content/en/articles/committers-guide/_index.adoc:605 msgid "" "If you want to know the last version you checked out, you should use `git " "reflog`:" msgstr "" "Если вы хотите узнать последнюю версию, которую вы извлекли, используйте " "`git reflog`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:611 +#: documentation/content/en/articles/committers-guide/_index.adoc:610 #, no-wrap msgid "" "5ef0bd68b515 (HEAD -> main, freebsd/main, freebsd/HEAD) HEAD@{0}: pull --ff-only: Fast-forward\n" "a8163e165c5b (upstream/main) HEAD@{1}: checkout: moving from b6fb97efb682994f59b21fe4efb3fcfc0e5b9eeb to main\n" "...\n" msgstr "" "5ef0bd68b515 (HEAD -> main, freebsd/main, freebsd/HEAD) HEAD@{0}: pull --ff-only: Fast-forward\n" "a8163e165c5b (upstream/main) HEAD@{1}: checkout: moving from b6fb97efb682994f59b21fe4efb3fcfc0e5b9eeb to main\n" "...\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:615 +#: documentation/content/en/articles/committers-guide/_index.adoc:614 msgid "" "shows me moving the working tree to the `main` branch (a816...) and then " "updating from upstream (to 5ef0...). In this case, bad would be HEAD (or " "5ef0bd68b515) and good would be a8163e165c5b. As you can see from the " "output, HEAD@{1} also often works, but isn't foolproof if you have done " "other things to your Git tree after updating, but before you discover the " "need to bisect." msgstr "" "показывает, как я перемещаю рабочее дерево в ветку `main` (a816...) и затем " "обновляю его из вышестоящего репозитория (до 5ef0...). В этом случае, bad " "будет HEAD (или 5ef0bd68b515), а good — a8163e165c5b. Как видно из вывода, " "HEAD@{1} также часто работает, но не является безошибочным, если вы " "выполняли другие действия с деревом Git после обновления, но до того, как " "обнаружили необходимость в бинарном поиске." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:619 +#: documentation/content/en/articles/committers-guide/_index.adoc:618 msgid "" "Set the 'good' version first, then set the bad (though the order doesn't " "matter). When you set the bad version, it will give you some statistics on " "the process:" msgstr "" "Установите сначала «хорошую» версию, затем установите «плохую» (хотя порядок " "не имеет значения). При установке «плохой» версии вы получите некоторую " "статистику по процессу:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:626 +#: documentation/content/en/articles/committers-guide/_index.adoc:625 #, no-wrap msgid "" "% git bisect start --first-parent\n" "% git bisect good a8163e165c5b\n" "% git bisect bad HEAD\n" "Bisecting: 1722 revisions left to test after this (roughly 11 steps)\n" "[c427b3158fd8225f6afc09e7e6f62326f9e4de7e] Fixup r361997 by balancing parens. Duh.\n" msgstr "" "% git bisect start --first-parent\n" "% git bisect good a8163e165c5b\n" "% git bisect bad HEAD\n" "Bisecting: 1722 revisions left to test after this (roughly 11 steps)\n" "[c427b3158fd8225f6afc09e7e6f62326f9e4de7e] Fixup r361997 by balancing parens. Duh.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:635 +#: documentation/content/en/articles/committers-guide/_index.adoc:634 msgid "" "You would then build/install that version. If it's good you'd type `git " "bisect good` otherwise `git bisect bad`. If the version doesn't compile, " "type `git bisect skip`. You will get a similar message to the above after " "each step. When you are done, report the bad version to the developer (or " "fix the bug yourself and send a patch). `git bisect reset` will end the " "process and return you back to where you started (usually tip of `main`). " "Again, the git-bisect manual (linked above) is a good resource for when " "things go wrong or for unusual cases." msgstr "" "Затем вы собираете и устанавливаете эту версию. Если она работает корректно, " "введите `git bisect good`, в противном случае — `git bisect bad`. Если " "версия не компилируется, введите `git bisect skip`. После каждого шага вы " "будете получать сообщение, аналогичное приведённому выше. По завершении " "сообщите о проблемной версии разработчику (или исправьте ошибку " "самостоятельно и отправьте патч). Команда `git bisect reset` завершит " "процесс и вернёт вас туда, откуда вы начали (обычно на вершину ветки " "`main`). Ещё раз, руководство по git-bisect (ссылка выше) — это хороший " "ресурс на случай возникновения проблем или нестандартных ситуаций." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:637 +#: documentation/content/en/articles/committers-guide/_index.adoc:636 #, no-wrap msgid "Signing the commits, tags, and pushes, with GnuPG" msgstr "Подписание коммитов, тегов и отправок с помощью GnuPG" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:642 +#: documentation/content/en/articles/committers-guide/_index.adoc:641 msgid "" "Git knows how to sign commits, tags, and pushes. When you sign a Git commit " "or a tag, you can prove that the code you submitted came from you and wasn't " "altered while you were transferring it. You also can prove that you " "submitted the code and not someone else." msgstr "" "Git умеет подписывать коммиты, теги и отправки (push). Когда вы подписываете " "Git-коммит или тег, вы можете доказать, что отправленный код действительно " "принадлежит вам и не был изменён во время передачи. Вы также можете " "подтвердить, что именно вы отправили код, а не кто-то другой." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:644 +#: documentation/content/en/articles/committers-guide/_index.adoc:643 msgid "" "A more in-depth documentation on signing commits and tags can be found in " "the https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work[Git Tools - " "Signing Your Work] chapter of the Git's book." msgstr "" "Более подробная документация по подписанию коммитов и тегов доступна в главе " "https://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work[Инструменты Git - " "Подписание вашей работы] книги по Git." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:646 +#: documentation/content/en/articles/committers-guide/_index.adoc:645 msgid "" "The rationale behind signing pushes can be found in the https://github.com/" "git/git/commit/a85b377d0419a9dfaca8af2320cc33b051cbed04[commit that " "introduced the feature]." msgstr "" "Обоснование подписания отправок можно найти в https://github.com/git/git/" "commit/a85b377d0419a9dfaca8af2320cc33b051cbed04[коммите, где представлена " "эта функция]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:649 +#: documentation/content/en/articles/committers-guide/_index.adoc:648 msgid "" "The best way is to simply tell Git you always want to sign commits, tags, " "and pushes. You can do this by setting a few configuration variables:" msgstr "" "Лучший способ — просто указать Git, что вы всегда хотите подписывать " "коммиты, теги и отправки. Это можно сделать, установив несколько переменных " "конфигурации:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:656 +#: documentation/content/en/articles/committers-guide/_index.adoc:655 #, no-wrap msgid "" "% git config --add user.signingKey LONG-KEY-ID\n" "% git config --add commit.gpgSign true\n" "% git config --add tag.gpgSign true\n" "% git config --add push.gpgSign if-asked\n" msgstr "" "% git config --add user.signingKey LONG-KEY-ID\n" "% git config --add commit.gpgSign true\n" "% git config --add tag.gpgSign true\n" "% git config --add push.gpgSign if-asked\n" #. push.gpgSign should probably be set to `yes` once we enable it, or be set with --global, so that it is enabled for all repositories. #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:664 +#: documentation/content/en/articles/committers-guide/_index.adoc:663 msgid "" "To avoid possible collisions, make sure you give a long key id to Git. You " "can get the long id with: `gpg --list-secret-keys --keyid-format LONG`." msgstr "" "Чтобы избежать возможных конфликтов, убедитесь, что вы указали длинный " "идентификатор ключа для Git. Вы можете получить длинный идентификатор с " "помощью команды: `gpg --list-secret-keys --keyid-format LONG`." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:670 +#: documentation/content/en/articles/committers-guide/_index.adoc:669 msgid "" "To use specific subkeys, and not have GnuPG to resolve the subkey to a " "primary key, attach `!` to the key. For example, to encrypt for the subkey " "`DEADBEEF`, use `DEADBEEF!`." msgstr "" "Для использования конкретных подключей, без разрешения GnuPG подключей в " "первичный ключ, добавьте `!` к ключу. Например, для шифрования с подключом " "`DEADBEEF` используйте `DEADBEEF!`." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:672 +#: documentation/content/en/articles/committers-guide/_index.adoc:671 #, no-wrap msgid "Verifying signatures" msgstr "Проверка подписей" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:675 +#: documentation/content/en/articles/committers-guide/_index.adoc:674 msgid "" "Commit signatures can be verified by running either `git verify-commit " "`, or `git log --show-signature`." msgstr "" "Подпись коммита можно проверить, выполнив команду `git verify-commit <хэш " "коммита>` или `git log --show-signature`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:677 +#: documentation/content/en/articles/committers-guide/_index.adoc:676 msgid "" "Tag signatures can be verified with `git verify-tag `, or `git tag " "-v `." msgstr "" "Подписи тегов можно проверить с помощью `git verify-tag <имя тега>` или `git " "tag -v <имя тега>`." # # #. Commented out for now until we decide what to do. #. Git pushes are a bit different, they live in a special ref in the repository. #. TODO: write how to verify them #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:686 +#: documentation/content/en/articles/committers-guide/_index.adoc:685 #, no-wrap msgid "Ports Considerations" msgstr "Особенности портов" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:689 +#: documentation/content/en/articles/committers-guide/_index.adoc:688 msgid "" "The ports tree operates the same way. The branch names are different and " "the repositories are in different locations." msgstr "" "Дерево портов работает аналогичным образом. Названия ветвей отличаются, и " "репозитории расположены в других местах." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:692 +#: documentation/content/en/articles/committers-guide/_index.adoc:691 msgid "" "The cgit repository web interface for use with web browsers is at https://" "cgit.FreeBSD.org/ports/ . The production Git repository is at https://git." "FreeBSD.org/ports.git and at ssh://anongit@git.FreeBSD.org/ports.git (or " -"anongit@git.FreeBSD.org:ports.git)." +"`anongit@git.FreeBSD.org:ports.git`)." msgstr "" "Веб-интерфейс cgit для работы в браузере доступен по адресу https://cgit." "FreeBSD.org/ports/ . Рабочий репозиторий Git находится по адресу https://git." "FreeBSD.org/ports.git и ssh://anongit@git.FreeBSD.org/ports.git (или " "`anongit@git.FreeBSD.org:ports.git`)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:696 +#: documentation/content/en/articles/committers-guide/_index.adoc:695 msgid "" -"There is also a mirror on GitHub, see extref:{handbook}/mirrors[External " +"There is also a mirror on GitHub, see extref:{handbook}mirrors[External " "mirrors, mirrors] for an overview. The _latest_ branch is `main`. The " "_quarterly_ branches are named `yyyyQn` for year 'yyyy' and quarter 'n'." msgstr "" -"Также доступно зеркало на GitHub, см. extref:{handbook}/mirrors[Внешние " +"Также доступно зеркало на GitHub, см. extref:{handbook}mirrors[Внешние " "зеркала, mirrors] для обзора. Ветка _latest_ называется `main`. Ветки " "_quarterly_ именуются `yyyyQn`, где 'yyyy' — год, а 'n' — квартал." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:698 +#: documentation/content/en/articles/committers-guide/_index.adoc:697 #, no-wrap msgid "Commit message formats" msgstr "Форматы сообщений коммитов" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:702 +#: documentation/content/en/articles/committers-guide/_index.adoc:701 msgid "" "A hook is available in the ports repository to help you write up your commit " "messages in https://cgit.freebsd.org/ports/tree/.hooks/prepare-commit-msg[." "hooks/prepare-commit-message]. It can be enabled by running ``git config --" "add core.hooksPath .hooks``." msgstr "" "В репозитории портов доступен перехватчик, который помогает оформлять " "сообщения коммитов в https://cgit.freebsd.org/ports/tree/.hooks/prepare-" "commit-msg[.hooks/prepare-commit-message]. Его можно включить, выполнив " "команду ``git config --add core.hooksPath .hooks``." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:704 +#: documentation/content/en/articles/committers-guide/_index.adoc:703 msgid "" "The main point being that a commit message should be formatted in the " "following way:" msgstr "" "Основная идея заключается в том, что сообщение коммита должно быть оформлено " "следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:707 +#: documentation/content/en/articles/committers-guide/_index.adoc:706 #, no-wrap msgid "category/port: Summary.\n" msgstr "category/port: Summary.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:709 +#: documentation/content/en/articles/committers-guide/_index.adoc:708 #, no-wrap msgid "Description of why the changes where made.\n" msgstr "Description of why the changes where made (Объяснение, почему были сделаны изменения ).\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:711 +#: documentation/content/en/articles/committers-guide/_index.adoc:710 #, no-wrap msgid "PR:\t 12345\n" msgstr "PR:\t 12345\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:717 +#: documentation/content/en/articles/committers-guide/_index.adoc:716 msgid "" "The first line is the subject of the commit, it contains what port was " "changed, and a summary of the commit. It should contain 50 characters or " "less." msgstr "" "Первая строка — это тема коммита, в ней указывается, какой порт был изменён, " "и краткое описание коммита. Она должна содержать 50 символов или меньше." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:719 +#: documentation/content/en/articles/committers-guide/_index.adoc:718 msgid "A blank line should separate it from the rest of the commit message." msgstr "" "Пустая строка должна отделять его от остальной части сообщения о коммите." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:721 +#: documentation/content/en/articles/committers-guide/_index.adoc:720 msgid "" "The rest of the commit message should be wrapped at the 72 characters " "boundary." msgstr "" "Остальная часть сообщения о коммите должна быть перенесена на границе 72 " "символов." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:723 +#: documentation/content/en/articles/committers-guide/_index.adoc:722 msgid "" "Another blank line should be added if there are any metadata fields, so that " "they are easily distinguishable from the commit message." msgstr "" "Еще одна пустая строка должна быть добавлена, если есть какие-либо поля " "метаданных, чтобы их можно было легко отличить от сообщения о коммите." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:725 +#: documentation/content/en/articles/committers-guide/_index.adoc:724 #, no-wrap msgid "Managing Local Changes" msgstr "Управление локальными изменениями" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:728 +#: documentation/content/en/articles/committers-guide/_index.adoc:727 msgid "" "This section addresses tracking local changes. If you have no local changes " "you can skip this section." msgstr "" "Этот раздел посвящен отслеживанию локальных изменений. Если у вас нет " "локальных изменений, вы можете пропустить этот раздел." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:734 +#: documentation/content/en/articles/committers-guide/_index.adoc:733 msgid "" "One item that is important for all of them: all changes are local until " "pushed. Unlike Subversion, Git uses a distributed model. For users, for " "most things, there is very little difference. However, if you have local " "changes, you can use the same tool to manage them as you use to pull in " "changes from FreeBSD. All changes that you have not pushed are local and " "can easily be modified (git rebase, discussed below does this)." msgstr "" "Один важный момент для всех: все изменения остаются локальными, пока они не " "будут отправлены (push). В отличие от Subversion, Git использует " "распределённую модель. Для пользователей в большинстве случаев разница " "невелика. Однако, если у вас есть локальные изменения, вы можете " "использовать тот же инструмент для управления ими, что и для получения " "изменений из FreeBSD. Все изменения, которые вы не отправили, являются " "локальными и могут быть легко изменены (это делает git rebase, обсуждаемый " "ниже)." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:735 +#: documentation/content/en/articles/committers-guide/_index.adoc:734 #, no-wrap msgid "Keeping local changes" msgstr "Сохранение локальных изменений" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:742 +#: documentation/content/en/articles/committers-guide/_index.adoc:741 msgid "" "The simplest way to keep local changes (especially trivial ones) is to use " "`git stash`. In its simplest form, you use `git stash` to record the " "changes (which pushes them onto the stash stack). Most people use this to " "save changes before updating the tree as described above. They then use " "`git stash apply` to re-apply them to the tree. The stash is a stack of " "changes that can be examined with `git stash list`. The git-stash man page " "(https://git-scm.com/docs/git-stash) has all the details." msgstr "" "Самый простой способ сохранить локальные изменения (особенно незначительные) " "— использовать `git stash`. В простейшем случае вы используете `git stash`, " "чтобы записать изменения (что помещает их в стек stash). Большинство людей " "используют это для сохранения изменений перед обновлением дерева, как " "описано выше. Затем они используют `git stash apply`, чтобы повторно " "применить изменения к дереву. Stash представляет собой стек изменений, " "который можно просмотреть с помощью `git stash list`. Подробности приведены " "в man-странице git-stash (https://git-scm.com/docs/git-stash)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:746 +#: documentation/content/en/articles/committers-guide/_index.adoc:745 msgid "" "This method is suitable when you have tiny tweaks to the tree. When you " "have anything non trivial, you'll likely be better off keeping a local " "branch and rebasing. Stashing is also integrated with the `git pull` " "command: just add `--autostash` to the command line." msgstr "" "Этот метод подходит, когда у вас есть небольшие изменения в дереве. Если у " "вас что-то более сложное, вероятно, лучше будет создать локальную ветку и " "выполнять перебазирование. Сохранение изменений также интегрировано в " "команду `git pull`: просто добавьте `--autostash` в командную строку." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:747 +#: documentation/content/en/articles/committers-guide/_index.adoc:746 #, no-wrap msgid "Keeping a local branch" msgstr "Сохранение локальной ветки" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:754 +#: documentation/content/en/articles/committers-guide/_index.adoc:753 msgid "" "It is much easier to keep a local branch with Git than Subversion. In " "Subversion you need to merge the commit, and resolve the conflicts. This is " "manageable, but can lead to a convoluted history that's hard to upstream " "should that ever be necessary, or hard to replicate if you need to do so. " "Git also allows one to merge, along with the same problems. That's one way " "to manage the branch, but it's the least flexible." msgstr "" "С помощью Git гораздо проще поддерживать локальную ветку, чем в Subversion. " "В Subversion необходимо выполнять коммит слияния и разрешать конфликты. Это " "выполнимо, но может привести к запутанной истории изменений, которую будет " "сложно передать в вышестоящий репозиторий, если это потребуется, или сложно " "воспроизвести при необходимости. Git также позволяет выполнять коммит " "слияния, но с теми же проблемами. Это один из способов управления веткой, но " "наименее гибкий." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:758 +#: documentation/content/en/articles/committers-guide/_index.adoc:757 msgid "" "In addition to merging, Git supports the concept of 'rebasing' which avoids " "these issues. The `git rebase` command replays all the commits of a branch " "at a newer location on the parent branch. We will cover the most common " "scenarios that arise using it." msgstr "" -"В дополнение к слиянию, Git поддерживает концепцию «перебазирования» (rebase)" -", которая позволяет избежать этих проблем. Команда `git rebase` " -"воспроизводит все коммиты ветки в конце родительской ветки. Мы рассмотрим " -"наиболее распространённые сценарии, возникающие при её использовании." +"В дополнение к слиянию, Git поддерживает концепцию " +"«перебазирования» (rebase), которая позволяет избежать этих проблем. Команда " +"`git rebase` воспроизводит все коммиты ветки в конце родительской ветки. Мы " +"рассмотрим наиболее распространённые сценарии, возникающие при её " +"использовании." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:760 +#: documentation/content/en/articles/committers-guide/_index.adoc:759 msgid "====== Create a branch" msgstr "====== Создать ветку" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:765 +#: documentation/content/en/articles/committers-guide/_index.adoc:764 msgid "" "Let's say you want to make a change to FreeBSD's ls command to never, ever " "do color. There are many reasons to do this, but this example will use that " "as a baseline. The FreeBSD ls command changes from time to time, and you'll " "need to cope with those changes. Fortunately, with Git rebase it usually is " "automatic." msgstr "" "Предположим, вы хотите внести изменение в команду `ls` FreeBSD, чтобы она " "никогда не использовала цветовое выделение. Существует множество причин для " "этого, но в данном примере мы будем использовать это в качестве базового " "сценария. Команда `ls` в FreeBSD периодически изменяется, и вам нужно будет " "адаптироваться к этим изменениям. К счастью, с помощью `git rebase` это " "обычно происходит автоматически." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:787 +#: documentation/content/en/articles/committers-guide/_index.adoc:786 #, no-wrap msgid "" "% cd src\n" "% git checkout main\n" "% git checkout -b no-color-ls\n" "% cd bin/ls\n" "% vi ls.c # hack the changes in\n" "% git diff # check the changes\n" "diff --git a/bin/ls/ls.c b/bin/ls/ls.c\n" "index 7378268867ef..cfc3f4342531 100644\n" "--- a/bin/ls/ls.c\n" "+++ b/bin/ls/ls.c\n" "@@ -66,6 +66,7 @@ __FBSDID(\"$FreeBSD$\");\n" " #include \n" " #include \n" " #include \n" "+#undef COLORLS\n" " #ifdef COLORLS\n" " #include \n" " #include \n" "% # these look good, make the commit...\n" "% git commit ls.c\n" msgstr "" "% cd src\n" "% git checkout main\n" "% git checkout -b no-color-ls\n" "% cd bin/ls\n" "% vi ls.c # hack the changes in\n" "% git diff # check the changes\n" "diff --git a/bin/ls/ls.c b/bin/ls/ls.c\n" "index 7378268867ef..cfc3f4342531 100644\n" "--- a/bin/ls/ls.c\n" "+++ b/bin/ls/ls.c\n" "@@ -66,6 +66,7 @@ __FBSDID(\"$FreeBSD$\");\n" " #include \n" " #include \n" " #include \n" "+#undef COLORLS\n" " #ifdef COLORLS\n" " #include \n" " #include \n" "% # these look good, make the commit...\n" "% git commit ls.c\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:794 +#: documentation/content/en/articles/committers-guide/_index.adoc:793 msgid "" "The commit will pop you into an editor to describe what you've done. Once " "you enter that, you have your own **local** branch in the Git repo. Build " "and install it like you normally would, following the directions in the " "handbook. Git differs from other version control systems in that you have " "to tell it explicitly which files to commit. I have opted to do it on the " "commit command line, but you can also do it with `git add` which many of the " "more in depth tutorials cover." msgstr "" "Коммит откроет редактор, чтобы описать выполненные изменения. После ввода " "описания у вас будет собственная **локальная** ветка в Git-репозитории. " "Соберите и установите изменения, как обычно, следуя указаниям в руководстве. " "Git отличается от других систем контроля версий тем, что нужно явно " "указывать, какие файлы коммитить. Я предпочитаю делать это в командной " "строке коммита, но также можно использовать `git add`, как описано в более " "подробных руководствах." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:796 +#: documentation/content/en/articles/committers-guide/_index.adoc:795 msgid "====== Time to update" msgstr "====== Время обновить" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:801 +#: documentation/content/en/articles/committers-guide/_index.adoc:800 msgid "" "When it is time to bring in a new version, it is almost the same as w/o the " "branches. You would update like you would above, but there is one extra " "command before you update, and one after. The following assumes you are " "starting with an unmodified tree. It is important to start rebasing " "operations with a clean tree (Git requires this)." msgstr "" "Когда приходит время внедрить новую версию, процесс почти такой же, как и " "без веток. Вы выполняете обновление, как описано выше, но перед обновлением " "нужно выполнить одну дополнительную команду и одну после. Ниже " "предполагается, что вы начинаете с неизменённого дерева. Важно начинать " "операции перебазирования с чистого дерева (Git требует этого)." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:807 +#: documentation/content/en/articles/committers-guide/_index.adoc:806 #, no-wrap msgid "" "% git checkout main\n" "% git pull --ff-only\n" "% git rebase -i main no-color-ls\n" msgstr "" "% git checkout main\n" "% git pull --ff-only\n" "% git rebase -i main no-color-ls\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:812 +#: documentation/content/en/articles/committers-guide/_index.adoc:811 msgid "" "This will bring up an editor that lists all the commits in it. For this " "example, do not change it at all. This is typically what you are doing " "while updating the baseline (though you also use the Git rebase command to " "curate the commits you have in the branch)." msgstr "" "Это откроет редактор, в котором будут перечислены все коммиты. В данном " "примере не изменяйте его содержимое. Обычно это делается при обновлении " "базовой версии (хотя также можно использовать команду Git rebase для " "управления коммитами в ветке)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:814 +#: documentation/content/en/articles/committers-guide/_index.adoc:813 msgid "" "Once you are done with the above, you have to move the commits to ls.c " "forward from the old version of FreeBSD to the newer one." msgstr "" "После завершения вышеуказанных действий необходимо перенести коммиты для `ls." "c` со старой версии FreeBSD на новую." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:821 +#: documentation/content/en/articles/committers-guide/_index.adoc:820 msgid "" "Sometimes there are merge conflicts. That is OK. Do not panic. Instead, " "handle them the same as any other merge conflicts. To keep it simple, I " "will just describe a common issue that may arise. A pointer to a complete " "treatment can be found at the end of this section." msgstr "" "Иногда возникают конфликты слияния. Это нормально. Не паникуйте. Вместо " "этого решайте их так же, как и любые другие конфликты слияния. Чтобы " "упростить, я опишу лишь распространённую проблему, которая может возникнуть. " "Ссылка на полное руководство приведена в конце этого раздела." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:824 +#: documentation/content/en/articles/committers-guide/_index.adoc:823 msgid "" "Let's say the includes changes upstream in a radical shift to terminfo as " "well as a name change for the option. When you updated, you might see " "something like this:" msgstr "" "Допустим, изменения включают переход на terminfo в вышестоящем коде, а также " "изменение названия опции. При обновлении вы можете увидеть следующее:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:834 +#: documentation/content/en/articles/committers-guide/_index.adoc:833 #, no-wrap msgid "" "Auto-merging bin/ls/ls.c\n" "CONFLICT (content): Merge conflict in bin/ls/ls.c\n" "error: could not apply 646e0f9cda11... no color ls\n" "Resolve all conflicts manually, mark them as resolved with\n" "\"git add/rm \", then run \"git rebase --continue\".\n" "You can instead skip this commit: run \"git rebase --skip\".\n" "To abort and get back to the state before \"git rebase\", run \"git rebase --abort\".\n" "Could not apply 646e0f9cda11... no color ls\n" msgstr "" "Auto-merging bin/ls/ls.c\n" "CONFLICT (content): Merge conflict in bin/ls/ls.c\n" "error: could not apply 646e0f9cda11... no color ls\n" "Resolve all conflicts manually, mark them as resolved with\n" "\"git add/rm \", then run \"git rebase --continue\".\n" "You can instead skip this commit: run \"git rebase --skip\".\n" "To abort and get back to the state before \"git rebase\", run \"git rebase --abort\".\n" "Could not apply 646e0f9cda11... no color ls\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:836 +#: documentation/content/en/articles/committers-guide/_index.adoc:835 msgid "which looks scary." msgstr "что выглядит пугающе." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:838 +#: documentation/content/en/articles/committers-guide/_index.adoc:837 msgid "" "If you bring up an editor, you will see it is a typical 3-way merge conflict " "resolution that you may be familiar with from other source code systems (the " "rest of ls.c has been omitted):" msgstr "" "Если открыть редактор, вы увидите типичное разрешение конфликта с " "трёхсторонним слиянием, с которым вы могли сталкиваться в других системах " "управления исходным кодом (остальная часть ls.c опущена):" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:848 +#: documentation/content/en/articles/committers-guide/_index.adoc:847 #, no-wrap msgid "" " <<<<<<< HEAD\n" " #ifdef COLORLS_NEW\n" " #include \n" " =======\n" " #undef COLORLS\n" " #ifdef COLORLS\n" " #include \n" " >>>>>>> 646e0f9cda11... no color ls\n" msgstr "" " <<<<<<< HEAD\n" " #ifdef COLORLS_NEW\n" " #include \n" " =======\n" " #undef COLORLS\n" " #ifdef COLORLS\n" " #include \n" " >>>>>>> 646e0f9cda11... no color ls\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:851 +#: documentation/content/en/articles/committers-guide/_index.adoc:850 msgid "The new code is first, and your code is second." msgstr "Новый код идет первым, а ваш код - вторым." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:853 +#: documentation/content/en/articles/committers-guide/_index.adoc:852 msgid "" "The right fix here is to just add a #undef COLORLS_NEW before #ifdef and " "then delete the old changes:" msgstr "" "Правильное решение здесь — просто добавить `#undef COLORLS_NEW` перед " "`#ifdef`, а затем удалить старые изменения:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:858 +#: documentation/content/en/articles/committers-guide/_index.adoc:857 #, no-wrap msgid "" "#undef COLORLS_NEW\n" "#ifdef COLORLS_NEW\n" "#include \n" msgstr "" "#undef COLORLS_NEW\n" "#ifdef COLORLS_NEW\n" "#include \n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:860 +#: documentation/content/en/articles/committers-guide/_index.adoc:859 msgid "save the file." msgstr "и сохранить файл." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:862 +#: documentation/content/en/articles/committers-guide/_index.adoc:861 msgid "The rebase was interrupted, so you have to complete it:" msgstr "Ребазирование было прервано, поэтому вам необходимо завершить его:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:866 +#: documentation/content/en/articles/committers-guide/_index.adoc:865 #, no-wrap msgid "" "% git add ls.c\n" "% git rebase --continue\n" msgstr "" "% git add ls.c\n" "% git rebase --continue\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:871 +#: documentation/content/en/articles/committers-guide/_index.adoc:870 msgid "" "which tells Git that ls.c has been fixed and to continue the rebase " "operation. Since there was a conflict, you will get kicked into the editor " "to update the commit message if necessary. If the commit message is still " "accurate, just exit the editor." msgstr "" "что указывает Git, что файл `ls.c` исправлен и можно продолжить операцию " "перебазирования. Поскольку возник конфликт, система откроет редактор для " "обновления сообщения коммита (если это необходимо). Если сообщение коммита " "по-прежнему корректно, просто закройте редактор." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:876 +#: documentation/content/en/articles/committers-guide/_index.adoc:875 msgid "" "If you get stuck during the rebase, do not panic. git rebase --abort will " "take you back to a clean slate. It is important, though, to start with an " "unmodified tree. An aside: The above mentioned `git reflog` comes in handy " "here, as it will have a list of all the (intermediate) commits that you can " "view or inspect or cherry-pick." msgstr "" "Если вы застряли в процессе перебазирования, не паникуйте. Команда `git " "rebase --abort` вернёт вас к исходному состоянию. Однако важно начинать с " "неизменённого дерева. Примечание: упомянутая выше команда `git reflog` будет " "полезна в этой ситуации, так как она содержит список всех (промежуточных) " "коммитов, которые вы можете просмотреть, изучить или выбрать через `cherry-" "pick`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:879 +#: documentation/content/en/articles/committers-guide/_index.adoc:878 msgid "" "For more on this topic, https://www.freecodecamp.org/news/the-ultimate-guide-" "to-git-merge-and-git-rebase/ provides a rather extensive treatment. It is a " "good resource for issues that arise occasionally but are too obscure for " "this guide." msgstr "" "Для более подробного ознакомления с этой темой, см. довольно обширное " -"руководство по адресу: https://www.freecodecamp.org/news/" -"the-ultimate-guide-to-git-merge-and-git-rebase/. Этот ресурс будет полезен " -"для решения проблем, которые возникают нечасто, но слишком специфичны для " -"данного руководства." +"руководство по адресу: https://www.freecodecamp.org/news/the-ultimate-guide-" +"to-git-merge-and-git-rebase/. Этот ресурс будет полезен для решения проблем, " +"которые возникают нечасто, но слишком специфичны для данного руководства." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:880 +#: documentation/content/en/articles/committers-guide/_index.adoc:879 #, no-wrap msgid "Switching to a Different FreeBSD Branch" msgstr "Переключение на другую ветку FreeBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:883 +#: documentation/content/en/articles/committers-guide/_index.adoc:882 msgid "" "If you wish to shift from stable/12 to the current branch. If you have a " "deep clone, the following will suffice:" msgstr "" "Если вы хотите перейти с ветки stable/12 на ветку current и у вас есть " "полный клон репозитория, будет достаточно выполнить следующую команду:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:887 +#: documentation/content/en/articles/committers-guide/_index.adoc:886 #, no-wrap msgid "" "% git checkout main\n" "% # build and install here...\n" msgstr "" "% git checkout main\n" "% # build and install here...\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:892 +#: documentation/content/en/articles/committers-guide/_index.adoc:891 msgid "" "If you have a local branch, though, there are one or two caveats. First, " "rebase will rewrite history, so you will likely want to do something to save " "it. Second, jumping branches tends to cause more conflicts. If we pretend " "the example above was relative to stable/12, then to move to `main`, I'd " "suggest the following:" msgstr "" "Однако, если у вас есть локальная ветка, есть несколько важных замечаний. Во-" "первых, перебазирование переписывает историю, поэтому вам, скорее всего, " "захочется сохранить её каким-либо образом. Во-вторых, переключение между " "ветками часто вызывает больше конфликтов. Если предположить, что приведённый " "выше пример относился к ветке stable/12, то для перехода на ветку `main` я " "бы рекомендовал следующее:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:897 +#: documentation/content/en/articles/committers-guide/_index.adoc:896 #, no-wrap msgid "" "% git checkout no-color-ls\n" "% git checkout -b no-color-ls-stable-12 # create another name for this branch\n" "% git rebase -i stable/12 no-color-ls --onto main\n" msgstr "" "% git checkout no-color-ls\n" "% git checkout -b no-color-ls-stable-12 # create another name for this branch\n" "% git rebase -i stable/12 no-color-ls --onto main\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:904 +#: documentation/content/en/articles/committers-guide/_index.adoc:903 msgid "" "What the above does is checkout no-color-ls. Then create a new name for it " "(no-color-ls-stable-12) in case you need to get back to it. Then you rebase " "onto the `main` branch. This will find all the commits to the current no-" "color-ls branch (back to where it meets up with the stable/12 branch) and " "then it will replay them onto the `main` branch creating a new no-color-ls " "branch there (which is why I had you create a place holder name)." msgstr "" "Что делает вышеописанное: извлекается ветка no-color-ls. Затем для неё " "создаётся новое имя (no-color-ls-stable-12) на случай, если потребуется " "вернуться к ней. После этого выполняется перебазирование на ветку `main`. " "Это позволит найти все коммиты в текущей ветке no-color-ls (вплоть до точки " "её ответвления от stable/12) и затем воспроизвести их на ветке `main`, " "создав там новую ветку no-color-ls (поэтому я и попросил вас создать " "резервное имя)." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:906 +#: documentation/content/en/articles/committers-guide/_index.adoc:905 #, no-wrap msgid "MFC (Merge From Current) Procedures" msgstr "Процедуры MFC (Merge From Current)" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:907 +#: documentation/content/en/articles/committers-guide/_index.adoc:906 #, no-wrap msgid "Summary" msgstr "Краткое содержание" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:911 +#: documentation/content/en/articles/committers-guide/_index.adoc:910 msgid "" "MFC workflow can be summarized as `git cherry-pick -x` plus `git commit --" "amend` to adjust the commit message. For multiple commits, use `git rebase -" "i` to squash them together and edit the commit message." msgstr "" "Рабочий процесс MFC можно обобщить как `git cherry-pick -x` плюс `git commit " "--amend` для корректировки сообщения коммита. Для нескольких коммитов " "используйте `git rebase -i`, чтобы объединить их вместе и отредактировать " "сообщение коммита." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:912 +#: documentation/content/en/articles/committers-guide/_index.adoc:911 #, no-wrap msgid "Single commit MFC" msgstr "Одиночный коммит MFC" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:918 +#: documentation/content/en/articles/committers-guide/_index.adoc:917 #, no-wrap msgid "" "% git checkout stable/X\n" "% git cherry-pick -x $HASH --edit\n" msgstr "" "% git checkout stable/X\n" "% git cherry-pick -x $HASH --edit\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:922 +#: documentation/content/en/articles/committers-guide/_index.adoc:921 msgid "" "For MFC commits, for example a vendor import, you would need to specify one " "parent for cherry-pick purposes. Normally, that would be the \"first parent" "\" of the branch you are cherry-picking from, so:" msgstr "" "Для коммитов MFC, например, импорта от вендора, вам потребуется указать " "одного родителя для целей выборочного применения (cherry-pick). Обычно это " "будет «первый родитель» ветки, из которой вы применяете изменения, то есть:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:927 +#: documentation/content/en/articles/committers-guide/_index.adoc:926 #, no-wrap msgid "" "% git checkout stable/X\n" "% git cherry-pick -x $HASH -m 1 --edit\n" msgstr "" "% git checkout stable/X\n" "% git cherry-pick -x $HASH -m 1 --edit\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:930 +#: documentation/content/en/articles/committers-guide/_index.adoc:929 msgid "" "If things go wrong, you'll either need to abort the cherry-pick with `git " "cherry-pick --abort` or fix it up and do a `git cherry-pick --continue`." msgstr "" "Если что-то пойдет не так, вам потребуется либо прервать выборочное " "применение с помощью `git cherry-pick --abort`, либо исправить проблему и " "выполнить `git cherry-pick --continue`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:933 +#: documentation/content/en/articles/committers-guide/_index.adoc:932 msgid "" "Once the cherry-pick is finished, push with `git push`. If you get an error " "due to losing the commit race, use `git pull --rebase` and try to push again." msgstr "" "После завершения выборочного применения выполните отправку с помощью `git " -"push`. Если возникнет ошибка из-за проигрыша в гонке коммитов, используйте `" -"git pull --rebase` и повторите попытку отправки." +"push`. Если возникнет ошибка из-за проигрыша в гонке коммитов, используйте " +"`git pull --rebase` и повторите попытку отправки." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:934 +#: documentation/content/en/articles/committers-guide/_index.adoc:933 #, no-wrap msgid "MFC to RELENG branch" msgstr "MFC в ветку RELENG" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:938 +#: documentation/content/en/articles/committers-guide/_index.adoc:937 msgid "" "MFCs to branches that require approval require a bit more care. The process " "is the same for either a typical merge or an exceptional direct commit." msgstr "" "MFC в ветки, требующие одобрения, требуют немного больше внимания. Процесс " "одинаков как для обычного слияния, так и для прямого коммита в " "исключительной ситуации." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:940 +#: documentation/content/en/articles/committers-guide/_index.adoc:939 msgid "" "Merge or direct commit to the appropriate `stable/X` branch first before " "merging to the `releng/X.Y` branch." msgstr "" "Сначала выполните слияние или прямой коммит в соответствующую ветку `stable/" "X`, прежде чем сливать в ветку `releng/X.Y`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:941 +#: documentation/content/en/articles/committers-guide/_index.adoc:940 msgid "" "Use the hash that's in the `stable/X` branch for the MFC to `releng/X.Y` " "branch." msgstr "Используйте хэш из ветки `stable/X` для MFC в ветку `releng/X.Y`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:942 +#: documentation/content/en/articles/committers-guide/_index.adoc:941 msgid "Leave both \"cherry picked from\" lines in the commit message." msgstr "Оставляйте обе строки \"cherry picked from\" в сообщении коммита." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:943 +#: documentation/content/en/articles/committers-guide/_index.adoc:942 msgid "Be sure to add the `Approved by:` line when you are in the editor." msgstr "Обязательно добавьте строку `Approved by:` при работе в редакторе." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:948 +#: documentation/content/en/articles/committers-guide/_index.adoc:947 #, no-wrap msgid "" "% git checkout releng/13.0\n" "% git cherry-pick -x $HASH --edit\n" msgstr "" "% git checkout releng/13.0\n" "% git cherry-pick -x $HASH --edit\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:951 +#: documentation/content/en/articles/committers-guide/_index.adoc:950 msgid "" "If you forget to to add the `Approved by:` line, you can do a `git commit --" "amend` to edit the commit message before you push the change." msgstr "" "Если вы забыли добавить строку `Approved by:`, вы можете выполнить `git " "commit --amend`, чтобы отредактировать сообщение коммита перед отправкой " "изменения." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:952 +#: documentation/content/en/articles/committers-guide/_index.adoc:951 #, no-wrap msgid "Multiple commit MFC" msgstr "Множественный коммит MFC" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:963 +#: documentation/content/en/articles/committers-guide/_index.adoc:962 #, no-wrap msgid "" "% git checkout -b tmp-branch stable/X\n" "% for h in $HASH_LIST; do git cherry-pick -x $h; done\n" "% git rebase -i stable/X\n" "# mark each of the commits after the first as 'squash'\n" "# Update the commit message to reflect all elements of commit, if necessary.\n" "# Be sure to retain the \"cherry picked from\" lines.\n" "% git push freebsd HEAD:stable/X\n" msgstr "" "% git checkout -b tmp-branch stable/X\n" "% for h in $HASH_LIST; do git cherry-pick -x $h; done\n" "% git rebase -i stable/X\n" "# отметить каждый коммит после первого как 'squash'\n" -"# При необходимости обновить сообщение коммита, чтобы отразить все его " -"элементы.\n" +"# При необходимости обновить сообщение коммита, чтобы отразить все его элементы.\n" "# Обязательно сохранить строки \"cherry picked from\".\n" "% git push freebsd HEAD:stable/X\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:966 +#: documentation/content/en/articles/committers-guide/_index.adoc:965 msgid "If the push fails due to losing the commit race, rebase and try again:" msgstr "" "Если отправка не удалась из-за проигрыша в гонке коммитов, выполните " "перебазирование и повторите попытку:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:974 +#: documentation/content/en/articles/committers-guide/_index.adoc:973 #, no-wrap msgid "" "% git checkout stable/X\n" "% git pull\n" "% git checkout tmp-branch\n" "% git rebase stable/X\n" "% git push freebsd HEAD:stable/X\n" msgstr "" "% git checkout stable/X\n" "% git pull\n" "% git checkout tmp-branch\n" "% git rebase stable/X\n" "% git push freebsd HEAD:stable/X\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:977 +#: documentation/content/en/articles/committers-guide/_index.adoc:976 msgid "Once the MFC is complete, you can delete the temporary branch:" msgstr "После завершения MFC вы можете удалить временную ветку:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:982 +#: documentation/content/en/articles/committers-guide/_index.adoc:981 #, no-wrap msgid "" "% git checkout stable/X\n" "% git branch -d tmp-branch\n" msgstr "" "% git checkout stable/X\n" "% git branch -d tmp-branch\n" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:984 +#: documentation/content/en/articles/committers-guide/_index.adoc:983 #, no-wrap msgid "MFC a vendor import" msgstr "MFC — импорт от вендора" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:989 +#: documentation/content/en/articles/committers-guide/_index.adoc:988 msgid "" "Vendor imports are the only thing in the tree that creates a merge commit in " "the `main` branch. Cherry picking merge commits into stable/XX presents an " "additional difficulty because there are two parents for a merge commit. " "Generally, you'll want the first parent's diff since that's the diff to " "`main` (though there may be some exceptions)." msgstr "" "Импорты от вендоров — это единственное в дереве, что создает коммит слияния " "в ветке `main`. Коммиты слияния выборочным переносом (cherry-pick) в stable/" "XX представляют дополнительную сложность, поскольку у коммита слияния два " "родителя. Как правило, вам понадобится разница с первым родителем, так как " "это разница с `main` (хотя могут быть и исключения)." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:993 +#: documentation/content/en/articles/committers-guide/_index.adoc:992 #, no-wrap msgid "% git cherry-pick -x -m 1 $HASH\n" msgstr "% git cherry-pick -x -m 1 $HASH\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:996 +#: documentation/content/en/articles/committers-guide/_index.adoc:995 msgid "" "is typically what you want. This will tell cherry-pick to apply the correct " "diff." msgstr "" "обычно это то, что вам нужно. Это укажет выборочному переносу применить " "правильный diff." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1000 +#: documentation/content/en/articles/committers-guide/_index.adoc:999 msgid "" "There are some, hopefully, rare cases where it's possible that the `main` " "branch was merged backwards by the conversion script. Should that be the " "case (and we've not found any yet), you'd change the above to `-m 2` to " "pickup the proper parent. Just do:" msgstr "" "Бывают, надеюсь, редкие случаи, когда возможно, что ветка `main` была " -"объединена в обратном порядке скриптом преобразования. Если это произойдет (" -"а мы пока таких случаев не обнаружили), вам следует изменить указанное выше " +"объединена в обратном порядке скриптом преобразования. Если это произойдет " +"(а мы пока таких случаев не обнаружили), вам следует изменить указанное выше " "на `-m 2`, чтобы выбрать правильного родителя. Просто выполните:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1004 +#: documentation/content/en/articles/committers-guide/_index.adoc:1003 #, no-wrap msgid "" "% git cherry-pick --abort\n" "% git cherry-pick -x -m 2 $HASH\n" msgstr "" "% git cherry-pick --abort\n" "% git cherry-pick -x -m 2 $HASH\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1006 +#: documentation/content/en/articles/committers-guide/_index.adoc:1005 msgid "to do that. The `--abort` will cleanup the failed first attempt." msgstr "" "для этого. Опция `--abort` выполнит очистку после неудачной первой попытки." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1007 +#: documentation/content/en/articles/committers-guide/_index.adoc:1006 #, no-wrap msgid "Redoing a MFC" msgstr "Переделка MFC" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1011 +#: documentation/content/en/articles/committers-guide/_index.adoc:1010 msgid "" "If you do a MFC, and it goes horribly wrong and you want to start over, then " "the easiest way is to use `git reset --hard` like so:" msgstr "" "Если вы делаете MFC, и всё идет ужасно неправильно, и вы хотите начать " "сначала, то самый простой способ — использовать `git reset --hard`, как " "показано ниже:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1014 +#: documentation/content/en/articles/committers-guide/_index.adoc:1013 #, no-wrap msgid "% git reset --hard freebsd/stable/12\n" msgstr "% git reset --hard freebsd/stable/12\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1017 +#: documentation/content/en/articles/committers-guide/_index.adoc:1016 msgid "" "though if you have some revs you want to keep, and others you don't, using " "`git rebase -i` is better." msgstr "" "хотя если у вас есть некоторые ревизии, которые вы хотите сохранить, а " "другие — нет, использование `git rebase -i` предпочтительнее." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1018 +#: documentation/content/en/articles/committers-guide/_index.adoc:1017 #, no-wrap msgid "Considerations when MFCing" msgstr "Некоторые соображения о MFC" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1021 +#: documentation/content/en/articles/committers-guide/_index.adoc:1020 msgid "" "When committing source commits to stable and releng branches, we have the " "following goals:" msgstr "" "При внесении исходных коммитов в стабильные и релизные ветки мы преследуем " "следующие цели:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1023 +#: documentation/content/en/articles/committers-guide/_index.adoc:1022 msgid "" "Clearly mark direct commits distinct from commits that land a change from " "another branch." msgstr "" "Четко обозначить прямые коммиты, отличая их от коммитов, вносящих изменения " "из другой ветки." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1024 +#: documentation/content/en/articles/committers-guide/_index.adoc:1023 msgid "Avoid introducing known breakage into stable and releng branches." msgstr "" "Избегать внесения известных нарушений в стабильные ветки и ветки выпуска " "релизов (releng)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1025 +#: documentation/content/en/articles/committers-guide/_index.adoc:1024 msgid "" "Allow developers to determine which changes have or have not been landed " "from one branch to another." msgstr "" "Позволить разработчикам определять, какие изменения были или не были " "перенесены из одной ветки в другую." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1027 +#: documentation/content/en/articles/committers-guide/_index.adoc:1026 msgid "" "With Subversion, we used the following practices to achieve these goals:" msgstr "" "С помощью Subversion мы использовали следующие практики для достижения этих " "целей:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1029 +#: documentation/content/en/articles/committers-guide/_index.adoc:1028 msgid "" "Using `MFC` and `MFS` tags to mark commits that merged changes from another " "branch." msgstr "" "Использование тегов `MFC` и `MFS` для пометки коммитов, которые сделали " "слияние изменения из другой ветки." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1030 +#: documentation/content/en/articles/committers-guide/_index.adoc:1029 msgid "Squashing fixup commits into the main commit when merging a change." msgstr "" "Объединение (squash) исправляющих (fixup) коммитов с основным коммитом при " "слиянии изменения." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1031 +#: documentation/content/en/articles/committers-guide/_index.adoc:1030 msgid "Recording mergeinfo so that `svn mergeinfo --show-revs` worked." msgstr "" "Запись информации о слияниях для корректной работы `svn mergeinfo --show-" "revs`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1035 +#: documentation/content/en/articles/committers-guide/_index.adoc:1034 msgid "" "With Git, we will need to use different strategies to achieve the same " "goals. This document aims to define best practices when merging source " "commits using Git that achieve these goals. In general, we aim to use Git's " "native support to achieve these goals rather than enforcing practices built " "on Subversion's model." msgstr "" "С помощью Git нам потребуется использовать другие стратегии для достижения " "тех же целей. Этот документ призван определить лучшие практики для коммитов " "слияния исходного кода с использованием Git, которые достигают этих целей. В " "целом мы стремимся использовать встроенные возможности Git для достижения " "этих целей, а не применять практики, основанные на модели Subversion." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1038 +#: documentation/content/en/articles/committers-guide/_index.adoc:1037 msgid "" "One general note: due to technical differences with Git, we will not be " "using Git \"merge commits\" (created via `git merge`) in stable or releng " "branches. Instead, when this document refers to \"merge commits\", it means " "a commit originally made to `main` that is replicated or \"landed\" to a " "stable branch, or a commit from a stable branch that is replicated to a " "releng branch with some variation of `git cherry-pick`." msgstr "" "Общее замечание: в связи с техническими различиями в Git, мы не будем " "использовать \"коммиты слияния\" Git (созданные через `git merge`) в " "стабильных ветках или ветках releng. Вместо этого, когда в документе " "упоминаются \"коммиты слияния\", имеется в виду коммит, изначально сделанный " "в `main`, который реплицируется или \"переносится\" в стабильную ветку, или " "коммит из стабильной ветки, который реплицируется в ветку releng с помощью " "вариации команды `git cherry-pick`." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1039 +#: documentation/content/en/articles/committers-guide/_index.adoc:1038 #, no-wrap msgid "Finding Eligible Hashes to MFC" msgstr "Поиск подходящих хэшей для MFC" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1045 +#: documentation/content/en/articles/committers-guide/_index.adoc:1044 msgid "" "Git provides some built-in support for this via the `git cherry` and `git " "log --cherry` commands. These commands compare the raw diffs of commits " "(but not other metadata such as log messages) to determine if two commits " "are identical. This works well when each commit from `main` is landed as a " "single commit to a stable branch, but it falls over if multiple commits from " "`main` are squashed together as a single commit to a stable branch. The " "project makes extensive use of `git cherry-pick -x` with all lines preserved " "to work around these difficulties and is working on automated tooling to " "take advantage of this." msgstr "" -"Git предоставляет встроенную поддержку этого через команды `git cherry` и `" -"git log --cherry`. Эти команды сравнивают исходные различия коммитов (но не " +"Git предоставляет встроенную поддержку этого через команды `git cherry` и " +"`git log --cherry`. Эти команды сравнивают исходные различия коммитов (но не " "другие метаданные, такие как сообщения журнала), чтобы определить, идентичны " "ли два коммита. Это хорошо работает, когда каждый коммит из `main` " "переносится как отдельный коммит в стабильную ветку, но перестаёт работать, " "если несколько коммитов из `main` объединяются в один коммит в стабильной " "ветке. Проект активно использует `git cherry-pick -x` с сохранением всех " "строк для обхода этих трудностей и разрабатывает автоматизированные " "инструменты для использования этого подхода." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1046 +#: documentation/content/en/articles/committers-guide/_index.adoc:1045 #, no-wrap msgid "Commit message standards" msgstr "Стандарты сообщений коммитов" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1047 +#: documentation/content/en/articles/committers-guide/_index.adoc:1046 #, no-wrap msgid "Marking MFCs" msgstr "Пометка MFC" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1050 +#: documentation/content/en/articles/committers-guide/_index.adoc:1049 msgid "The project has adopted the following practice for marking MFCs:" msgstr "Проект принял следующую практику для пометки MFC:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1052 +#: documentation/content/en/articles/committers-guide/_index.adoc:1051 msgid "" "Use the `-x` flag with `git cherry-pick`. This adds a line to the commit " "message that includes the hash of the original commit when merging. Since it " "is added by Git directly, committers do not have to manually edit the commit " "log when merging." msgstr "" "Используйте флаг `-x` с командой `git cherry-pick`. Это добавляет строку в " "сообщение коммита, которая включает хэш оригинального коммита при слиянии. " "Поскольку это добавляется непосредственно Git, коммиттерам не нужно вручную " "редактировать журнал коммитов при слиянии." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1054 +#: documentation/content/en/articles/committers-guide/_index.adoc:1053 msgid "" "When merging multiple commits, keep all the \"cherry picked from\" lines." msgstr "" "При слиянии нескольких коммитов сохраняйте все строки \"cherry picked from\"." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1055 +#: documentation/content/en/articles/committers-guide/_index.adoc:1054 #, no-wrap msgid "Trim Metadata?" msgstr "Обрезать метаданные?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1059 +#: documentation/content/en/articles/committers-guide/_index.adoc:1058 msgid "" "One area that was not clearly documented with Subversion (or even CVS) is " "how to format metadata in log messages for MFC commits. Should it include " "the metadata from the original commit unchanged, or should it be altered to " "reflect information about the MFC commit itself?" msgstr "" "Одной из областей, которая не была чётко задокументирована в Subversion (и " "даже в CVS), является форматирование метаданных в сообщениях журнала для " "коммитов MFC. Должны ли они включать метаданные из исходного коммита без " "изменений или должны быть изменены для отражения информации о самом коммите " "MFC?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1068 +#: documentation/content/en/articles/committers-guide/_index.adoc:1067 msgid "" "Historical practice has varied, though some of the variance is by field. " "For example, MFCs that are relevant to a PR generally include the PR field " "in the MFC so that MFC commits are included in the bug tracker's audit " "trail. Other fields are less clear. For example, Phabricator shows the " "diff of the last commit tagged to a review, so including Phabricator URLs " "replaces the main commit with the landed commits. The list of reviewers is " "also not clear. If a reviewer has approved a change to `main`, does that " "mean they have approved the MFC commit? Is that true if it's identical code " "only, or with merely trivial rework? It's clearly not true for more " "extensive reworks. Even for identical code what if the commit doesn't " "conflict but introduces an ABI change? A reviewer may have ok'd a commit for " "`main` due to the ABI breakage but may not approve of merging the same " "commit as-is. One will have to use one's best judgment until clear " "guidelines can be agreed upon." msgstr "" "Исторически практика различалась, хотя некоторые различия зависят от " "области. Например, MFC, относящиеся к PR, обычно включают поле PR в MFC, " "чтобы коммиты MFC включались в аудит-трекер системы отслеживания ошибок. В " "других областях ситуация менее ясна. Например, Phabricator показывает " "разницу последнего коммита, помеченного для обзора, поэтому включение URL-" "адресов Phabricator заменяет основной коммит на завершенные коммиты. Список " "рецензентов также неясен. Если рецензент одобрил изменение для `main`, " "означает ли это, что он одобрил коммит MFC? Верно ли это только для " "идентичного кода или лишь с незначительной доработкой? Очевидно, это неверно " "для более масштабных доработок. Даже для идентичного кода: что, если коммит " "не конфликтует, но вносит изменение ABI? Рецензент мог одобрить коммит для " "`main` из-за нарушения ABI, но может не одобрить слияние того же коммита в " "неизменном виде. Придется полагаться на собственное наилучшее суждение до " "тех пор, пока не будут согласованы четкие руководящие принципы." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1072 +#: documentation/content/en/articles/committers-guide/_index.adoc:1071 msgid "" "For MFCs regulated by re@, new metadata fields are added, such as the " "Approved by tag for approved commits. This new metadata will have to be " "added via `git commit --amend` or similar after the original commit has been " "reviewed and approved. We may also want to reserve some metadata fields in " "MFC commits such as Phabricator URLs for use by re@ in the future." msgstr "" "Для MFC, регулируемых re@, добавляются новые поля метаданных, такие как тег " "Approved by для одобренных коммитов. Эти новые метаданные должны быть " "добавлены через `git commit --amend` или аналогичные средства после того, " "как исходный коммит будет проверен и одобрен. Мы также можем захотеть " "зарезервировать некоторые поля метаданных в коммитах MFC, такие как URL-" "адреса Phabricator, для использования re@ в будущем." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1075 +#: documentation/content/en/articles/committers-guide/_index.adoc:1074 msgid "" "Preserving existing metadata provides a very simple workflow. Developers " "use `git cherry-pick -x` without having to edit the log message." msgstr "" "Сохранение существующих метаданных обеспечивает очень простой рабочий " "процесс. Разработчики используют `git cherry-pick -x` без необходимости " "редактировать сообщение журнала." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1078 +#: documentation/content/en/articles/committers-guide/_index.adoc:1077 msgid "" "If instead we choose to adjust metadata in MFCs, developers will have to " "edit log messages explicitly via the use of `git cherry-pick --edit` or `git " "commit --amend`. However, as compared to svn, at least the existing commit " "message can be pre-populated and metadata fields can be added or removed " "without having to re-enter the entire commit message." msgstr "" "Если же мы решим изменять метаданные в MFC, разработчикам придется явно " "редактировать сообщения журнала с помощью `git cherry-pick --edit` или `git " "commit --amend`. Однако по сравнению с svn, по крайней мере, существующее " "сообщение о фиксации может быть предварительно заполнено, а поля метаданных " "можно добавлять или удалять без необходимости повторного ввода всего " "сообщения о фиксации." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1080 +#: documentation/content/en/articles/committers-guide/_index.adoc:1079 msgid "" "The bottom line is that developers will likely need to curate their commit " "message for MFCs that are non-trivial." msgstr "" "Суть в том, что разработчикам, вероятно, потребуется тщательно готовить свои " "сообщения о коммитах для MFC, которые не являются тривиальными." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:1082 +#: documentation/content/en/articles/committers-guide/_index.adoc:1081 #, no-wrap msgid "Vendor Imports with Git" msgstr "Импорт вендоров с Git" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1085 +#: documentation/content/en/articles/committers-guide/_index.adoc:1084 msgid "This section describes the vendor import procedure with Git in detail." msgstr "" "В этом разделе подробно описывается процедура импорта вендора с " "использованием Git." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1086 +#: documentation/content/en/articles/committers-guide/_index.adoc:1085 #, no-wrap msgid "Branch naming convention" msgstr "Соглашение о наименовании веток" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1089 +#: documentation/content/en/articles/committers-guide/_index.adoc:1088 msgid "" "All vendor branches and tags start with `vendor/`. These branches and tags " "are visible by default." msgstr "" "Все ветки и теги вендоров начинаются с `vendor/`. Эти ветки и теги видны по " "умолчанию." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1094 +#: documentation/content/en/articles/committers-guide/_index.adoc:1093 msgid "" "This chapter follows the convention that the `freebsd` origin is the origin " "name for the official FreeBSD Git repository. If you use a different " "convention, replace `freebsd` with the name you use instead in the examples " "below." msgstr "" "Эта глава следует соглашению, что `freebsd` — это имя источника для " "официального репозитория Git FreeBSD. Если вы используете другое соглашение, " "замените `freebsd` на используемое вами имя в приведённых ниже примерах." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1098 +#: documentation/content/en/articles/committers-guide/_index.adoc:1097 msgid "" "We will explore an example for updating NetBSD's mtree that is in our tree. " "The vendor branch for this is `vendor/NetBSD/mtree`." msgstr "" "Мы рассмотрим пример обновления mtree NetBSD, который находится в нашем " "дереве. Ветка вендора для него — `vendor/NetBSD/mtree`." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1099 +#: documentation/content/en/articles/committers-guide/_index.adoc:1098 #, no-wrap msgid "Updating an old vendor import" msgstr "Обновление старого импорта от вендора" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1105 +#: documentation/content/en/articles/committers-guide/_index.adoc:1104 msgid "" "The vendor trees usually have only the subset of the third-party software " "that is appropriate to FreeBSD. These trees are usually tiny in comparison " "to the FreeBSD tree. Git worktrees are thus quite small and fast and the " "preferred method to use. Make sure that whatever directory you choose below " "(the `../mtree`) does not currently exist." msgstr "" "Деревья вендоров обычно содержат лишь подмножество стороннего программного " "обеспечения, подходящего для FreeBSD. Эти деревья, как правило, очень малы " "по сравнению с деревом FreeBSD. Таким образом, рабочие деревья Git довольно " "компактны и быстры, что делает их предпочтительным методом использования. " "Убедитесь, что выбранный вами каталог ( `../mtree` ) в настоящее время не " "существует." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1109 +#: documentation/content/en/articles/committers-guide/_index.adoc:1108 #, no-wrap msgid "% git worktree add ../mtree vendor/NetBSD/mtree\n" msgstr "% git worktree add ../mtree vendor/NetBSD/mtree\n" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1111 +#: documentation/content/en/articles/committers-guide/_index.adoc:1110 #, no-wrap msgid "Update the Sources in the Vendor Branch" msgstr "Обновление исходных кодов в ветке вендора" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1114 +#: documentation/content/en/articles/committers-guide/_index.adoc:1113 msgid "" "Prepare a full, clean tree of the vendor sources. Import everything but " "merge only what is needed." msgstr "" "Подготовьте полное, чистое дерево исходных кодов вендора. Импортируйте всё, " "но делайте слияние только тому, что необходимо." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1118 +#: documentation/content/en/articles/committers-guide/_index.adoc:1117 msgid "" "This example assumes the NetBSD source is checked out from their GitHub " "mirror in `~/git/NetBSD`. Note that \"upstream\" might have added or " "removed files, so we want to make sure deletions are propagated as well. " "package:net/rsync[] is commonly installed, so I'll use that." msgstr "" "Этот пример предполагает, что исходный код NetBSD получен из их зеркала на " "GitHub в каталоге `~/git/NetBSD`. Учтите, что «вышестоящий репозиторий» мог " "добавить или удалить файлы, поэтому мы хотим убедиться, что удаления также " "распространяются. Пакет package:net/rsync[] обычно установлен, поэтому я " "буду использовать его." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1132 +#: documentation/content/en/articles/committers-guide/_index.adoc:1131 #, no-wrap msgid "" "% cd ../mtree\n" "% rsync -va --del --exclude=\".git\" ~/git/NetBSD/usr.sbin/mtree/ .\n" "% git add -A\n" "% git status\n" "...\n" "% git diff --staged\n" "...\n" "% git commit -m \"Vendor import of NetBSD's mtree at 2020-12-11\"\n" "[vendor/NetBSD/mtree 8e7aa25fcf1] Vendor import of NetBSD's mtree at 2020-12-11\n" " 7 files changed, 114 insertions(+), 82 deletions(-)\n" "% git tag -a vendor/NetBSD/mtree/20201211\n" msgstr "" "% cd ../mtree\n" "% rsync -va --del --exclude=\".git\" ~/git/NetBSD/usr.sbin/mtree/ .\n" "% git add -A\n" "% git status\n" "...\n" "% git diff --staged\n" "...\n" "% git commit -m \"Vendor import of NetBSD's mtree at 2020-12-11\"\n" "[vendor/NetBSD/mtree 8e7aa25fcf1] Vendor import of NetBSD's mtree at 2020-12-11\n" " 7 files changed, 114 insertions(+), 82 deletions(-)\n" "% git tag -a vendor/NetBSD/mtree/20201211\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1145 +#: documentation/content/en/articles/committers-guide/_index.adoc:1144 msgid "" "It is critical to verify that the source code you are importing comes from a " "trustworthy source. Many open-source projects use cryptographic signatures " "to sign code changes, git tags, and/or source code tarballs. Always verify " "these signatures, and use isolation mechanisms like jails, chroot, in " "combination with a dedicated, non-privileged user account that is different " "from the one you regularly use (see the Updating the FreeBSD source tree " "section below for more details), until you are confident that the source " "code you are importing looks safe. Following the upstream development and " "occasionally reviewing the upstream code changes can greatly help in " "improving code quality and benefit everyone involved. It is also a good idea " "to examine the git diff results before importing them into the vendor area." msgstr "" "Крайне важно убедиться, что импортируемый исходный код получен из надежного " "источника. Многие проекты с открытым исходным кодом используют " "криптографические подписи для подписывания изменений кода, тегов git и/или " "tar-архивов с исходным кодом. Всегда проверяйте эти подписи и используйте " "механизмы изоляции, такие как клетки, chroot, в сочетании с выделенной " "непривилегированной учетной записью пользователя, отличной от той, которую " "вы используете регулярно (подробнее см. в разделе «Обновление дерева " "исходного кода FreeBSD» ниже), пока вы не будете уверены, что импортируемый " "исходный код выглядит безопасным. Отслеживание разработки в вышестоящем " "репозитории и периодический просмотр изменений кода в нем могут значительно " "помочь в повышении качества кода и принести пользу всем участникам. Также " "рекомендуется изучать результаты git diff перед импортом их в область " "вендора." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1149 +#: documentation/content/en/articles/committers-guide/_index.adoc:1148 msgid "" "Always run the `git diff` and `git status` commands and examine the results " "carefully. When in doubt, it is useful to do a `git annotate` on the vendor " "branch or the upstream git repository to see who and why a change was made." msgstr "" "Всегда выполняйте команды `git diff` и `git status` и внимательно изучайте " "результаты. В случае сомнений полезно выполнить `git annotate` на ветке " "вендора или в вышестоящем git-репозитории, чтобы увидеть, кто и почему внес " "изменение." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1152 +#: documentation/content/en/articles/committers-guide/_index.adoc:1151 msgid "" "In the example above we used `-m` to illustrate, but you should compose a " "proper message in an editor (using a commit message template)." msgstr "" "В примере выше мы использовали `-m` для иллюстрации, но вам следует " "составить корректное сообщение в редакторе (используя шаблон сообщения о " "фиксации)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1157 +#: documentation/content/en/articles/committers-guide/_index.adoc:1156 msgid "" "It is also important to create an annotated tag using `git tag -a`, " "otherwise the push will be rejected. Only annotated tags are allowed to be " "pushed. The annotated tag gives you a chance to enter a commit message. " "Enter the version you are importing, along with any salient new features or " "fixes in that version." msgstr "" "Также важно создать аннотированный тег с помощью `git tag -a`, иначе " "отправка будет отклонена. Только аннотированные теги разрешены для отправки. " "Аннотированный тег даёт вам возможность ввести сообщение коммита. Укажите " "версию, которую вы импортируете, вместе с любыми важными новыми функциями " "или исправлениями в этой версии." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1158 +#: documentation/content/en/articles/committers-guide/_index.adoc:1157 #, no-wrap msgid "Updating the FreeBSD Copy" msgstr "Обновление копии FreeBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1161 +#: documentation/content/en/articles/committers-guide/_index.adoc:1160 msgid "At this point you can push the import to `vendor` into our repo." msgstr "На этом этапе вы можете отправить импорт в `vendor` в наш репозиторий." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1165 +#: documentation/content/en/articles/committers-guide/_index.adoc:1164 #, no-wrap msgid "% git push --follow-tags freebsd vendor/NetBSD/mtree\n" msgstr "% git push --follow-tags freebsd vendor/NetBSD/mtree\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1168 +#: documentation/content/en/articles/committers-guide/_index.adoc:1167 msgid "" "`--follow-tags` tells `git push` to also push tags associated with the " "locally committed revision." msgstr "" "`--follow-tags` указывает `git push` также отправлять теги, связанные с " "локально зафиксированной ревизией." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1169 +#: documentation/content/en/articles/committers-guide/_index.adoc:1168 #, no-wrap msgid "Updating the FreeBSD source tree" msgstr "Обновление дерева исходных кодов FreeBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1173 +#: documentation/content/en/articles/committers-guide/_index.adoc:1172 msgid "" "Now you need to update the mtree in FreeBSD. The sources live in `contrib/" "mtree` since it is upstream software." msgstr "" -"Теперь вам нужно обновить mtree в FreeBSD. Исходные коды находятся в `" -"contrib/mtree`, так как это программное обеспечение из внешних источников." +"Теперь вам нужно обновить mtree в FreeBSD. Исходные коды находятся в " +"`contrib/mtree`, так как это программное обеспечение из внешних источников." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1179 +#: documentation/content/en/articles/committers-guide/_index.adoc:1178 msgid "" "From time to time, we may have to make changes to the contributed code to " "better satisfy FreeBSD's needs. Whenever possible, please try to contribute " "the local changes back to the upstream projects, this helps them to better " "support FreeBSD, and also saves your time for future conflict resolutions " "when importing updates." msgstr "" "Время от времени нам может потребоваться вносить изменения в предоставленный " "(contrib) код, чтобы лучше соответствовать потребностям FreeBSD. По " "возможности, пожалуйста, старайтесь передавать локальные изменения обратно в " "вышестоящие проекты — это помогает им лучше поддерживать FreeBSD, а также " "экономит ваше время при разрешении конфликтов в будущем при импорте " "обновлений." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1184 +#: documentation/content/en/articles/committers-guide/_index.adoc:1183 #, no-wrap msgid "" "% cd ../src\n" "% git subtree merge -P contrib/mtree vendor/NetBSD/mtree\n" msgstr "" "% cd ../src\n" "% git subtree merge -P contrib/mtree vendor/NetBSD/mtree\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1194 +#: documentation/content/en/articles/committers-guide/_index.adoc:1193 msgid "" "This would generate a subtree merge commit of `contrib/mtree` against the " "local `vendor/NetBSD/mtree` branch. Examine the diff from the merge result " "and the contents of the upstream branch. If the merge reduced our local " "changes to more trivial difference like blank line or indenting changes, try " "amending the local changes to reduce diff against upstream, or try to " "contribute the remaining changes back to the upstream project. If there " "were conflicts, you would need to fix them before committing. Include " "details about the changes being merged in the merge commit message." msgstr "" -"Это создаст коммит слияния поддерева `contrib/mtree` с локальной веткой `" -"vendor/NetBSD/mtree`. Изучите разницу (diff) между результатом слияния и " +"Это создаст коммит слияния поддерева `contrib/mtree` с локальной веткой " +"`vendor/NetBSD/mtree`. Изучите разницу (diff) между результатом слияния и " "содержимым вышестоящей ветки. Если слияние сократило наши локальные " "изменения до более тривиальных различий, таких как изменения пустых строк " "или отступов, попробуйте исправить локальные изменения, чтобы уменьшить " "разницу с вышестоящей версией, или попытайтесь внести оставшиеся изменения " "обратно в вышестоящий проект. Если возникли конфликты, вам потребуется " "устранить их перед коммитом. Включите подробности об объединяемых изменениях " "в сообщение коммита слияния." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1208 +#: documentation/content/en/articles/committers-guide/_index.adoc:1207 msgid "" "Some open-source software includes a `configure` script that generates files " "used to define how the code is built; usually, these generated files like " "`config.h` should be updated as part of the import process. When doing this, " "always keep in mind that these scripts are executable code running under the " "current user's credentials. This process should always be run in an isolated " "environment, ideally inside a jail that does not have network access, and " "with an unprivileged account; or, at minimum, a dedicated account that is " "different from the user account you normally use for everyday purposes or " "for pushing to the FreeBSD source code repository. This minimizes the risk " "of encountering bugs that can cause data loss or, in worse cases, " "maliciously planted code. Using an isolated jail also prevents the configure " "scripts from detecting locally installed software packages, which may lead " "to unexpected results." msgstr "" "Некоторое открытое программное обеспечение включает скрипт `configure`, " "который генерирует файлы, используемые для определения процесса сборки кода; " "обычно эти сгенерированные файлы, такие как `config.h`, должны обновляться " "как часть процесса импорта. При выполнении этого всегда помните, что эти " "скрипты являются исполняемым кодом, работающим под учётными данными текущего " "пользователя. Этот процесс всегда должен запускаться в изолированной среде, " "в идеале внутри клетки, не имеющей сетевого доступа, и с непривилегированной " "учётной записью; или, как минимум, с выделенной учётной записью, отличной от " "той, которую вы обычно используете для повседневных задач или для отправки " "изменений в репозиторий исходного кода FreeBSD. Это минимизирует риск " "столкновения с ошибками, которые могут привести к потере данных или, в " "худших случаях, к выполнению злонамеренно внедрённого кода. Использование " "изолированной клетки также предотвращает обнаружение скриптами configure " "локально установленных пакетов программного обеспечения, что может привести " "к неожиданным результатам." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1215 +#: documentation/content/en/articles/committers-guide/_index.adoc:1214 msgid "" "When testing your changes, run them in a chroot or jailed environment, or " "even within a virtual machine first, especially for kernel or library " "modifications. This approach helps prevent adverse interactions with your " "working environment. It can be particularly beneficial for changes to " "libraries that many base system components use, among others." msgstr "" "При тестировании ваших изменений запускайте их сначала в chroot или в " "клетке, или даже внутри виртуальной машины, особенно для модификаций ядра " "или библиотек. Этот подход помогает предотвратить неблагоприятное " "взаимодействие с вашей рабочей средой. Это может быть особенно полезно для " "изменений в библиотеках, которые используют многие компоненты базовой " "системы среди прочего." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1216 +#: documentation/content/en/articles/committers-guide/_index.adoc:1215 #, no-wrap msgid "Rebasing your change against latest FreeBSD source tree" -msgstr "" -"Перебазирование ваших изменений относительно последней версии исходного " -"дерева FreeBSD" +msgstr "Перебазирование ваших изменений относительно последней версии исходного дерева FreeBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1219 +#: documentation/content/en/articles/committers-guide/_index.adoc:1218 msgid "" "Because the current policy recommends against using merges, if the upstream " "FreeBSD `main` moved forward before you get a chance to push, you would have " "to redo the merge." msgstr "" "Поскольку текущая политика рекомендует избегать слияний (merge), то, если " "вышестоящая ветка FreeBSD `main` продвинулась вперёд до того, как у вас " "появится возможность отправить изменения, вам придётся переделывать слияние." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1222 +#: documentation/content/en/articles/committers-guide/_index.adoc:1221 msgid "" "Regular `git rebase` or `git pull --rebase` doesn't know how to rebase a " "merge commit **as a merge commit**, so instead of that you would have to " "recreate the commit." msgstr "" "Обычный `git rebase` или `git pull --rebase` не умеет перемещать коммит " "слияния **как коммит слияния**, поэтому вместо этого вам придётся воссоздать " "коммит." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1224 +#: documentation/content/en/articles/committers-guide/_index.adoc:1223 msgid "" "The following steps should be taken to easily recreate the merge commit as " "if `git rebase --merge-commits` worked properly:" msgstr "" "Следующие шаги следует выполнить, чтобы легко воссоздать коммит слияния, как " "если бы `git rebase --merge-commits` сработал правильно:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1226 +#: documentation/content/en/articles/committers-guide/_index.adoc:1225 msgid "cd to the top of the repo" msgstr "Перейдите в корень репозитория" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1227 +#: documentation/content/en/articles/committers-guide/_index.adoc:1226 msgid "Create a side branch `XXX` with the **contents** of the merged tree." msgstr "Создайте побочную ветвь `XXX` с **содержимым** дерева со слиянием." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1228 +#: documentation/content/en/articles/committers-guide/_index.adoc:1227 msgid "" "Update this side branch `XXX` to be merged and up-to-date with FreeBSD's " "`main` branch." msgstr "" "Обновите эту побочную ветку `XXX` для слияния и актуализации с основной " "веткой FreeBSD `main`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1229 +#: documentation/content/en/articles/committers-guide/_index.adoc:1228 msgid "" "In the worst case scenario, you would still have to resolve merge conflicts, " "if there was any, but this should be really rare." msgstr "" "В худшем случае вам всё равно придётся разрешать конфликты слияния, если они " "были, но это должно быть крайне редко." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1230 +#: documentation/content/en/articles/committers-guide/_index.adoc:1229 msgid "" "Resolve conflicts, and collapse multiple commits down to 1 if need be " "(without conflicts, there's no collapse needed)" msgstr "" "Разрешите конфликты и, если необходимо, объедините (collapse) несколько " "коммитов в один (без конфликтов объединение не требуется)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1231 +#: documentation/content/en/articles/committers-guide/_index.adoc:1230 msgid "checkout `main`" msgstr "извлеките (checkout) ветку `main`" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1232 +#: documentation/content/en/articles/committers-guide/_index.adoc:1231 msgid "create a branch `YYY` (allows for easier unwinding if things go wrong)" msgstr "" "создайте ветку `YYY` (позволяет проще откатиться, если что-то пойдет не так)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1233 +#: documentation/content/en/articles/committers-guide/_index.adoc:1232 msgid "Re-do the subtree merge" msgstr "Повторите слияние поддерева" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1234 +#: documentation/content/en/articles/committers-guide/_index.adoc:1233 msgid "" "Instead of resolving any conflicts from the subtree merge, checkout the " "contents of XXX on top of it." msgstr "" "Вместо разрешения конфликтов от слияния поддерева, извлеките (checkout) " "содержимое XXX поверх него." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1235 +#: documentation/content/en/articles/committers-guide/_index.adoc:1234 msgid "" "The trailing `.` is important, as is being at the top level of the repo." msgstr "Завершающая `.` важна, как и нахождение на верхнем уровне репозитория." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1236 +#: documentation/content/en/articles/committers-guide/_index.adoc:1235 msgid "" "Rather than switching branches to XXX, it splats the contents of XXX on top " "of the repo" msgstr "" "Вместо переключения веток на XXX, он накладывает содержимое XXX поверх " "репозитория" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1237 +#: documentation/content/en/articles/committers-guide/_index.adoc:1236 msgid "" "Commit the results with the prior commit message (the example assumes " "there's only one merge on the XXX branch)." msgstr "" -"Сделайте коммит полученному результату с предыдущим сообщением коммита (" -"пример предполагает, что в ветке XXX была только одна операция слияния)." +"Сделайте коммит полученному результату с предыдущим сообщением коммита " +"(пример предполагает, что в ветке XXX была только одна операция слияния)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1238 +#: documentation/content/en/articles/committers-guide/_index.adoc:1237 msgid "Make sure the branches are the same." msgstr "Убедитесь, что ветки одинаковые." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1239 +#: documentation/content/en/articles/committers-guide/_index.adoc:1238 msgid "" "Do whatever review you need, including having others check it out if you " "think that's needed." msgstr "" "Сделайте любые необходимые проверки, включая привлечение других людей для " "проверки, если вы считаете, что это необходимо." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1240 +#: documentation/content/en/articles/committers-guide/_index.adoc:1239 msgid "" "Push the commit, if you 'lost the race' again, just redo these steps again " "(see below for a recipe)" msgstr "" "Запишите (push) этот коммит. Если вы «снова проиграли в гонке», просто " "повторите эти шаги (см. рецепт ниже)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1241 +#: documentation/content/en/articles/committers-guide/_index.adoc:1240 msgid "Delete the branches once the commit is upstream. They are throw-a-way." msgstr "" "Удалите ветки после того, как коммит попадёт в вышестоящий репозиторий. Они " "одноразовые." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1243 +#: documentation/content/en/articles/committers-guide/_index.adoc:1242 msgid "" "The commands one would use, following the above example of mtree, would be " "like so (the `#` starts a comment to help link commands to descriptions " "above):" msgstr "" "Команды, которые можно использовать, следуя приведённому выше примеру с " "mtree, будут выглядеть следующим образом (символ `#` начинает комментарий, " "помогающий связать команды с описаниями выше):" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1256 +#: documentation/content/en/articles/committers-guide/_index.adoc:1255 #, no-wrap msgid "" "% cd ../src\t\t\t# CD to top of tree\n" "% git checkout -b XXX\t\t# create new throw-away XXX branch for merge\n" "% git fetch freebsd\t\t# Get changes from upstream from upstream\n" "% git merge freebsd/main\t# Merge the changes and resolve conflicts\n" "% git checkout -b YYY freebsd/main # Create new throw-away YYY branch for redo\n" "% git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge\n" "% git checkout XXX .\t\t# XXX branch has the conflict resolution\n" "% git commit -c XXX~1\t\t# -c reuses the commit message from commit before rebase\n" "% git diff XXX YYY\t\t# Should be empty\n" "% git show YYY\t\t\t# Should only have changes you want, and be a merge commit from vendor branch\n" msgstr "" "% cd ../src\t\t\t# CD to top of tree\n" "% git checkout -b XXX\t\t# create new throw-away XXX branch for merge\n" "% git fetch freebsd\t\t# Get changes from upstream from upstream\n" "% git merge freebsd/main\t# Merge the changes and resolve conflicts\n" "% git checkout -b YYY freebsd/main # Create new throw-away YYY branch for redo\n" "% git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge\n" "% git checkout XXX .\t\t# XXX branch has the conflict resolution\n" "% git commit -c XXX~1\t\t# -c reuses the commit message from commit before rebase\n" "% git diff XXX YYY\t\t# Should be empty\n" "% git show YYY\t\t\t# Should only have changes you want, and be a merge commit from vendor branch\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1259 +#: documentation/content/en/articles/committers-guide/_index.adoc:1258 msgid "" "Note: if things go wrong with the commit, you can reset the `YYY` branch by " "reissuing the checkout command that created it with -B to start over:" msgstr "" "Примечание: если что-то пойдет не так с коммитом, вы можете сбросить ветку " "`YYY`, повторно выполнив команду checkout, которая создала её, с флагом -B, " "чтобы начать заново:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1262 +#: documentation/content/en/articles/committers-guide/_index.adoc:1261 #, no-wrap msgid "% git checkout -B YYY freebsd/main # Create new throw-away YYY branch if starting over is just going to be easier\n" -msgstr "" -"% git checkout -B YYY freebsd/main # Создать новую временную ветку YYY, если " -"начать заново будет проще\n" +msgstr "% git checkout -B YYY freebsd/main # Создать новую временную ветку YYY, если начать заново будет проще\n" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1264 +#: documentation/content/en/articles/committers-guide/_index.adoc:1263 #, no-wrap msgid "Pushing the changes" msgstr "Отправка (push) изменений" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1269 +#: documentation/content/en/articles/committers-guide/_index.adoc:1268 msgid "" "Once you think you have a set of changes that are good, you can push it to a " "fork off GitHub or GitLab for others to review. One nice thing about Git is " "that it allows you to publish rough drafts of your work for others to " "review. While Phabricator is good for content review, publishing the " "updated vendor branch and merge commits lets others check the details as " "they will eventually appear in the repository." msgstr "" "Когда вы считаете, что у вас есть набор изменений, и они хорошие, вы можете " "отправить их в форк на GitHub или GitLab для просмотра и рецензирования " "другими. Одна из хороших особенностей Git заключается в том, что он " "позволяет публиковать черновые версии вашей работы для проверки другими. " "Хотя Phabricator хорош для проверки содержания, публикация обновленной ветки " "вендора и коммитов слияния позволяет другим проверить детали, которые в " "конечном итоге появятся в репозитории." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1271 +#: documentation/content/en/articles/committers-guide/_index.adoc:1270 msgid "" "After review, when you are sure it is a good change, you can push it to the " "FreeBSD repo:" msgstr "" "После проверки, когда вы уверены, что это хорошее изменение, вы можете " "отправить (push) его в репозиторий FreeBSD:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1277 +#: documentation/content/en/articles/committers-guide/_index.adoc:1276 #, no-wrap msgid "" "% git push freebsd YYY:main\t# put the commit on upstream's 'main' branch\n" "% git branch -D XXX\t\t# Throw away the throw-a-way branches.\n" "% git branch -D YYY\n" msgstr "" "% git push freebsd YYY:main\t# put the commit on upstream's 'main' branch\n" "% git branch -D XXX\t\t# Throw away the throw-a-way branches.\n" "% git branch -D YYY\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1284 +#: documentation/content/en/articles/committers-guide/_index.adoc:1283 msgid "" "Note: I used `XXX` and `YYY` to make it obvious they are terrible names and " "should not leave your machine. If you use such names for other work, then " "you'll need to pick different names, or risk losing the other work. There " "is nothing magic about these names. Upstream will not allow you to push " "them, but never the less, please pay attention to the exact commands above. " "Some commands use syntax that differs only slightly from typical uses and " "that different behavior is critical to this recipe working." msgstr "" "Примечание: Я использовал `XXX` и `YYY`, чтобы было очевидно, что это " "ужасные имена, и они не должны покидать вашу машину. Если вы используете " "такие имена для другой работы, вам нужно будет выбрать другие имена или " "рискнуть потерять другую работу. В этих именах нет ничего волшебного. В " "вышестоящий репозиторий вам не разрешат их отправить, но, тем не менее, " "обратите внимание на точные команды выше. Некоторые команды используют " "синтаксис, который лишь незначительно отличается от типичного использования, " "и это различие в поведении критически важно для работы данного рецепта." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1285 +#: documentation/content/en/articles/committers-guide/_index.adoc:1284 #, no-wrap msgid "How to redo things if need be" msgstr "Как переделать вещи, если это необходимо" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1289 +#: documentation/content/en/articles/committers-guide/_index.adoc:1288 msgid "" "If you've tried to do the push in the previous section and it fails, then " "you should do the following to 'redo' things. This sequence keeps the " "commit with the commit message always at XXX~1 to make committing easier." msgstr "" "Если вы попытались выполнить отправку из предыдущего раздела и она " -"завершилась неудачей, то вам следует выполнить следующие действия для «" -"повторного выполнения» операций. Эта последовательность сохраняет коммит с " +"завершилась неудачей, то вам следует выполнить следующие действия для " +"«повторного выполнения» операций. Эта последовательность сохраняет коммит с " "сообщением о коммите всегда на позиции XXX~1 для упрощения коммита." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1298 +#: documentation/content/en/articles/committers-guide/_index.adoc:1297 #, no-wrap msgid "" "% git checkout -B XXX YYY\t# recreate that throw-away-branch XXX and switch to it\n" "% git merge freebsd/main\t# Merge the changes and resolve conflicts\n" "% git checkout -B YYY freebsd/main # Recreate new throw-away YYY branch for redo\n" "% git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge\n" "% git checkout XXX .\t\t# XXX branch has the conflict resolution\n" "% git commit -c XXX~1\t\t# -c reuses the commit message from commit before rebase\n" msgstr "" -"% git checkout -B XXX YYY\t# recreate that throw-away-branch XXX and switch " -"to it\n" +"% git checkout -B XXX YYY\t# recreate that throw-away-branch XXX and switch to it\n" "% git merge freebsd/main\t# Merge the changes and resolve conflicts\n" -"% git checkout -B YYY freebsd/main # Recreate new throw-away YYY branch for " -"redo\n" -"% git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree " -"merge\n" +"% git checkout -B YYY freebsd/main # Recreate new throw-away YYY branch for redo\n" +"% git subtree merge -P contrib/mtree vendor/NetBSD/mtree # Redo subtree merge\n" "% git checkout XXX .\t\t# XXX branch has the conflict resolution\n" -"% git commit -c XXX~1\t\t# -c reuses the commit message from commit before " -"rebase\n" +"% git commit -c XXX~1\t\t# -c reuses the commit message from commit before rebase\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1301 +#: documentation/content/en/articles/committers-guide/_index.adoc:1300 msgid "Then go check it out as above and push as above when ready." msgstr "" "Затем проверьте, как описано выше, и отправьте (push), как описано выше, " "когда будет готово." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:1302 +#: documentation/content/en/articles/committers-guide/_index.adoc:1301 #, no-wrap msgid "Creating a new vendor branch" msgstr "Создание новой ветки вендора" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1309 +#: documentation/content/en/articles/committers-guide/_index.adoc:1308 msgid "" "There are a number of ways to create a new vendor branch. The recommended " "way is to create a new repository and then merge that with FreeBSD. If one " "is importing `glorbnitz` into the FreeBSD tree, release 3.1415. For the " "sake of simplicity, we will not trim this release. It is a simple user " "command that puts the nitz device into different magical glorb states and is " "small enough trimming will not save much." msgstr "" "Существует несколько способов создания новой ветки вендора. Рекомендуемый " "способ — создать новый репозиторий и затем сделать его слияние с FreeBSD. " "Например, производится импорт `glorbnitz` версии 3.1415 в дерево FreeBSD. " "Для простоты мы не будем обрезать этот релиз. Это простая пользовательская " "команда, которая переводит устройство nitz в различные магические состояния " "glorb, и она достаточно мала, так что обрезка не сэкономит много." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1310 +#: documentation/content/en/articles/committers-guide/_index.adoc:1309 #, no-wrap msgid "Create the repo" msgstr "Создайте репозиторий" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1319 +#: documentation/content/en/articles/committers-guide/_index.adoc:1318 #, no-wrap msgid "" "% cd /some/where\n" "% mkdir glorbnitz\n" "% cd glorbnitz\n" "% git init\n" "% git checkout -b vendor/glorbnitz\n" msgstr "" "% cd /some/where\n" "% mkdir glorbnitz\n" "% cd glorbnitz\n" "% git init\n" "% git checkout -b vendor/glorbnitz\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1322 +#: documentation/content/en/articles/committers-guide/_index.adoc:1321 msgid "" "At this point, you have a new repo, where all new commits will go on the " "`vendor/glorbnitz` branch." msgstr "" "На этом этапе у вас есть новый репозиторий, в котором все новые коммиты " "будут направляться в ветку `vendor/glorbnitz`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1324 +#: documentation/content/en/articles/committers-guide/_index.adoc:1323 msgid "" "Git experts can also do this right in their FreeBSD clone, using `git " "checkout --orphan vendor/glorbnitz` if they are more comfortable with that." msgstr "" "Опытные пользователи Git также могут сделать это непосредственно в своей " "копии FreeBSD, используя `git checkout --orphan vendor/glorbnitz`, если им " "так удобнее." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1325 +#: documentation/content/en/articles/committers-guide/_index.adoc:1324 #, no-wrap msgid "Copy the sources in" msgstr "Скопируйте себе исходники" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1329 +#: documentation/content/en/articles/committers-guide/_index.adoc:1328 msgid "" "Since this is a new import, you can just cp the sources in, or use tar or " "even rsync as shown above. And we will add everything, assuming no dot " "files." msgstr "" "Поскольку это новая импортированная копия, вы можете просто скопировать " "файлы исходного кода командой cp, либо использовать tar или даже rsync, как " "показано выше. И мы добавим всё, предполагая отсутствие файлов с точкой в " "начале имени." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1334 +#: documentation/content/en/articles/committers-guide/_index.adoc:1333 #, no-wrap msgid "" "% cp -r ~/glorbnitz/* .\n" "% git add *\n" msgstr "" "% cp -r ~/glorbnitz/* . \n" "% git add *\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1337 +#: documentation/content/en/articles/committers-guide/_index.adoc:1336 msgid "" "At this point, you should have a pristine copy of glorbnitz ready to commit." msgstr "" "На этом этапе у вас должна быть чистая копия glorbnitz, готовая к коммиту." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1341 +#: documentation/content/en/articles/committers-guide/_index.adoc:1340 #, no-wrap msgid "% git commit -m \"Import GlorbNitz frobnosticator revision 3.1415\"\n" msgstr "% git commit -m \"Import GlorbNitz frobnosticator revision 3.1415\"\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1346 +#: documentation/content/en/articles/committers-guide/_index.adoc:1345 msgid "" "As above, I used `-m` for simplicity, but you should likely create a commit " "message that explains what a Glorb is and why you'd use a Nitz to get it. " "Not everybody will know so, for your actual commit, you should follow the " "crossref:committers-guide[commit-log-message,commit log message] section " "instead of emulating the brief style used here." msgstr "" "Как и выше, я использовал `-m` для простоты, но вам, вероятно, следует " "создать сообщение коммита, которое объясняет, что такое Glorb и почему для " "его получения используется Nitz. Не все это знают, поэтому для вашего " "реального коммита вам следует руководствоваться разделом crossref:committers-" "guide[commit-log-message,сообщение коммита], а не имитировать краткий стиль, " "использованный здесь." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1347 +#: documentation/content/en/articles/committers-guide/_index.adoc:1346 #, no-wrap msgid "Now import it into our repository" msgstr "Теперь импортируйте его в наш репозиторий" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1350 +#: documentation/content/en/articles/committers-guide/_index.adoc:1349 msgid "Now you need to import the branch into our repository." msgstr "Теперь необходимо импортировать ветку в наш репозиторий." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1356 +#: documentation/content/en/articles/committers-guide/_index.adoc:1355 #, no-wrap msgid "" "% cd /path/to/freebsd/repo/src\n" "% git remote add glorbnitz /some/where/glorbnitz\n" "% git fetch glorbnitz vendor/glorbnitz\n" msgstr "" "% cd /path/to/freebsd/repo/src\n" "% git remote add glorbnitz /some/where/glorbnitz\n" "% git fetch glorbnitz vendor/glorbnitz\n" #. perhaps the real treasure was the friends it made along the way... #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1360 +#: documentation/content/en/articles/committers-guide/_index.adoc:1359 msgid "" "Note the vendor/glorbnitz branch is in the repo. At this point the `/some/" "where/glorbnitz` can be deleted, if you like. It was only a means to an end." msgstr "" "Обратите внимание, что ветка vendor/glorbnitz находится в репозитории. На " "этом этапе `/some/where/glorbnitz` можно удалить, если хотите. Это было лишь " "промежуточным шагом для достижения цели." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1362 +#: documentation/content/en/articles/committers-guide/_index.adoc:1361 #, no-wrap msgid "Tag and push" msgstr "Сделайте тег и отправьте (push)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1365 +#: documentation/content/en/articles/committers-guide/_index.adoc:1364 msgid "" "Steps from here on out are much the same as they are in the case of updating " "a vendor branch, though without the updating the vendor branch step." msgstr "" "Дальнейшие шаги во многом аналогичны процессу обновления ветки вендора, за " "исключением самого шага обновления ветки вендора." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1373 +#: documentation/content/en/articles/committers-guide/_index.adoc:1372 #, no-wrap msgid "" "% git worktree add ../glorbnitz vendor/glorbnitz\n" "% cd ../glorbnitz\n" "% git tag --annotate vendor/glorbnitz/3.1415\n" "# Make sure the commit is good with \"git show\"\n" "% git push --follow-tags freebsd vendor/glorbnitz\n" msgstr "" "% git worktree add ../glorbnitz vendor/glorbnitz\n" "% cd ../glorbnitz\n" "% git tag --annotate vendor/glorbnitz/3.1415\n" "# Убедитесь, что коммит хороший, с помощью \"git show\"\n" "% git push --follow-tags freebsd vendor/glorbnitz\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1376 +#: documentation/content/en/articles/committers-guide/_index.adoc:1375 msgid "By 'good' we mean:" msgstr "Под «хорошим» мы подразумеваем:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1378 +#: documentation/content/en/articles/committers-guide/_index.adoc:1377 msgid "All the right files are present" msgstr "Все необходимые файлы присутствуют" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1379 +#: documentation/content/en/articles/committers-guide/_index.adoc:1378 msgid "None of the wrong files are present" msgstr "Ни один из неправильных файлов не присутствует" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1380 +#: documentation/content/en/articles/committers-guide/_index.adoc:1379 msgid "The vendor branch points at something sensible" msgstr "Ветка вендора указывает на что-то разумное" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1381 +#: documentation/content/en/articles/committers-guide/_index.adoc:1380 msgid "The tag looks good, and is annotated" msgstr "Тег выглядит хорошо и имеет аннотацию" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1382 +#: documentation/content/en/articles/committers-guide/_index.adoc:1381 msgid "" "The commit message for the tag has a quick summary of what's new since the " "last tag" msgstr "" "Сообщение коммита для тега содержит краткую сводку о нововведениях с момента " "предыдущего тега" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1383 +#: documentation/content/en/articles/committers-guide/_index.adoc:1382 #, no-wrap msgid "Time to finally merge it into the base tree" msgstr "Время наконец сделать слияние этого в базовое дерево" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1392 +#: documentation/content/en/articles/committers-guide/_index.adoc:1391 #, no-wrap msgid "" "% cd ../src\n" "% git subtree add -P contrib/glorbnitz vendor/glorbnitz\n" "# Make sure the commit is good with \"git show\"\n" "% git commit --amend # one last sanity check on commit message\n" "% git push freebsd\n" msgstr "" "% cd ../src\n" "% git subtree add -P contrib/glorbnitz vendor/glorbnitz\n" "# Убедитесь, что коммит хороший, с помощью \"git show\"\n" "% git commit --amend # one last sanity check on commit message\n" "% git push freebsd\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1395 +#: documentation/content/en/articles/committers-guide/_index.adoc:1394 msgid "Here 'good' means:" msgstr "Здесь «хороший» означает:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1397 +#: documentation/content/en/articles/committers-guide/_index.adoc:1396 msgid "" "All the right files, and none of the wrong ones, were merged into contrib/" "glorbnitz." msgstr "" "Все правильные файлы и ни одного неправильного были объединены слиянием в " "contrib/glorbnitz." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1398 +#: documentation/content/en/articles/committers-guide/_index.adoc:1397 msgid "No other changes are in the tree." msgstr "В дереве нет других изменений." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1399 +#: documentation/content/en/articles/committers-guide/_index.adoc:1398 msgid "" "The commit messages look crossref:committers-guide[commit-log-message,good]. " "It should contain a summary of what's changed since the last merge to the " "FreeBSD `main` branch and any caveats." msgstr "" "Сообщения коммитов должны выглядеть crossref:committers-guide[commit-log-" "message,хорошо]. Они должны содержать сводку изменений с момента последнего " "слияния с основной веткой FreeBSD `main` и любые предостережения." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1400 +#: documentation/content/en/articles/committers-guide/_index.adoc:1399 msgid "" -"UPDATING should be updated if there is anything of note, such as user " -"visible changes, important upgrade concerns, etc." +"`RELNOTES` and `UPDATING` should be updated if there is anything of note, " +"such as user visible changes, important upgrade concerns, etc." msgstr "" -"UPDATING должен быть обновлен, если есть что-то важное, например, заметные " -"пользователям изменения, важные аспекты обновления и т.д." +"`RELNOTES` и `UPDATING` должны быть обновлены, если есть что-то важное, " +"например, заметные пользователям изменения, важные аспекты обновления и т.д." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1405 +#: documentation/content/en/articles/committers-guide/_index.adoc:1404 msgid "" "This hasn't connected `glorbnitz` to the build yet. How so do that is " "specific to the software being imported and is beyond the scope of this " "tutorial." msgstr "" "Это еще не подключило `glorbnitz` к сборке. Способ сделать это зависит от " "конкретного импортируемого программного обеспечения и выходит за рамки " "данного руководства." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1407 +#: documentation/content/en/articles/committers-guide/_index.adoc:1406 #, no-wrap msgid "Keeping current" msgstr "Сохраняя актуальность" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1413 +#: documentation/content/en/articles/committers-guide/_index.adoc:1412 msgid "" "So, time passes. It's time now to update the tree for the latest changes " "upstream. When you checkout `main` make sure that you have no diffs. It's " "a lot easier to commit those to a branch (or use `git stash`) before doing " "the following." msgstr "" "Итак, время идёт. Пришло время обновить дерево до последних изменений из " "вышестоящего репозитория. При переходе на ветку `main` (при checkout) " "убедитесь, что у вас нет незакоммиченных изменений. Намного проще " "закоммитить их в отдельную ветку (или использовать `git stash`) перед " "выполнением следующих действий." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1416 +#: documentation/content/en/articles/committers-guide/_index.adoc:1415 msgid "" "If you are used to `git pull`, we strongly recommend using the `--ff-only` " "option, and further setting it as the default option. Alternatively, `git " "pull --rebase` is useful if you have changes staged in the `main` branch." msgstr "" "Если вы привыкли к `git pull`, мы настоятельно рекомендуем использовать " "опцию `--ff-only` и дополнительно установить её в качестве опции по " "умолчанию. В качестве альтернативы, `git pull --rebase` полезен, если у вас " "есть изменения, проиндексированные (stage) в ветке `main`." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1420 +#: documentation/content/en/articles/committers-guide/_index.adoc:1419 #, no-wrap msgid "% git config --global pull.ff only\n" msgstr "% git config --global pull.ff only\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1423 +#: documentation/content/en/articles/committers-guide/_index.adoc:1422 msgid "" "You may need to omit the --global if you want this setting to apply to only " "this repository." msgstr "" "Возможно, вам потребуется опустить --global, если вы хотите, чтобы эта " "настройка применялась только к этому репозиторию." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1429 +#: documentation/content/en/articles/committers-guide/_index.adoc:1428 #, no-wrap msgid "" "% cd freebsd-src\n" "% git checkout main\n" "% git pull (--ff-only|--rebase)\n" msgstr "" "% cd freebsd-src\n" "% git checkout main\n" "% git pull (--ff-only|--rebase)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1433 +#: documentation/content/en/articles/committers-guide/_index.adoc:1432 msgid "" "There is a common trap, that the combination command `git pull` will try to " "perform a merge, which would sometimes creates a merge commit that didn't " "exist before. This can be harder to recover from." msgstr "" "Существует распространённая ловушка: команда `git pull` попытается выполнить " "слияние, что иногда создаёт коммит слияния, которого ранее не существовало. " "Восстановление после этого может быть затруднительно." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1435 +#: documentation/content/en/articles/committers-guide/_index.adoc:1434 msgid "The longer form is also recommended." msgstr "Рекомендуется также использовать расширенную форму." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1442 +#: documentation/content/en/articles/committers-guide/_index.adoc:1441 #, no-wrap msgid "" "% cd freebsd-src\n" "% git checkout main\n" "% git fetch freebsd\n" "% git merge --ff-only freebsd/main\n" msgstr "" "% cd freebsd-src\n" "% git checkout main\n" "% git fetch freebsd\n" "% git merge --ff-only freebsd/main\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1447 +#: documentation/content/en/articles/committers-guide/_index.adoc:1446 msgid "" "These commands reset your tree to the `main` branch, and then update it from " "where you pulled the tree from originally. It's important to switch to " "`main` before doing this so it moves forward. Now, it's time to move the " "changes forward:" msgstr "" "Эти команды сбрасывают ваше дерево к ветке `main`, а затем обновляют его из " "исходного источника, откуда дерево было первоначально получено (pull). Важно " "переключиться на `main` перед выполнением этого, чтобы обеспечить " "продвижение вперёд. Теперь пришло время продвинуть изменения вперёд:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1451 +#: documentation/content/en/articles/committers-guide/_index.adoc:1450 #, no-wrap msgid "% git rebase -i main working\n" msgstr "% git rebase -i main working\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1458 +#: documentation/content/en/articles/committers-guide/_index.adoc:1457 msgid "" "This will bring up an interactive screen to change the defaults. For now, " "just exit the editor. Everything should just apply. If not, then you'll " "need to resolve the diffs. https://docs.github.com/en/free-pro-team@latest/" "github/using-git/resolving-merge-conflicts-after-a-git-rebase[This github " "document] can help you navigate this process." msgstr "" "Это вызовет интерактивный экран для изменения настроек по умолчанию. Пока " "просто выйдите из редактора. Всё должно примениться автоматически. Если нет, " "то вам потребуется разрешить различия. https://docs.github.com/en/free-pro-" -"team@latest/github/using-git/resolving-merge-conflicts-after-a-git-rebase[" -"Документация GitHub] может помочь вам в этом процессе." +"team@latest/github/using-git/resolving-merge-conflicts-after-a-git-" +"rebase[Документация GitHub] может помочь вам в этом процессе." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1460 +#: documentation/content/en/articles/committers-guide/_index.adoc:1459 #, no-wrap msgid "Time to push changes upstream" msgstr "Время отправить (push) изменения вверх (upstream)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1463 +#: documentation/content/en/articles/committers-guide/_index.adoc:1462 msgid "" "First, ensure that the push URL is properly configured for the upstream " "repository." msgstr "" "Сначала убедитесь, что URL для отправки (push) правильно настроен для " "вышестоящего репозитория." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1467 +#: documentation/content/en/articles/committers-guide/_index.adoc:1466 #, no-wrap msgid "% git remote set-url --push freebsd ssh://git@gitrepo.freebsd.org/src.git\n" -msgstr "" -"% git remote set-url --push freebsd ssh://git@gitrepo.freebsd.org/src.git\n" +msgstr "% git remote set-url --push freebsd ssh://git@gitrepo.freebsd.org/src.git\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1471 +#: documentation/content/en/articles/committers-guide/_index.adoc:1470 msgid "" "Then, verify that user name and email are configured right. We require that " "they exactly match the passwd entry in FreeBSD cluster." msgstr "" "Затем убедитесь, что имя пользователя и адрес электронной почты настроены " "правильно. Требуется, чтобы они точно соответствовали записи passwd в " "кластере FreeBSD." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1473 +#: documentation/content/en/articles/committers-guide/_index.adoc:1472 msgid "Use" msgstr "Используйте" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1477 +#: documentation/content/en/articles/committers-guide/_index.adoc:1476 #, no-wrap msgid "freefall% gen-gitconfig.sh\n" msgstr "freefall% gen-gitconfig.sh\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1480 +#: documentation/content/en/articles/committers-guide/_index.adoc:1479 msgid "" "on freefall.freebsd.org to get a recipe that you can use directly, assuming /" "usr/local/bin is in the PATH." msgstr "" "на freefall.freebsd.org (при условии, что /usr/local/bin находится в PATH), " "чтобы получить готовый шаблон конфигурации, который можно использовать " "напрямую." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1485 +#: documentation/content/en/articles/committers-guide/_index.adoc:1484 msgid "" "The below command merges the `working` branch into the upstream `main` " "branch. It's important that you curate your changes to be just like you " "want them in the FreeBSD source repo before doing this. This syntax pushes " "the `working` branch to `main`, moving the `main` branch forward. You will " "only be able to do this if this results in a linear change to `main` (e.g. " "no merges)." msgstr "" "Следующая команда делает слияние ветки `working` в основную ветку `main` " "вышестоящего репозитория. Важно, чтобы вы подготовили свои изменения именно " "так, как хотите видеть их в исходном репозитории FreeBSD, перед выполнением " "этой операции. Данный синтаксис отправляет (push) ветку `working` в `main`, " "перемещая ветку `main` вперед. Вы сможете сделать это только в том случае, " "если результатом будет линейное изменение для `main` (т.е. без слияний)." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1489 +#: documentation/content/en/articles/committers-guide/_index.adoc:1488 #, no-wrap msgid "% git push freebsd working:main\n" msgstr "% git push freebsd working:main\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1492 +#: documentation/content/en/articles/committers-guide/_index.adoc:1491 msgid "" "If your push is rejected due to losing a commit race, rebase your branch " "before trying again:" msgstr "" "Если ваша отправка (push) отклонена из-за проигрыша в гонке коммитов, " "перебазируйте вашу ветку перед повторной попыткой:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1499 +#: documentation/content/en/articles/committers-guide/_index.adoc:1498 #, no-wrap msgid "" "% git checkout working\n" "% git fetch freebsd\n" "% git rebase freebsd/main\n" "% git push freebsd working:main\n" msgstr "" "% git checkout working\n" "% git fetch freebsd\n" "% git rebase freebsd/main\n" "% git push freebsd working:main\n" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1502 +#: documentation/content/en/articles/committers-guide/_index.adoc:1501 #, no-wrap msgid "Time to push changes upstream (alternative)" msgstr "Время отправить (push) изменения вверх (альтернативный вариант)" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1507 +#: documentation/content/en/articles/committers-guide/_index.adoc:1506 msgid "" "Some people find it easier to merge their changes to their local `main` " "before pushing to the remote repository. Also, `git arc stage` moves " "changes from a branch to the local `main` when you need to do a subset of a " "branch. The instructions are similar to the prior section:" msgstr "" "Некоторым удобнее делать слияние своих изменений в локальную ветку `main` " "перед отправкой в удалённый репозиторий. Кроме того, `git arc stage` " "перемещает изменения из ветки в локальную `main`, когда требуется выполнить " "только часть изменений из ветки. Инструкции схожи с предыдущим разделом:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1512 +#: documentation/content/en/articles/committers-guide/_index.adoc:1511 #, no-wrap msgid "" "% git checkout main\n" "% git merge --ff-only `working`\n" "% git push freebsd\n" msgstr "" "% git checkout main\n" "% git merge --ff-only `working`\n" "% git push freebsd\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1515 +#: documentation/content/en/articles/committers-guide/_index.adoc:1514 msgid "If you lose the race, then try again with" msgstr "Если вы проиграли гонку, попробуйте снова с" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1519 +#: documentation/content/en/articles/committers-guide/_index.adoc:1518 #, no-wrap msgid "" "% git pull --rebase\n" "% git push freebsd\n" msgstr "" "% git pull --rebase \n" "% git push freebsd\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1522 +#: documentation/content/en/articles/committers-guide/_index.adoc:1521 msgid "" "These commands will fetch the most recent `freebsd/main` and then rebase the " "local `main` changes on top of that, which is what you want when you lose " "the commit race. Note: merging vendor branch commits will not work with " "this technique." msgstr "" "Эти команды получат (fetch) последние изменения из `freebsd/main`, а затем " "перебазируют (rebase) локальные изменения `main` поверх них, что и " "требуется, когда вы проиграли гонку коммитов. Примечание: коммиты слияния " "ветки вендоров не будет работать с этой техникой." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1523 +#: documentation/content/en/articles/committers-guide/_index.adoc:1522 #, no-wrap msgid "Finding the Subversion Revision" msgstr "Поиск ревизии Subversion" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1527 +#: documentation/content/en/articles/committers-guide/_index.adoc:1526 msgid "" "You'll need to make sure that you've fetched the notes (see the crossref:" "committers-guide[git-mini-daily-use, Daily use]for details). Once you have " "these, notes will show up in the git log command like so:" msgstr "" "Вам нужно убедиться, что вы получили (fetch) примечания (подробности " "смотрите в разделе crossref:committers-guide[git-mini-daily-use, Ежедневное " "использование]). Как только вы это сделаете, примечания будут отображаться в " "команде git log следующим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1531 +#: documentation/content/en/articles/committers-guide/_index.adoc:1530 #, no-wrap msgid "% git log\n" msgstr "% git log\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1534 +#: documentation/content/en/articles/committers-guide/_index.adoc:1533 msgid "If you have a specific version in mind, you can use this construct:" msgstr "" "Если у вас есть конкретная версия, вы можете использовать эту конструкцию:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1538 +#: documentation/content/en/articles/committers-guide/_index.adoc:1537 #, no-wrap msgid "% git log --grep revision=XXXX\n" msgstr "% git log --grep revision=XXXX\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1542 +#: documentation/content/en/articles/committers-guide/_index.adoc:1541 msgid "" "to find the specific revision. The hex number after 'commit' is the hash " "you can use to refer to this commit." msgstr "" "чтобы найти конкретную ревизию. Шестнадцатеричное число после 'commit' — это " "хэш, который можно использовать для ссылки на этот коммит." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:1544 +#: documentation/content/en/articles/committers-guide/_index.adoc:1543 #, no-wrap msgid "Git FAQ" msgstr "Часто задаваемые вопросы о Git" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1547 +#: documentation/content/en/articles/committers-guide/_index.adoc:1546 msgid "" "This section provides a number of targeted answers to questions that are " "likely to come up often for users and developers." msgstr "" "В этом разделе представлены конкретные ответы на вопросы, которые часто " "возникают у пользователей и разработчиков." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1552 +#: documentation/content/en/articles/committers-guide/_index.adoc:1551 msgid "" "We use the common convention of having the origin for the FreeBSD repository " "being 'freebsd' rather than the default 'origin' to allow people to use that " "for their own development and to minimize \"whoops\" pushes to the wrong " "repository." msgstr "" "Мы используем общепринятое соглашение, согласно которому источником для " "репозитория FreeBSD является 'freebsd', а не стандартный 'origin', чтобы " "позволить людям использовать его для собственной разработки и минимизировать " "случайные отправки (push) в неправильный репозиторий." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1554 +#: documentation/content/en/articles/committers-guide/_index.adoc:1553 #, no-wrap msgid "Users" msgstr "Пользователи" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1556 +#: documentation/content/en/articles/committers-guide/_index.adoc:1555 #, no-wrap msgid "How do I track -current and -stable with only one copy of the repository?" msgstr "Как отслеживать -current и -stable, имея только одну копию репозитория?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1561 +#: documentation/content/en/articles/committers-guide/_index.adoc:1560 #, no-wrap msgid "" "**Q:** Although disk space is not a huge issue, it's more efficient to use only one copy of the repository.\n" "With SVN mirroring, I could checkout multiple trees from the same repository.\n" "How do I do this with Git?\n" msgstr "" -"**В:** Хотя место на диске не является большой проблемой, эффективнее " -"использовать только одну копию репозитория.\n" -"При зеркалировании SVN я мог извлекать несколько деревьев из одного и того " -"же репозитория.\n" +"**В:** Хотя место на диске не является большой проблемой, эффективнее использовать только одну копию репозитория.\n" +"При зеркалировании SVN я мог извлекать несколько деревьев из одного и того же репозитория.\n" "Как мне сделать это с помощью Git?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1565 +#: documentation/content/en/articles/committers-guide/_index.adoc:1564 #, no-wrap msgid "" "**A:** You can use Git worktrees.\n" "There's a number of ways to do this, but the simplest way is to use a clone to track -current, and a worktree to track stable releases.\n" "While using a 'bare repository' has been put forward as a way to cope, it's more complicated and will not be documented here.\n" msgstr "" "**О:** Вы можете использовать рабочие деревья Git.\n" -"Существует несколько способов сделать это, но самый простой — использовать " -"клон для отслеживания -current и рабочее дерево для отслеживания стабильных " -"выпусков.\n" -"Хотя использование «голого (bare) репозитория» предлагалось как способ " -"справиться с этим, это более сложно и здесь документироваться не будет.\n" +"Существует несколько способов сделать это, но самый простой — использовать клон для отслеживания -current и рабочее дерево для отслеживания стабильных выпусков.\n" +"Хотя использование «голого (bare) репозитория» предлагалось как способ справиться с этим, это более сложно и здесь документироваться не будет.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1568 +#: documentation/content/en/articles/committers-guide/_index.adoc:1567 msgid "" "First, you need to clone the FreeBSD repository, shown here cloning into " "`freebsd-current` to reduce confusion. $URL is whatever mirror works best " "for you:" msgstr "" "Сначала необходимо клонировать репозиторий FreeBSD, здесь показано " "клонирование в `freebsd-current` для избежания путаницы. `$URL` — это любой " "зеркальный сервер, который работает для вас наилучшим образом:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1572 +#: documentation/content/en/articles/committers-guide/_index.adoc:1571 #, no-wrap msgid "% git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' $URL freebsd-current\n" -msgstr "" -"% git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/" -"notes/*' $URL freebsd-current\n" +msgstr "% git clone -o freebsd --config remote.freebsd.fetch='+refs/notes/*:refs/notes/*' $URL freebsd-current\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1575 +#: documentation/content/en/articles/committers-guide/_index.adoc:1574 msgid "then once that's cloned, you can simply create a worktree from it:" msgstr "" "после того, как он будет клонирован, вы можете просто создать рабочее дерево " "из него:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1580 +#: documentation/content/en/articles/committers-guide/_index.adoc:1579 #, no-wrap msgid "" "% cd freebsd-current\n" "% git worktree add ../freebsd-stable-12 stable/12\n" msgstr "" "% cd freebsd-current\n" "% git worktree add ../freebsd-stable-12 stable/12\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1584 +#: documentation/content/en/articles/committers-guide/_index.adoc:1583 msgid "" "this will checkout `stable/12` into a directory named `freebsd-stable-12` " "that's a peer to the `freebsd-current` directory. Once created, it's " "updated very similarly to how you might expect:" msgstr "" "это извлечёт `stable/12` в каталог с именем `freebsd-stable-12`, который " "находится на одном уровне с каталогом `freebsd-current`. После создания он " "обновляется очень похожим образом, как вы могли бы ожидать:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1594 +#: documentation/content/en/articles/committers-guide/_index.adoc:1593 #, no-wrap msgid "" "% cd freebsd-current\n" "% git checkout main\n" "% git pull --ff-only\n" "# changes from upstream now local and current tree updated\n" "% cd ../freebsd-stable-12\n" "% git merge --ff-only freebsd/stable/12\n" "# now your stable/12 is up to date too\n" msgstr "" "% cd freebsd-current\n" "% git checkout main\n" "% git pull --ff-only\n" "# changes from upstream now local and current tree updated\n" "% cd ../freebsd-stable-12\n" "% git merge --ff-only freebsd/stable/12\n" "# now your stable/12 is up to date too\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1597 +#: documentation/content/en/articles/committers-guide/_index.adoc:1596 msgid "" "I recommend using `--ff-only` because it's safer and you avoid accidentally " "getting into a 'merge nightmare' where you have an extra change in your " "tree, forcing a complicated merge rather than a simple one." msgstr "" "Я рекомендую использовать `--ff-only`, так как это безопаснее и позволяет " "избежать случайного попадания в 'кошмар слияния', когда в вашем дереве " "появляются дополнительные изменения, вынуждающие выполнять сложное слияние " "вместо простого." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1599 +#: documentation/content/en/articles/committers-guide/_index.adoc:1598 msgid "" "Here's https://adventurist.me/posts/00296[a good writeup] that goes into " "more detail." msgstr "" "Вот https://adventurist.me/posts/00296[хорошая статья], в которой " "рассматривается этот вопрос более подробно." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1600 +#: documentation/content/en/articles/committers-guide/_index.adoc:1599 #, no-wrap msgid "Developers" msgstr "Разработчики" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1602 +#: documentation/content/en/articles/committers-guide/_index.adoc:1601 #, no-wrap msgid "Ooops! I committed to `main`, instead of another branch." msgstr "Ой! Я закоммитил в `main` вместо другой ветки." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1605 +#: documentation/content/en/articles/committers-guide/_index.adoc:1604 #, no-wrap msgid "**Q:** From time to time, I goof up and mistakenly commit to the `main` branch. What do I do?\n" -msgstr "" -"**В:** Время от времени я ошибаюсь и по ошибке делаю коммит в ветку `main`. " -"Что мне делать?\n" +msgstr "**В:** Время от времени я ошибаюсь и по ошибке делаю коммит в ветку `main`. Что мне делать?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1607 +#: documentation/content/en/articles/committers-guide/_index.adoc:1606 #, no-wrap msgid "**A:** First, don't panic.\n" msgstr "**О:** Во-первых, не паникуйте.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1611 +#: documentation/content/en/articles/committers-guide/_index.adoc:1610 msgid "" "Second, don't push. In fact, you can fix almost anything if you haven't " "pushed. All the answers in this section assume no push has happened." msgstr "" "Во-вторых, не отправляйте (push) изменения. На самом деле, можно исправить " "почти всё, если изменения не были отправлены. Все ответы в этом разделе " "предполагают, что отправки не произошло." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1613 +#: documentation/content/en/articles/committers-guide/_index.adoc:1612 msgid "" "The following answer assumes you committed to `main` and want to create a " "branch called `issue`:" msgstr "" "Следующий ответ предполагает, что вы закоммитили в `main` и хотите создать " "ветку с названием `issue`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1619 +#: documentation/content/en/articles/committers-guide/_index.adoc:1618 #, no-wrap msgid "" "% git checkout -b issue # Create the 'issue' branch\n" "% git checkout -B main freebsd/main # Reset main to upstream\n" "% git checkout issue # Back to where you were\n" msgstr "" "% git checkout -b issue # Create the 'issue' branch\n" "% git checkout -B main freebsd/main # Reset main to upstream\n" "% git checkout issue # Back to where you were\n" #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1621 +#: documentation/content/en/articles/committers-guide/_index.adoc:1620 #, no-wrap msgid "Ooops! I committed something to the wrong branch!" msgstr "Ой! Я закоммитил что-то не в ту ветку!" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1625 +#: documentation/content/en/articles/committers-guide/_index.adoc:1624 #, no-wrap msgid "" "**Q:** I was working on feature on the `wilma` branch, but accidentally committed a change relevant to the `fred` branch in 'wilma'.\n" "What do I do?\n" msgstr "" -"**В:** Я работал над функцией в ветке `wilma`, но случайно сделал коммит " -"изменению, относящемуся к ветке `fred`, в 'wilma'.\n" +"**В:** Я работал над функцией в ветке `wilma`, но случайно сделал коммит изменению, относящемуся к ветке `fred`, в 'wilma'.\n" "Что мне делать?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1629 +#: documentation/content/en/articles/committers-guide/_index.adoc:1628 #, no-wrap msgid "" "**A:** The answer is similar to the previous one, but with cherry picking.\n" "This assumes there's only one commit on wilma, but will generalize to more complicated situations.\n" "It also assumes that it's the last commit on wilma (hence using wilma in the `git cherry-pick` command), but that too can be generalized.\n" msgstr "" -"**О:** Ответ аналогичен предыдущему, но с использованием выборочного " -"применением коммитов (cherry-pick).\n" -"Предполагается, что в ветке wilma имеется всего один коммит, однако подход " -"можно обобщить и для более сложных ситуаций.\n" -"Также предполагается, что это последний коммит в ветке wilma (отсюда " -"использование wilma в команде `git cherry-pick`), но и это можно обобщить.\n" +"**О:** Ответ аналогичен предыдущему, но с использованием выборочного применением коммитов (cherry-pick).\n" +"Предполагается, что в ветке wilma имеется всего один коммит, однако подход можно обобщить и для более сложных ситуаций.\n" +"Также предполагается, что это последний коммит в ветке wilma (отсюда использование wilma в команде `git cherry-pick`), но и это можно обобщить.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1637 +#: documentation/content/en/articles/committers-guide/_index.adoc:1636 #, no-wrap msgid "" "# We're on branch wilma\n" "% git checkout fred\t\t# move to fred branch\n" "% git cherry-pick wilma\t\t# copy the misplaced commit\n" "% git checkout wilma\t\t# go back to wilma branch\n" "% git reset --hard HEAD^\t# move what wilma refers to back 1 commit\n" msgstr "" "# We're on branch wilma\n" "% git checkout fred\t\t# move to fred branch\n" "% git cherry-pick wilma\t\t# copy the misplaced commit\n" "% git checkout wilma\t\t# go back to wilma branch\n" "% git reset --hard HEAD^\t# move what wilma refers to back 1 commit\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1640 +#: documentation/content/en/articles/committers-guide/_index.adoc:1639 msgid "" "If it is not the last commit, you can cherry-pick that one change from wilma " "onto fred, then use `git rebase -i` to remove the change from wilma." msgstr "" "Если это не последний коммит, вы можете выборочно применить (cherry-pick) " "это одно изменение из wilma к fred, затем использовать `git rebase -i`, " "чтобы удалить изменение из wilma." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1647 +#: documentation/content/en/articles/committers-guide/_index.adoc:1646 #, no-wrap msgid "" "# We're on branch wilma\n" "% git checkout fred\t\t\t# move to fred branch\n" "% git cherry-pick HASH_OF_CHANGE\t# copy the misplaced commit\n" "% git rebase -i main wilma\t\t# drop the cherry-picked change\n" msgstr "" "# Мы находимся на ветке wilma\n" "% git checkout fred\t\t\t# перейти на ветку fred\n" "% git cherry-pick HASH_OF_CHANGE\t# скопировать ошибочно размещённый коммит\n" "% git rebase -i main wilma\t\t# удалить скопированное изменение\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1650 +#: documentation/content/en/articles/committers-guide/_index.adoc:1649 #, no-wrap msgid "**Q:** But what if I want to commit a few changes to `main`, but keep the rest in `wilma` for some reason?\n" -msgstr "" -"**В:** Но что, если я хочу сделать коммит нескольким изменениям в `main`, но " -"оставить остальные в `wilma` по какой-то причине?\n" +msgstr "**В:** Но что, если я хочу сделать коммит нескольким изменениям в `main`, но оставить остальные в `wilma` по какой-то причине?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1656 +#: documentation/content/en/articles/committers-guide/_index.adoc:1655 #, no-wrap msgid "" "**A:** The same technique above also works if you are wanting to 'land' parts of the branch you are working on into `main` before the rest of the branch is ready (say you noticed an unrelated typo, or fixed an incidental bug).\n" "You can cherry pick those changes into `main`, then push to the parent repository.\n" "Once you've done that, cleanup couldn't be simpler: just `git rebase -i`.\n" "Git will notice you've done this and skip the common changes automatically (even if you had to change the commit message or tweak the commit slightly).\n" "There's no need to switch back to wilma to adjust it: just rebase!\n" msgstr "" -"**О:** Тот же метод, описанный выше, также работает, если вы хотите " -"«приземлить» части ветки, над которой работаете, в `main` до того, как вся " -"ветка будет готова (скажем, вы заметили несвязанную опечатку или исправили " -"случайную ошибку).\n" -"Вы можете выборочно применить (cherry-pick) эти изменения в `main`, а затем " -"отправить их в родительский репозиторий.\n" -"После того, как вы это сделаете, очистка не может быть проще: просто " -"выполните `git rebase -i`.\n" -"Git заметит, что вы это сделали, и автоматически пропустит общие изменения (" -"даже если вам пришлось изменить сообщение коммита или слегка " -"подкорректировать коммит).\n" -"Нет необходимости переключаться обратно на wilma, чтобы её поправить: просто " -"делайте rebase!\n" +"**О:** Тот же метод, описанный выше, также работает, если вы хотите «приземлить» части ветки, над которой работаете, в `main` до того, как вся ветка будет готова (скажем, вы заметили несвязанную опечатку или исправили случайную ошибку).\n" +"Вы можете выборочно применить (cherry-pick) эти изменения в `main`, а затем отправить их в родительский репозиторий.\n" +"После того, как вы это сделаете, очистка не может быть проще: просто выполните `git rebase -i`.\n" +"Git заметит, что вы это сделали, и автоматически пропустит общие изменения (даже если вам пришлось изменить сообщение коммита или слегка подкорректировать коммит).\n" +"Нет необходимости переключаться обратно на wilma, чтобы её поправить: просто делайте rebase!\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1658 +#: documentation/content/en/articles/committers-guide/_index.adoc:1657 #, no-wrap msgid "**Q:** I want to split off some changes from branch `wilma` into branch `fred`\n" -msgstr "" -"**В:** Я хочу выделить некоторые изменения из ветки `wilma` в ветку `fred`\n" +msgstr "**В:** Я хочу выделить некоторые изменения из ветки `wilma` в ветку `fred`\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1664 +#: documentation/content/en/articles/committers-guide/_index.adoc:1663 #, no-wrap msgid "" "**A:** The more general answer would be the same as the previous.\n" "You'd checkout/create the `fred` branch, cherry pick the changes you want from `wilma` one at a time, then rebase `wilma` to remove those changes you cherry picked.\n" "`git rebase -i main wilma` will toss you into an editor, and remove the `pick` lines that correspond to the commits you copied to `fred`.\n" "If all goes well, and there are no conflicts, you're done.\n" "If not, you'll need to resolve the conflicts as you go.\n" msgstr "" "**О:** Более общий ответ будет таким же, как и предыдущий.\n" -"Вы должны выгрузить(checkout)/создать ветку `fred`, выборочно применить " -"(cherry-pick) нужные изменения из ветки `wilma` по одному, а затем " -"перебазировать (rebase) `wilma`, чтобы удалить те изменения, которые вы " -"выборочно применили.\n" -"`git rebase -i main wilma` перенесёт вас в редактор, где нужно удалить " -"строки `pick`, соответствующие коммитам, которые вы скопировали в `fred`.\n" +"Вы должны выгрузить(checkout)/создать ветку `fred`, выборочно применить (cherry-pick) нужные изменения из ветки `wilma` по одному, а затем перебазировать (rebase) `wilma`, чтобы удалить те изменения, которые вы выборочно применили.\n" +"`git rebase -i main wilma` перенесёт вас в редактор, где нужно удалить строки `pick`, соответствующие коммитам, которые вы скопировали в `fred`.\n" "Если всё пройдёт хорошо и не будет конфликтов, вы закончили.\n" "Если нет, вам нужно будет разрешать конфликты по мере их появления.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1669 +#: documentation/content/en/articles/committers-guide/_index.adoc:1668 msgid "" "The other way to do this would be to checkout `wilma` and then create the " "branch `fred` to point to the same point in the tree. You can then `git " "rebase -i` both these branches, selecting the changes you want in `fred` or " "`wilma` by retaining the pick likes, and deleting the rest from the editor. " "Some people would create a tag/branch called `pre-split` before starting in " "case something goes wrong in the split. You can undo it with the following " "sequence:" msgstr "" "Другой способ сделать это — выгрузить `wilma`, а затем создать ветку `fred`, " -"указывающую на ту же точку в дереве. Затем вы можете выполнить `git rebase " -"-i` для обеих этих веток, выбирая изменения, которые вы хотите видеть в " +"указывающую на ту же точку в дереве. Затем вы можете выполнить `git rebase -" +"i` для обеих этих веток, выбирая изменения, которые вы хотите видеть в " "`fred` или `wilma`, оставляя строки с `pick` и удаляя остальные в редакторе. " "Некоторые предпочитают создать тег/ветку с названием `pre-split` перед " "началом, на случай если что-то пойдет не так при разделении. Вы можете " "отменить это следующей последовательностью:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1676 +#: documentation/content/en/articles/committers-guide/_index.adoc:1675 #, no-wrap msgid "" "% git checkout pre-split\t# Go back\n" "% git branch -D fred\t\t# delete the fred branch\n" "% git checkout -B wilma\t\t# reset the wilma branch\n" "% git branch -d pre-split\t# Pretend it didn't happen\n" msgstr "" "% git checkout pre-split\t# Go back\n" "% git branch -D fred\t\t# delete the fred branch\n" "% git checkout -B wilma\t\t# reset the wilma branch\n" "% git branch -d pre-split\t# Pretend it didn't happen\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1680 +#: documentation/content/en/articles/committers-guide/_index.adoc:1679 msgid "" "The last step is optional. If you are going to try again to split, you'd " "omit it." msgstr "" "Последний шаг необязателен. Если вы собираетесь повторить попытку " "разделения, его можно пропустить." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1684 +#: documentation/content/en/articles/committers-guide/_index.adoc:1683 #, no-wrap msgid "" "**Q:** But I did things as I read along and didn't see your advice at the end to create a branch, and now `fred` and `wilma` are all screwed up.\n" "How do I find what `wilma` was before I started.\n" "I don't know how many times I moved things around.\n" msgstr "" -"**В:** Но я делал всё по мере прочтения и не увидел ваш совет в конце " -"создать ветку, и теперь `fred` и `wilma` полностью испорчены.\n" +"**В:** Но я делал всё по мере прочтения и не увидел ваш совет в конце создать ветку, и теперь `fred` и `wilma` полностью испорчены.\n" "Как мне найти, чем `wilma` была до того, как я начал.\n" "Я не знаю, сколько раз я всё переставлял.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1686 +#: documentation/content/en/articles/committers-guide/_index.adoc:1685 #, no-wrap msgid "**A:** All is not lost. You can figure out it, so long as it hasn't been too long, or too many commits (hundreds).\n" -msgstr "" -"**О:** Не всё потеряно. Вы можете разобраться с этим, если прошло не слишком " -"много времени или не было сделано слишком много коммитов (сотни).\n" +msgstr "**О:** Не всё потеряно. Вы можете разобраться с этим, если прошло не слишком много времени или не было сделано слишком много коммитов (сотни).\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1690 +#: documentation/content/en/articles/committers-guide/_index.adoc:1689 msgid "" "So I created a wilma branch and committed a couple of things to it, then " "decided I wanted to split it into fred and wilma. Nothing weird happened " "when I did that, but let's say it did. The way to look at what you've done " "is with the `git reflog`:" msgstr "" "Итак, я создал ветку wilma и закоммитил в неё пару изменений, затем решил " "разделить её на fred и wilma. Ничего странного при этом не произошло, но " "предположим, что произошло. Способ посмотреть, что вы сделали, — это " "использовать `git reflog`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1705 +#: documentation/content/en/articles/committers-guide/_index.adoc:1704 #, no-wrap msgid "" "% git reflog\n" "6ff9c25 (HEAD -> wilma) HEAD@{0}: rebase -i (finish): returning to refs/heads/wilma\n" "6ff9c25 (HEAD -> wilma) HEAD@{1}: rebase -i (start): checkout main\n" "869cbd3 HEAD@{2}: rebase -i (start): checkout wilma\n" "a6a5094 (fred) HEAD@{3}: rebase -i (finish): returning to refs/heads/fred\n" "a6a5094 (fred) HEAD@{4}: rebase -i (pick): Encourage contributions\n" "1ccd109 (freebsd/main, main) HEAD@{5}: rebase -i (start): checkout main\n" "869cbd3 HEAD@{6}: rebase -i (start): checkout fred\n" "869cbd3 HEAD@{7}: checkout: moving from wilma to fred\n" "869cbd3 HEAD@{8}: commit: Encourage contributions\n" "...\n" "%\n" msgstr "" "% git reflog\n" -"6ff9c25 (HEAD -> wilma) HEAD@{0}: rebase -i (finish): returning to refs/" -"heads/wilma\n" +"6ff9c25 (HEAD -> wilma) HEAD@{0}: rebase -i (finish): returning to refs/heads/wilma\n" "6ff9c25 (HEAD -> wilma) HEAD@{1}: rebase -i (start): checkout main\n" "869cbd3 HEAD@{2}: rebase -i (start): checkout wilma\n" "a6a5094 (fred) HEAD@{3}: rebase -i (finish): returning to refs/heads/fred\n" "a6a5094 (fred) HEAD@{4}: rebase -i (pick): Encourage contributions\n" "1ccd109 (freebsd/main, main) HEAD@{5}: rebase -i (start): checkout main\n" "869cbd3 HEAD@{6}: rebase -i (start): checkout fred\n" "869cbd3 HEAD@{7}: checkout: moving from wilma to fred\n" "869cbd3 HEAD@{8}: commit: Encourage contributions\n" "...\n" "%\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1713 +#: documentation/content/en/articles/committers-guide/_index.adoc:1712 msgid "" "Here we see the changes I've made. You can use it to figure out where " "things went wrong. I'll just point out a few things here. The first one is " "that HEAD@{X} is a 'commitish' thing, so you can use that as an argument to " "a command. Although if that command commits anything to the repository, the " "X numbers change. You can also use the hash (first column)." msgstr "" "Здесь мы видим изменения, которые я внес. Вы можете использовать это, чтобы " "понять, где что-то пошло не так. Я лишь укажу на несколько моментов. Первый " "из них — HEAD@{X} является 'коммитоподобной' сущностью, поэтому вы можете " "использовать это в качестве аргумента команды. Хотя если эта команда вносит " "что-либо в репозиторий, номера X изменяются. Вы также можете использовать " "хэш (первый столбец)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1721 +#: documentation/content/en/articles/committers-guide/_index.adoc:1720 msgid "" "Next, 'Encourage contributions' was the last commit I made to `wilma` before " "I decided to split things up. You can also see the same hash is there when " "I created the `fred` branch to do that. I started by rebasing `fred` and " "you see the 'start', each step, and the 'finish' for that process. While we " "don't need it here, you can figure out exactly what happened. Fortunately, " "to fix this, you can follow the prior answer's steps, but with the hash " "`869cbd3` instead of `pre-split`. While that seems a bit verbose, it's easy " "to remember since you're doing one thing at a time. You can also stack:" msgstr "" "Далее, 'Encourage contributions' был последним коммитом, который я сделал в " "`wilma` перед тем, как решил разделить всё. Вы также можете видеть, что тот " "же хэш присутствует, когда я создал ветку `fred` для этого. Я начал с " "перебазирования `fred`, и вы видите 'начало', каждый шаг и 'завершение' " "этого процесса. Хотя нам это здесь не нужно, вы можете точно понять, что " "произошло. К счастью, чтобы исправить это, вы можете выполнить шаги из " "предыдущего ответа, но с хэшем `869cbd3` вместо `pre-split`. Хотя это " "кажется немного многословным, это легко запомнить, поскольку вы делаете одно " "действие за раз. Вы также можете последовательно применить команды одну за " "другой:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1726 +#: documentation/content/en/articles/committers-guide/_index.adoc:1725 #, no-wrap msgid "" "% git checkout -B wilma 869cbd3\n" "% git branch -D fred\n" msgstr "" "% git checkout -B wilma 869cbd3\n" "% git branch -D fred\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1733 +#: documentation/content/en/articles/committers-guide/_index.adoc:1732 msgid "" "and you are ready to try again. The `checkout -B` with the hash combines " "checking out and creating a branch for it. The `-B` instead of `-b` forces " "the movement of a pre-existing branch. Either way works, which is what's " "great (and awful) about Git. One reason I tend to use `git checkout -B xxxx " "hash` instead of checking out the hash, and then creating / moving the " "branch is purely to avoid the slightly distressing message about detached " "heads:" msgstr "" "и вы готовы попробовать снова. Команда `checkout -B` с хэшем объединяет " "извлечение (checkout) и создание ветки для него. Использование `-B` вместо " "`-b` принудительно перемещает уже существующую ветку. В любом случае это " "работает, что и прекрасно (и ужасно) в Git. Одна из причин, по которой я " "склонен использовать `git checkout -B xxxx хэш` вместо извлечения (checkout) " "хэша, а затем создания / перемещения ветки, — это чисто чтобы избежать " "слегка тревожного сообщения об отделённом HEAD:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1739 +#: documentation/content/en/articles/committers-guide/_index.adoc:1738 #, no-wrap msgid "" "% git checkout 869cbd3\n" "M\tfaq.md\n" "Note: checking out '869cbd3'.\n" msgstr "" "% git checkout 869cbd3\n" "M\tfaq.md\n" "Note: checking out '869cbd3'.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1743 +#: documentation/content/en/articles/committers-guide/_index.adoc:1742 #, no-wrap msgid "" "You are in 'detached HEAD' state. You can look around, make experimental\n" "changes and commit them, and you can discard any commits you make in this\n" "state without impacting any branches by performing another checkout.\n" msgstr "" "You are in 'detached HEAD' state. You can look around, make experimental\n" "changes and commit them, and you can discard any commits you make in this\n" "state without impacting any branches by performing another checkout.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1751 +#: documentation/content/en/articles/committers-guide/_index.adoc:1750 #, no-wrap msgid "" "HEAD is now at 869cbd3 Encourage contributions\n" "% git checkout -B wilma\n" msgstr "" "HEAD is now at 869cbd3 Encourage contributions\n" "% git checkout -B wilma\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1754 +#: documentation/content/en/articles/committers-guide/_index.adoc:1753 msgid "" "this produces the same effect, but I have to read a lot more and severed " "heads aren't an image I like to contemplate." msgstr "" "это производит тот же эффект, но мне приходится читать гораздо больше, а " "отрубленные головы (прим перев.: detached HEAD — отрубленная голова) — не " "тот образ, который мне нравится созерцать." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1755 +#: documentation/content/en/articles/committers-guide/_index.adoc:1754 #, no-wrap msgid "Ooops! I did a `git pull` and it created a merge commit, what do I do?" -msgstr "" -"Ой! Я выполнил `git pull`, и это создало коммит слияния, что мне делать?" +msgstr "Ой! Я выполнил `git pull`, и это создало коммит слияния, что мне делать?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1759 +#: documentation/content/en/articles/committers-guide/_index.adoc:1758 #, no-wrap msgid "" "**Q:** I was on autopilot and did a `git pull` for my development tree and that created a merge commit on `main`.\n" "How do I recover?\n" msgstr "" -"**В:** Я действовал на автопилоте и сделал `git pull` для своего дерева " -"разработки, что создало коммит слияния в `main`.\n" +"**В:** Я действовал на автопилоте и сделал `git pull` для своего дерева разработки, что создало коммит слияния в `main`.\n" "Как мне восстановиться?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1761 +#: documentation/content/en/articles/committers-guide/_index.adoc:1760 #, no-wrap msgid "**A:** This can happen when you invoke the pull with your development branch checked out.\n" -msgstr "" -"**О:** Это может произойти, когда вы выполняете извлечение (checkout) с " -"выбранной веткой разработки.\n" +msgstr "**О:** Это может произойти, когда вы выполняете извлечение (checkout) с выбранной веткой разработки.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1763 +#: documentation/content/en/articles/committers-guide/_index.adoc:1762 msgid "Many developers use `git pull --rebase` to avoid this situation." msgstr "" "Многие разработчики используют `git pull --rebase`, чтобы избежать этой " "ситуации." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1766 +#: documentation/content/en/articles/committers-guide/_index.adoc:1765 msgid "" "Right after the pull, you will have the new merge commit checked out. Git " "supports a `HEAD^#` syntax to examine the parents of a merge commit:" msgstr "" "Сразу после получения и слияния (pull) у вас в рабочую копию будет извлечен " "новый коммит слияния. Git поддерживает синтаксис `HEAD^#` для определения " "родителей коммита слияния:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1771 +#: documentation/content/en/articles/committers-guide/_index.adoc:1770 #, no-wrap msgid "" "git log --oneline HEAD^1 # Look at the first parent's commits\n" "git log --oneline HEAD^2 # Look at the second parent's commits\n" msgstr "" "git log --oneline HEAD^1 # Look at the first parent's commits\n" "git log --oneline HEAD^2 # Look at the second parent's commits\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1775 +#: documentation/content/en/articles/committers-guide/_index.adoc:1774 msgid "" "From those logs, you can easily identify which commit is your development " "work. Then you simply reset your branch to the corresponding `HEAD^#`:" msgstr "" "Из этих журналов вы можете легко определить, какой коммит является вашей " "разработкой. Затем вы просто сбрасываете свою ветку к соответствующему " "`HEAD^#`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1779 +#: documentation/content/en/articles/committers-guide/_index.adoc:1778 #, no-wrap msgid "git reset --hard HEAD^1\n" msgstr "git reset --hard HEAD^1\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1782 +#: documentation/content/en/articles/committers-guide/_index.adoc:1781 msgid "" "In addition, a `git pull --rebase` at this stage will rebase your changes to " "'main' to the latest 'freebsd/main'." msgstr "" "Кроме того, команда `git pull --rebase` на этом этапе перебазирует ваши " "изменения из ветки 'main' на последнюю версию 'freebsd/main'." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1784 +#: documentation/content/en/articles/committers-guide/_index.adoc:1783 #, no-wrap msgid "**Q:** But I also need to fix my `main` branch. How do I do that?\n" -msgstr "" -"**В:** Но мне также нужно исправить мою ветку `main`. Как мне это сделать?\n" +msgstr "**В:** Но мне также нужно исправить мою ветку `main`. Как мне это сделать?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1787 +#: documentation/content/en/articles/committers-guide/_index.adoc:1786 #, no-wrap msgid "" "**A:** Git keeps track of the remote repository branches in a `freebsd/` namespace.\n" "To fix your `main` branch, just make it point to the remote's `main`:\n" msgstr "" -"**О:** Git отслеживает ветки удалённого репозитория в пространстве имён `" -"freebsd/`.\n" -"Чтобы исправить вашу ветку `main`, просто заставьте её указывать на " -"удалённую ветку `main`:\n" +"**О:** Git отслеживает ветки удалённого репозитория в пространстве имён `freebsd/`.\n" +"Чтобы исправить вашу ветку `main`, просто заставьте её указывать на удалённую ветку `main`:\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1791 +#: documentation/content/en/articles/committers-guide/_index.adoc:1790 #, no-wrap msgid "git branch -f main freebsd/main\n" msgstr "git branch -f main freebsd/main\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1796 +#: documentation/content/en/articles/committers-guide/_index.adoc:1795 msgid "" "There's nothing magical about branches in Git: they are just labels on a " "graph that are automatically moved forward by making commits. So the above " "works because you're just moving a label. There's no metadata about the " "branch that needs to be preserved due to this." msgstr "" "Ветви в Git не имеют ничего магического: они всего лишь метки на графе, " "которые автоматически перемещаются вперед при создании коммитов. Так что " "вышеописанное работает, потому что вы просто перемещаете метку. Из-за этого " "нет никаких метаданных о ветке, которые нужно было бы сохранять." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1797 +#: documentation/content/en/articles/committers-guide/_index.adoc:1796 #, no-wrap msgid "Mixing and matching branches" msgstr "Смешивание и сопоставление веток" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1801 +#: documentation/content/en/articles/committers-guide/_index.adoc:1800 #, no-wrap msgid "" "**Q:** So I have two branches `worker` and `async` that I'd like to combine into one branch called `feature`\n" "while maintaining the commits in both.\n" msgstr "" -"**В:** Итак, у меня есть две ветки `worker` и `async`, которые я хочу " -"объединить в одну ветку под названием `feature`\n" +"**В:** Итак, у меня есть две ветки `worker` и `async`, которые я хочу объединить в одну ветку под названием `feature`\n" "с сохранением коммитов в обеих.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1803 +#: documentation/content/en/articles/committers-guide/_index.adoc:1802 #, no-wrap msgid "**A:** This is a job for cherry pick.\n" msgstr "**О:** Это задача для выборочного применения (cherry-pick).\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1809 +#: documentation/content/en/articles/committers-guide/_index.adoc:1808 #, no-wrap msgid "" "% git checkout worker\n" "% git checkout -b feature\t# create a new branch\n" "% git cherry-pick main..async\t# bring in the changes\n" msgstr "" "% git checkout worker\n" "% git checkout -b feature\t# create a new branch\n" "% git cherry-pick main..async\t# bring in the changes\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1814 +#: documentation/content/en/articles/committers-guide/_index.adoc:1813 msgid "" "You now have a new branch called `feature`. This branch combines commits " "from both branches. You can further curate it with `git rebase`." msgstr "" "Теперь у вас есть новая ветка под названием `feature`. Эта ветка объединяет " "коммиты из обеих веток. Вы можете далее работать с ней с помощью `git " "rebase`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1816 +#: documentation/content/en/articles/committers-guide/_index.adoc:1815 #, no-wrap msgid "**Q:** I have a branch called `driver` and I'd like to break it up into `kernel` and `userland` so I can evolve them separately and commit each branch as it becomes ready.\n" -msgstr "" -"**В:** У меня есть ветка под названием `driver`, и я хочу разделить её на " -"`kernel` и `userland`, чтобы развивать их отдельно и коммитить каждую ветку " -"по мере её готовности.\n" +msgstr "**В:** У меня есть ветка под названием `driver`, и я хочу разделить её на `kernel` и `userland`, чтобы развивать их отдельно и коммитить каждую ветку по мере её готовности.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1819 +#: documentation/content/en/articles/committers-guide/_index.adoc:1818 #, no-wrap msgid "" "**A:** This takes a little bit of prep work, but `git rebase` will do the heavy\n" "lifting here.\n" msgstr "" "**О:** Это требует небольшой подготовительной работы, но `git rebase`\n" "выполнит здесь основную часть работы.\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1825 +#: documentation/content/en/articles/committers-guide/_index.adoc:1824 #, no-wrap msgid "" "% git checkout driver\t\t# Checkout the driver\n" "% git checkout -b kernel\t# Create kernel branch\n" "% git checkout -b userland\t# Create userland branch\n" msgstr "" "% git checkout driver\t\t# Checkout the driver\n" "% git checkout -b kernel\t# Create kernel branch\n" "% git checkout -b userland\t# Create userland branch\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1830 +#: documentation/content/en/articles/committers-guide/_index.adoc:1829 msgid "" "Now you have two identical branches. So, it's time to separate out the " "commits. We'll assume first that all the commits in `driver` go into either " "the `kernel` or the `userland` branch, but not both." msgstr "" "Теперь у вас есть две идентичные ветки. Значит, пришло время разделить " "коммиты. Мы предположим, что сначала все коммиты в ветке `driver` попадут " "либо в ветку `kernel`, либо в ветку `userland`, но не в обе одновременно." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1834 +#: documentation/content/en/articles/committers-guide/_index.adoc:1833 #, no-wrap msgid "% git rebase -i main kernel\n" msgstr "% git rebase -i main kernel\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1837 +#: documentation/content/en/articles/committers-guide/_index.adoc:1836 msgid "" "and just include the changes you want (with a 'p' or 'pick' line) and just " "delete the commits you don't (this sounds scary, but if worse comes to " "worse, you can throw this all away and start over with the `driver` branch " "since you've not yet moved it)." msgstr "" "и просто включите изменения, которые вы хотите (строкой 'p' или 'pick'), и " "удалите коммиты, которые не нужны (это звучит пугающе, но в худшем случае вы " "всегда можете всё отбросить и начать заново с ветки `driver`, если вы только " "её не переместили)." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1841 +#: documentation/content/en/articles/committers-guide/_index.adoc:1840 #, no-wrap msgid "% git rebase -i main userland\n" msgstr "% git rebase -i main userland\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1844 +#: documentation/content/en/articles/committers-guide/_index.adoc:1843 msgid "and do the same thing you did with the `kernel` branch." msgstr "и сделайте то же самое, что вы сделали с веткой `kernel `." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1847 +#: documentation/content/en/articles/committers-guide/_index.adoc:1846 #, no-wrap msgid "" "**Q:** Oh great! I followed the above and forgot a commit in the `kernel` branch.\n" "How do I recover?\n" msgstr "" -"**В:** Отлично! Я выполнил указанные выше шаги и забыл сделать коммит в " -"ветке `kernel`.\n" +"**В:** Отлично! Я выполнил указанные выше шаги и забыл сделать коммит в ветке `kernel`.\n" "Как мне восстановиться?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1850 +#: documentation/content/en/articles/committers-guide/_index.adoc:1849 #, no-wrap msgid "" "**A:** You can use the `driver` branch to find the hash of the commit is missing and\n" "cherry pick it.\n" msgstr "" -"**О:** Вы можете использовать ветку `driver`, чтобы найти хэш коммита, " -"который отсутствует, и\n" +"**О:** Вы можете использовать ветку `driver`, чтобы найти хэш коммита, который отсутствует, и\n" "выборочно применить его (cherry-pick).\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1856 +#: documentation/content/en/articles/committers-guide/_index.adoc:1855 #, no-wrap msgid "" "% git checkout kernel\n" "% git log driver\n" "% git cherry-pick $HASH\n" msgstr "" "% git checkout kernel\n" "% git log driver\n" "% git cherry-pick $HASH\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1862 +#: documentation/content/en/articles/committers-guide/_index.adoc:1861 #, no-wrap msgid "" "**Q:** OK. I have the same situation as the above, but my commits are all mixed up.\n" "I need parts of one commit to go to one branch and the rest to go to the other.\n" "In fact, I have several.\n" "Your rebase method to select sounds tricky.\n" msgstr "" -"**В:** Хорошо. У меня такая же ситуация, как и выше, но мои коммиты все " -"перемешаны.\n" -"Мне нужно, чтобы части одного коммита попали в одну ветку, а остальные — в " -"другую.\n" +"**В:** Хорошо. У меня такая же ситуация, как и выше, но мои коммиты все перемешаны.\n" +"Мне нужно, чтобы части одного коммита попали в одну ветку, а остальные — в другую.\n" "На самом деле, у меня их несколько.\n" "Ваш метод перебазирования с выбором кажется сложным.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1865 +#: documentation/content/en/articles/committers-guide/_index.adoc:1864 #, no-wrap msgid "" "**A:** In this situation, you'd be better off to curate the original branch to separate\n" "out the commits, and then use the above method to split the branch.\n" msgstr "" "**О:** В этой ситуации вам лучше обработать исходную ветку, чтобы отделить\n" "коммиты, а затем использовать вышеуказанный метод для разделения ветки.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1870 +#: documentation/content/en/articles/committers-guide/_index.adoc:1869 msgid "" "So let's assume that there's just one commit with a clean tree. You can " "either use `git rebase` with an `edit` line, or you can use this with the " "commit on the tip. The steps are the same either way. The first thing we " "need to do is to back up one commit while leaving the changes uncommitted in " "the tree:" msgstr "" "Итак, предположим, что есть всего один коммит с чистым деревом. Вы можете " "использовать либо `git rebase` со строкой `edit`, либо это с коммитом на " "острие. В любом случае шаги одинаковы. Первое, что нам нужно сделать, — это " "откатиться на один коммит назад, оставив изменения незакоммиченными в дереве:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1874 +#: documentation/content/en/articles/committers-guide/_index.adoc:1873 #, no-wrap msgid "% git reset HEAD^\n" msgstr "% git reset HEAD^\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1877 +#: documentation/content/en/articles/committers-guide/_index.adoc:1876 msgid "" "Note: Do not, repeat do not, add `--hard` here since that also removes the " "changes from your tree." msgstr "" "Примечание: НЕ, повторяю, НЕ добавляйте здесь `--hard`, так как это также " "удалит изменения из вашего дерева." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1881 +#: documentation/content/en/articles/committers-guide/_index.adoc:1880 msgid "" "Now, if you are lucky, the change needing to be split up falls entirely " "along file lines. In that case you can just do the usual `git add` for the " "files in each group than do a `git commit`. Note: when you do this, you'll " "lose the commit message when you do the reset, so if you need it for some " "reason, you should save a copy (though `git log $HASH` can recover it)." msgstr "" "Теперь, если вам повезёт, изменения, которые нужно разделить, полностью " "укладываются по границам файлов. В этом случае вы можете просто выполнить " "обычный `git add` для файлов в каждой группе, а затем сделать `git commit`. " "Примечание: при этом вы потеряете сообщение коммита при выполнении сброса, " -"поэтому если оно вам по какой-то причине нужно, следует сохранить копию (" -"хотя `git log $HASH` может его восстановить)." +"поэтому если оно вам по какой-то причине нужно, следует сохранить копию " +"(хотя `git log $HASH` может его восстановить)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1884 +#: documentation/content/en/articles/committers-guide/_index.adoc:1883 msgid "" "If you are not lucky, you'll need to split apart files. There's another " "tool to do that which you can apply one file at a time." msgstr "" "Если вам не повезло, вам придётся разделять файлы. Для этого существует ещё " "один инструмент, который можно применять по одному файлу за раз." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1888 +#: documentation/content/en/articles/committers-guide/_index.adoc:1887 #, no-wrap msgid "git add -i foo/bar.c\n" msgstr "git add -i foo/bar.c\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1894 +#: documentation/content/en/articles/committers-guide/_index.adoc:1893 msgid "" "will step through the diffs, prompting you, one at time, whether to include " "or exclude the hunk. Once you're done, `git commit` and you'll have the " "remainder in your tree. You can run it multiple times as well, and even " "over multiple files (though I find it easier to do one file at a time and " "use the `git rebase -i` to fold the related commits together)." msgstr "" "будет последовательно проходить через различия, предлагая вам включить или " "исключить каждый фрагмент. После завершения, выполните `git commit`, и " "оставшиеся изменения окажутся в вашем дереве. Вы также можете запускать эту " "команду несколько раз, даже для нескольких файлов (хотя я считаю удобнее " "работать с одним файлом за раз и использовать `git rebase -i` для " "объединения связанных коммитов)." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:1895 +#: documentation/content/en/articles/committers-guide/_index.adoc:1894 #, no-wrap msgid "Joining the FreeBSD GitHub oranization." msgstr "Присоединение к организации FreeBSD на GitHub." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1898 +#: documentation/content/en/articles/committers-guide/_index.adoc:1897 #, no-wrap msgid "**Q:** How do I join the FreeBSD GitHub organization?\n" msgstr "**В:** Как присоединиться к организации FreeBSD на GitHub?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1902 +#: documentation/content/en/articles/committers-guide/_index.adoc:1901 #, no-wrap msgid "" "**A:** Please see https://wiki.freebsd.org/GitHub#Joining_the_Organisation[our GitHub Wiki Info] page for details.\n" "Briefly, all FreeBSD committers may join.\n" "Those who are not committers who request joining will be considered on a case by case basis.\n" msgstr "" -"**О:** Подробности смотрите на странице https://wiki.freebsd.org/" -"GitHub#Joining_the_Organisation[нашей вики GitHub].\n" +"**О:** Подробности смотрите на странице https://wiki.freebsd.org/GitHub#Joining_the_Organisation[нашей вики GitHub].\n" "Вкратце, присоединиться могут все коммиттеры FreeBSD.\n" -"Лица, не являющиеся коммиттерами, которые запрашивают присоединение, будут " -"рассматриваться в индивидуальном порядке.\n" +"Лица, не являющиеся коммиттерами, которые запрашивают присоединение, будут рассматриваться в индивидуальном порядке.\n" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:1903 +#: documentation/content/en/articles/committers-guide/_index.adoc:1902 #, no-wrap msgid "Cloning and Mirroring" msgstr "Клонирование и зеркалирование" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1906 +#: documentation/content/en/articles/committers-guide/_index.adoc:1905 #, no-wrap msgid "**Q:** I'd like to mirror the entire Git repository, how do I do that?\n" -msgstr "" -"**В:** Я хочу создать полную зеркальную копию репозитория Git, как мне это " -"сделать?\n" +msgstr "**В:** Я хочу создать полную зеркальную копию репозитория Git, как мне это сделать?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1908 +#: documentation/content/en/articles/committers-guide/_index.adoc:1907 #, no-wrap msgid "**A:** If all you want to do is mirror, then\n" msgstr "**О:** Если вам нужно только зеркалирование, то\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1912 +#: documentation/content/en/articles/committers-guide/_index.adoc:1911 #, no-wrap msgid "% git clone --mirror $URL\n" msgstr "% git clone --mirror $URL\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1916 +#: documentation/content/en/articles/committers-guide/_index.adoc:1915 msgid "" "will do the trick. However, there are two disadvantages to this if you want " "to use it for anything other than a mirror you'll reclone." msgstr "" "сработает. Однако, у этого есть два недостатка, если вы хотите использовать " "это для чего-то кроме зеркала, которое вы будете переклонировать." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1920 +#: documentation/content/en/articles/committers-guide/_index.adoc:1919 msgid "" "First, this is a 'bare repository' which has the repository database, but no " "checked out worktree. This is great for mirroring, but terrible for day to " "day work. There's a number of ways around this with `git worktree`:" msgstr "" "Во-первых, это 'голый репозиторий', который содержит базу данных " "репозитория, но не имеет извлеченного рабочего дерева. Это отлично подходит " "для зеркалирования, но ужасно для повседневной работы. Существует несколько " "способов обойти это с помощью `git worktree`:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1928 +#: documentation/content/en/articles/committers-guide/_index.adoc:1927 #, no-wrap msgid "" "% git clone --mirror https://git.freebsd.org/ports.git ports.git\n" "% cd ports.git\n" "% git worktree add ../ports main\n" "% git worktree add ../quarterly branches/2020Q4\n" "% cd ../ports\n" msgstr "" "% git clone --mirror https://git.freebsd.org/ports.git ports.git\n" "% cd ports.git\n" "% git worktree add ../ports main\n" "% git worktree add ../quarterly branches/2020Q4\n" "% cd ../ports\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1931 +#: documentation/content/en/articles/committers-guide/_index.adoc:1930 msgid "" "But if you aren't using your mirror for further local clones, then it's a " "poor match." msgstr "" "Но если вы не используете свой зеркальный репозиторий для дальнейшего " "локального клонирования, то это неподходящий выбор." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1934 +#: documentation/content/en/articles/committers-guide/_index.adoc:1933 msgid "" "The second disadvantage is that Git normally rewrites the refs (branch name, " "tags, etc) from upstream so that your local refs can evolve independently of " "upstream. This means that you'll lose changes if you are committing to this " "repository on anything other than private project branches." msgstr "" "Второй недостаток заключается в том, что Git обычно перезаписывает ссылки из " "вышестоящего репозитория (названия веток, теги и т.д.) , чтобы ваши " "локальные ссылки могли изменяться независимо от вышестоящего репозитория. " "Это означает, что вы потеряете изменения, если будете коммитить в свой " "репозиторий куда-либо, кроме веток приватных проектов." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1936 +#: documentation/content/en/articles/committers-guide/_index.adoc:1935 #, no-wrap msgid "**Q:** So what can I do instead?\n" msgstr "**В:** Так что же я могу сделать вместо этого?\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1939 +#: documentation/content/en/articles/committers-guide/_index.adoc:1938 #, no-wrap msgid "" "**A:** Well, you can stuff all of the upstream repository's refs into a private namespace in your local repository.\n" "Git clones everything via a 'refspec' and the default refspec is:\n" msgstr "" -"**О:** Ну, вы можете поместить все ссылки (refs) вышестоящего репозитория в " -"приватное пространство имён вашего локального репозитория.\n" +"**О:** Ну, вы можете поместить все ссылки (refs) вышестоящего репозитория в приватное пространство имён вашего локального репозитория.\n" "Git клонирует всё через 'refspec', и refspec по умолчанию выглядит так:\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1943 +#: documentation/content/en/articles/committers-guide/_index.adoc:1942 #, no-wrap msgid " fetch = +refs/heads/*:refs/remotes/freebsd/*\n" msgstr " fetch = +refs/heads/*:refs/remotes/freebsd/*\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1946 +#: documentation/content/en/articles/committers-guide/_index.adoc:1945 msgid "which says just fetch the branch refs." msgstr "что говорит просто получить (fetch) ссылки веток." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1950 +#: documentation/content/en/articles/committers-guide/_index.adoc:1949 msgid "" "However, the FreeBSD repository has a number of other things in it. To see " "those, you can add explicit refspecs for each ref namespace, or you can " "fetch everything. To setup your repository to do that:" msgstr "" "Однако в репозитории FreeBSD есть и ряд других элементов. Чтобы увидеть их, " "вы можете добавить явные спецификации ссылок для каждого пространства имен " "ссылок или получить всё. Чтобы настроить ваш репозиторий для этого:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1954 +#: documentation/content/en/articles/committers-guide/_index.adoc:1953 #, no-wrap msgid "git config --add remote.freebsd.fetch '+refs/*:refs/freebsd/*'\n" msgstr "git config --add remote.freebsd.fetch '+refs/*:refs/freebsd/*'\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1958 +#: documentation/content/en/articles/committers-guide/_index.adoc:1957 msgid "" "which will put everything in the upstream repository into your local " "repository's `refs/freebsd/` namespace. Please note, that this also grabs " "all the unconverted vendor branches and the number of refs associated with " "them is quite large." msgstr "" "что поместит всё из вышестоящего репозитория в пространство имён `refs/" "freebsd/` вашего локального репозитория. Обратите внимание, что это также " "захватывает все несконвертированные ветки вендоров, а количество связанных с " "ними ссылок довольно велико." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1960 +#: documentation/content/en/articles/committers-guide/_index.adoc:1959 msgid "" "You'll need to refer to these 'refs' with their full name because they " "aren't in and of Git's regular namespaces." msgstr "" "Вам потребуется ссылаться на эти ссылки с их полными именами, поскольку они " "не входят в обычные пространства имён Git." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1964 +#: documentation/content/en/articles/committers-guide/_index.adoc:1963 #, no-wrap msgid "git log refs/freebsd/vendor/zlib/1.2.10\n" msgstr "git log refs/freebsd/vendor/zlib/1.2.10\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1967 +#: documentation/content/en/articles/committers-guide/_index.adoc:1966 msgid "" "would look at the log for the vendor branch for zlib starting at 1.2.10." msgstr "" "будет просматривать журнал ветки вендора для zlib, начиная с версии 1.2.10." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:1968 +#: documentation/content/en/articles/committers-guide/_index.adoc:1967 #, no-wrap msgid "Collaborating with others" msgstr "Сотрудничество с другими" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1972 +#: documentation/content/en/articles/committers-guide/_index.adoc:1971 msgid "" "One of the keys to good software development on a project as large as " "FreeBSD is the ability to collaborate with others before you push your " "changes to the tree. The FreeBSD project's Git repositories do not, yet, " "allow user-created branches to be pushed to the repository, and therefore if " "you wish to share your changes with others you must use another mechanism, " "such as a hosted GitLab or GitHub, to share changes in a user-generated " "branch." msgstr "" "Одним из ключевых моментов качественной разработки программного обеспечения " "в таком крупном проекте, как FreeBSD, является возможность сотрудничать с " "другими участниками до отправки своих изменений в дерево исходного кода. " "Репозитории Git проекта FreeBSD пока не позволяют отправлять " "пользовательские ветки в репозиторий, поэтому если вы хотите поделиться " "своими изменениями с другими, вам необходимо использовать другой механизм, " "например, репозиторий, размещённый в GitLab или GitHub, для обмена " "изменениями в ветке, созданной пользователем." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1974 +#: documentation/content/en/articles/committers-guide/_index.adoc:1973 msgid "" "The following instructions show how to set up a user-generated branch, based " "on the FreeBSD `main` branch, and push it to GitHub." msgstr "" "Следующие инструкции показывают, как создать пользовательскую ветку на " "основе ветки FreeBSD `main` и отправить её в GitHub." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1977 +#: documentation/content/en/articles/committers-guide/_index.adoc:1976 msgid "" "Before you begin, make sure that your local Git repo is up to date and has " "the correct origins set crossref:committers-guide[keeping_current,as shown " "above]." msgstr "" "Прежде чем начать, убедитесь, что ваш локальный репозиторий Git актуален и " -"имеет правильно настроенные источники, как показано в разделе crossref" -":committers-guide[keeping_current,выше]." +"имеет правильно настроенные источники, как показано в разделе crossref:" +"committers-guide[keeping_current,выше]." -#. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1984 +#. type: delimited block . 4 +#: documentation/content/en/articles/committers-guide/_index.adoc:1982 +#, no-wrap msgid "" -"```` % git remote -v freebsd https://git.freebsd.org/src.git (fetch) " -"freebsd ssh://git@gitrepo.freebsd.org/src.git (push) ````" +"% git remote -v\n" +"freebsd https://git.freebsd.org/src.git (fetch)\n" +"freebsd ssh://git@gitrepo.freebsd.org/src.git (push)\n" msgstr "" -"```` % git remote -v freebsd https://git.freebsd.org/src.git (fetch) " -"freebsd ssh://git@gitrepo.freebsd.org/src.git (push) ````" +"% git remote -v\n" +"freebsd https://git.freebsd.org/src.git (fetch)\n" +"freebsd ssh://git@gitrepo.freebsd.org/src.git (push)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1987 +#: documentation/content/en/articles/committers-guide/_index.adoc:1986 msgid "" "The first step is to create a fork of https://github.com/freebsd/freebsd-" "src[FreeBSD] on GitHub following these https://docs.github.com/en/github/" "getting-started-with-github/fork-a-repo[guidelines]. The destination of the " "fork should be your own, personal, GitHub account (gvnn3 in my case)." msgstr "" "Первым шагом является создание форка https://github.com/freebsd/freebsd-" "src[FreeBSD] на GitHub, следуя этим https://docs.github.com/en/github/" "getting-started-with-github/fork-a-repo[инструкциям]. Назначением форка " "должен быть ваш собственный, личный аккаунт на GitHub (в моём случае gvnn3)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:1989 +#: documentation/content/en/articles/committers-guide/_index.adoc:1988 msgid "Now add a remote on your local system that points to your fork:" msgstr "" "Теперь добавьте удаленный репозиторий в вашей локальной системе, который " "указывает на ваш форк:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:1997 +#: documentation/content/en/articles/committers-guide/_index.adoc:1996 #, no-wrap msgid "" "% git remote add github git@github.com:gvnn3/freebsd-src.git\n" "% git remote -v\n" "github\tgit@github.com:gvnn3/freebsd-src.git (fetch)\n" "github\tgit@github.com:gvnn3/freebsd-src.git (push)\n" "freebsd\thttps://git.freebsd.org/src.git (fetch)\n" "freebsd\tssh://git@gitrepo.freebsd.org/src.git (push)\n" msgstr "" "% git remote add github git@github.com:gvnn3/freebsd-src.git\n" "% git remote -v\n" "github\tgit@github.com:gvnn3/freebsd-src.git (fetch)\n" "github\tgit@github.com:gvnn3/freebsd-src.git (push)\n" "freebsd\thttps://git.freebsd.org/src.git (fetch)\n" "freebsd\tssh://git@gitrepo.freebsd.org/src.git (push)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2000 +#: documentation/content/en/articles/committers-guide/_index.adoc:1999 msgid "" "With this in place you can create a branch crossref:committers-" "guide[keeping_a_local_branch,as shown above]." msgstr "" -"В этом репозитории вы можете создать ветку crossref:committers-guide[" -"keeping_a_local_branch,как показано выше]." +"В этом репозитории вы можете создать ветку crossref:committers-" +"guide[keeping_a_local_branch,как показано выше]." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2004 +#: documentation/content/en/articles/committers-guide/_index.adoc:2003 #, no-wrap msgid "% git checkout -b gnn-pr2001-fix\n" msgstr "% git checkout -b gnn-pr2001-fix\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2008 +#: documentation/content/en/articles/committers-guide/_index.adoc:2007 msgid "" "Make whatever modifications you wish in your branch. Build, test, and once " "you're ready to collaborate with others it's time to push your changes into " "your hosted branch. Before you can push you'll have to set the appropriate " "upstream, as Git will tell you the first time you try to push to your +github" "+ remote:" msgstr "" "Вносите любые изменения в своей ветке. Собирайте, тестируйте, и как только " "будете готовы к совместной работе с другими, настанет время отправить свои " "изменения в ветку, размещённую в GitHub. Прежде чем отправить изменения, вам " "нужно будет установить соответствующую вышестоящую ветку (upstream), о чём " "Git сообщит при первой попытке отправки в ваш удалённый репозиторий +github+:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2014 +#: documentation/content/en/articles/committers-guide/_index.adoc:2013 #, no-wrap msgid "" "% git push github\n" "fatal: The current branch gnn-pr2001-fix has no upstream branch.\n" "To push the current branch and set the remote as upstream, use\n" msgstr "" "% git push github\n" "fatal: The current branch gnn-pr2001-fix has no upstream branch.\n" "To push the current branch and set the remote as upstream, use\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2016 +#: documentation/content/en/articles/committers-guide/_index.adoc:2015 #, no-wrap msgid " git push --set-upstream github gnn-pr2001-fix\n" msgstr " git push --set-upstream github gnn-pr2001-fix\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2019 +#: documentation/content/en/articles/committers-guide/_index.adoc:2018 msgid "Setting the push as +git+ advises allows it to succeed:" msgstr "" "Если установить параметры отправки (push) так, как советует +git+, то это " "позволяет ему успешно выполниться:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2037 +#: documentation/content/en/articles/committers-guide/_index.adoc:2036 #, no-wrap msgid "" "% git push --set-upstream github gnn-feature\n" "Enumerating objects: 20486, done.\n" "Counting objects: 100% (20486/20486), done.\n" "Delta compression using up to 8 threads\n" "Compressing objects: 100% (12202/12202), done.\n" "Writing objects: 100% (20180/20180), 56.25 MiB | 13.15 MiB/s, done.\n" "Total 20180 (delta 11316), reused 12972 (delta 7770), pack-reused 0\n" "remote: Resolving deltas: 100% (11316/11316), completed with 247 local objects.\n" "remote:\n" "remote: Create a pull request for 'gnn-feature' on GitHub by visiting:\n" "remote: https://github.com/gvnn3/freebsd-src/pull/new/gnn-feature\n" "remote:\n" "To github.com:gvnn3/freebsd-src.git\n" " * [new branch] gnn-feature -> gnn-feature\n" "Branch 'gnn-feature' set up to track remote branch 'gnn-feature' from 'github'.\n" msgstr "" "% git push --set-upstream github gnn-feature\n" "Enumerating objects: 20486, done.\n" "Counting objects: 100% (20486/20486), done.\n" "Delta compression using up to 8 threads\n" "Compressing objects: 100% (12202/12202), done.\n" "Writing objects: 100% (20180/20180), 56.25 MiB | 13.15 MiB/s, done.\n" "Total 20180 (delta 11316), reused 12972 (delta 7770), pack-reused 0\n" -"remote: Resolving deltas: 100% (11316/11316), completed with 247 local " -"objects.\n" +"remote: Resolving deltas: 100% (11316/11316), completed with 247 local objects.\n" "remote:\n" "remote: Create a pull request for 'gnn-feature' on GitHub by visiting:\n" "remote: https://github.com/gvnn3/freebsd-src/pull/new/gnn-feature\n" "remote:\n" "To github.com:gvnn3/freebsd-src.git\n" " * [new branch] gnn-feature -> gnn-feature\n" -"Branch 'gnn-feature' set up to track remote branch 'gnn-feature' from " -"'github'.\n" +"Branch 'gnn-feature' set up to track remote branch 'gnn-feature' from 'github'.\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2040 +#: documentation/content/en/articles/committers-guide/_index.adoc:2039 msgid "Subsequent changes to the same branch will push correctly by default:" msgstr "" "Последующие изменения в той же ветке будут по умолчанию отправляться " "корректно:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2053 +#: documentation/content/en/articles/committers-guide/_index.adoc:2052 #, no-wrap msgid "" "% git push\n" "Enumerating objects: 4, done.\n" "Counting objects: 100% (4/4), done.\n" "Delta compression using up to 8 threads\n" "Compressing objects: 100% (2/2), done.\n" "Writing objects: 100% (3/3), 314 bytes | 1024 bytes/s, done.\n" "Total 3 (delta 1), reused 1 (delta 0), pack-reused 0\n" "remote: Resolving deltas: 100% (1/1), completed with 1 local object.\n" "To github.com:gvnn3/freebsd-src.git\n" " 9e5243d7b659..cf6aeb8d7dda gnn-feature -> gnn-feature\n" msgstr "" "% git push\n" "Enumerating objects: 4, done.\n" "Counting objects: 100% (4/4), done.\n" "Delta compression using up to 8 threads\n" "Compressing objects: 100% (2/2), done.\n" "Writing objects: 100% (3/3), 314 bytes | 1024 bytes/s, done.\n" "Total 3 (delta 1), reused 1 (delta 0), pack-reused 0\n" "remote: Resolving deltas: 100% (1/1), completed with 1 local object.\n" "To github.com:gvnn3/freebsd-src.git\n" " 9e5243d7b659..cf6aeb8d7dda gnn-feature -> gnn-feature\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2057 +#: documentation/content/en/articles/committers-guide/_index.adoc:2056 msgid "" "At this point your work is now in your branch on +GitHub+ and you can share " "the link with other collaborators." msgstr "" "На этом этапе ваша работа находится в вашей ветке на +GitHub+, и вы можете " "поделиться ссылкой с другими участниками." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2059 +#: documentation/content/en/articles/committers-guide/_index.adoc:2058 #, no-wrap msgid "Landing a github pull request" msgstr "Обработка запросов на принятие изменений (pull request) на github" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2064 +#: documentation/content/en/articles/committers-guide/_index.adoc:2063 msgid "" "This section documents how to land a GitHub pull request that's submitted " "against the FreeBSD Git mirrors at GitHub. While this is not an official " "way to submit patches at this time, sometimes good fixes come in this way " "and it is easiest just to bring them into a committer's tree and have them " "pushed into the FreeBSD's tree from there. Similar steps can be used to " "pull branches from other repositories and land those. When committing pull " "requests from others, one should take extra care to examine all the changes " "to ensure they are exactly as represented." msgstr "" "В этом разделе описано, как интегрировать запрос на принятие изменений (pull " "request) из GitHub, отправленный на зеркала FreeBSD в Git на GitHub. Хотя на " "данный момент это не официальный способ отправки исправлений, иногда таким " "образом приходят хорошие правки, и проще всего просто перенести их в дерево " "коммиттера и оттуда отправить (push) в дерево FreeBSD. Аналогичные шаги " "можно использовать для получать и сливать (pull) ветки из других " "репозиториев и их использовать их. При коммите запросов на принятие " "изменений от других следует проявлять особую осторожность, чтобы проверить " "все изменения и убедиться, что они в точности соответствуют заявленным." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2068 +#: documentation/content/en/articles/committers-guide/_index.adoc:2067 msgid "" "Before beginning, make sure that the local Git repo is up to date and has " "the correct origins set crossref:committers-guide[keeping_current,as shown " "above]. In addition, make sure to have the following origins:" msgstr "" "Прежде чем начать, убедитесь, что локальный репозиторий Git актуален и имеет " "правильно настроенные источники, как показано в разделе crossref:committers-" "guide[keeping_current,выше]. Кроме того, убедитесь, что у вас есть следующие " "источники:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2075 +#: documentation/content/en/articles/committers-guide/_index.adoc:2074 #, no-wrap msgid "" "% git remote -v\n" "freebsd https://git.freebsd.org/src.git (fetch)\n" "freebsd ssh://git@gitrepo.freebsd.org/src.git (push)\n" "github https://github.com/freebsd/freebsd-src (fetch)\n" "github https://github.com/freebsd/freebsd-src (fetch)\n" msgstr "" "% git remote -v\n" "freebsd https://git.freebsd.org/src.git (fetch)\n" "freebsd ssh://git@gitrepo.freebsd.org/src.git (push)\n" "github https://github.com/freebsd/freebsd-src (fetch)\n" "github https://github.com/freebsd/freebsd-src (fetch)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2090 +#: documentation/content/en/articles/committers-guide/_index.adoc:2089 msgid "" "Often pull requests are simple: requests that contain only a single commit. " "In this case, a streamlined approach may be used, though the approach in the " "prior section will also work. Here, a branch is created, the change is " "cherry picked, the commit message adjusted, and sanity-checked before being " "pushed. The branch `staging` is used in this example but it can be any " "name. This technique works for any number of commits in the pull request, " "especially when the changes apply cleanly to the FreeBSD tree. However, " "when there's multiple commits, especially when minor adjustments are needed, " "`git rebase -i` works better than `git cherry-pick`. Briefly, these " "commands create a branch; cherry-picks the changes from the pull request; " "tests it; adjusts the commit messages; and fast forward merges it back to " "`main`. The PR number is `$PR` below. When adjusting the message, add " "`Pull Request: https://github.com/freebsd-src/pull/$PR`. All pull requests " "committed to the FreeBSD repository should be reviewed by at least one " "person. This need not be the person committing it, but in that case the " "person committing it should trust the other reviewers competence to review " "the commit. Committers that do a code review of pull requests before " "pushing them into the repo should add a `Reviewed by:` line to the commit, " "because in this case it is not implicit. Add anybody that reviews and " "approves the commit on github to `Reviewed by:` as well. As always, care " "should be taken to ensure the change does what it is supposed to, and that " "no malicious code is present." msgstr "" "Часто запросы на принятие изменений просты: это запросы, содержащие всего " "один коммит. В этом случае можно использовать упрощённый подход, хотя подход " "из предыдущего раздела также будет работать. Здесь создаётся ветка, " "изменения выборочно применяются, сообщение коммита корректируется и " "проверяется на адекватность перед отправкой. В этом примере используется " "ветка `staging`, но она может иметь любое имя. Эта техника работает для " "любого количества коммитов в запросе на принятие изменений, особенно когда " "изменения чисто применяются к дереву FreeBSD. Однако, когда коммитов " "несколько, особенно когда требуются незначительные корректировки, `git " "rebase -i` работает лучше, чем `git cherry-pick`. Вкратце, эти команды " "создают ветку; выборочно применяют изменения из запроса на принятие " "изменений; тестируют их; корректируют сообщения коммитов; и выполняют " "слияние перемоткой (fast-forward) обратно в `main`. Номер PR ниже обозначен " -"как `$PR`. При корректировке сообщения добавьте `Pull Request: https://github" -".com/freebsd-src/pull/$PR`. Все запросы на принятие изменений, " +"как `$PR`. При корректировке сообщения добавьте `Pull Request: https://" +"github.com/freebsd-src/pull/$PR`. Все запросы на принятие изменений, " "зафиксированные в репозитории FreeBSD, должны быть проверены как минимум " "одним человеком. Это не обязательно должен быть тот, кто их фиксирует, но в " "этом случае тот, кто фиксирует, должен доверять компетентности других " "рецензентов в проверке коммита. Коммиттеры, которые проводят рецензирование " "кода у запросов на принятие изменений перед их отправкой в репозиторий, " "должны добавить строку `Reviewed by:` к коммиту, потому что в этом случае " "это не подразумевается. Добавьте всех, кто просматривает и одобряет коммит " "на github, также в `Reviewed by:`. Как всегда, следует позаботиться о том, " "чтобы изменение делало то, что предполагается, и чтобы в нём не было " "вредоносного кода." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2094 +#: documentation/content/en/articles/committers-guide/_index.adoc:2093 msgid "" "In addition, please check to make sure that the pull request author name is " "not anonymous. Github's web editing interface generates names like:" msgstr "" "Кроме того, пожалуйста, убедитесь, что имя автора запроса на принятие " "изменений не является анонимным. Веб-интерфейс редактирования Github " "генерирует имена вида:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2097 +#: documentation/content/en/articles/committers-guide/_index.adoc:2096 #, no-wrap msgid "Author: github-user <38923459+github-user@users.noreply.github.com>\n" msgstr "Author: github-user <38923459+github-user@users.noreply.github.com>\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2100 +#: documentation/content/en/articles/committers-guide/_index.adoc:2099 msgid "" "A polite request to the author for a better name and/or email should be " "made. Extra care should be taken to ensure no style issue or malicious code " "is introduced." msgstr "" "Автору следует отправить вежливую просьбу предоставить более подходящее имя " "и/или адрес электронной почты. Следует проявлять особую осторожность, чтобы " "не допустить ошибок стиля или внедрения вредоносного кода." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2113 +#: documentation/content/en/articles/committers-guide/_index.adoc:2112 #, no-wrap msgid "" "% git fetch github pull/$PR/head:staging\n" "% git rebase -i main staging\t# to move the staging branch forward, adjust commit message here\n" "\n" "% git checkout main\n" "% git pull --ff-only\t\t# to get the latest if time has passed\n" "% git checkout main\n" "% git merge --ff-only staging\n" "\n" "% git push freebsd --push-option=confirm-author\n" msgstr "" "% git fetch github pull/$PR/head:staging\n" -"% git rebase -i main staging\t# to move the staging branch forward, adjust " -"commit message here\n" +"% git rebase -i main staging\t# to move the staging branch forward, adjust commit message here\n" "\n" "% git checkout main\n" "% git pull --ff-only\t\t# to get the latest if time has passed\n" "% git checkout main\n" "% git merge --ff-only staging\n" "\n" "% git push freebsd --push-option=confirm-author\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2118 +#: documentation/content/en/articles/committers-guide/_index.adoc:2117 msgid "" "For complicated pull requests that have multiple commits with conflicts, " "follow the following outline." msgstr "" "Для сложных запросов на принятие изменений с несколькими коммитами, " "содержащими конфликты, следуйте приведённой ниже схеме." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2120 +#: documentation/content/en/articles/committers-guide/_index.adoc:2119 msgid "checkout the pull request `git checkout github/pull/XXX`" msgstr "извлеките запрос на принятие изменений `git checkout github/pull/XXX`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2121 +#: documentation/content/en/articles/committers-guide/_index.adoc:2120 msgid "create a branch to rebase `git checkout -b staging`" msgstr "создайте ветку для перебазирования `git checkout -b staging`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2122 +#: documentation/content/en/articles/committers-guide/_index.adoc:2121 msgid "" "rebase the `staging` branch to the latest `main` with `git rebase -i main " "staging`" msgstr "" "перебазируйте ветку `staging` на последнюю версию `main` с помощью `git " "rebase -i main staging`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2123 +#: documentation/content/en/articles/committers-guide/_index.adoc:2122 msgid "resolve conflicts and do whatever testing is needed" msgstr "разрешите конфликты и проведите все необходимые тестирования" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2124 +#: documentation/content/en/articles/committers-guide/_index.adoc:2123 msgid "fast forward the `staging` branch into `main` as above" msgstr "перемотайте (fast-forward) ветку `staging` в `main`, как описано выше" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2125 +#: documentation/content/en/articles/committers-guide/_index.adoc:2124 msgid "final sanity check of changes to make sure all is well" msgstr "" "сделайте финальную проверку изменений, чтобы убедиться, что всё в порядке" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2126 +#: documentation/content/en/articles/committers-guide/_index.adoc:2125 msgid "push to FreeBSD's Git repository." msgstr "отправьте в репозиторий Git FreeBSD." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2128 +#: documentation/content/en/articles/committers-guide/_index.adoc:2127 msgid "" "This will also work when bringing branches developed elsewhere into the " "local tree for committing." msgstr "" "Это также будет работать при внесении веток, разработанных в другом месте, в " "локальное дерево для коммита." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2131 +#: documentation/content/en/articles/committers-guide/_index.adoc:2130 msgid "" "Once finished with the pull request, close it using GitHub's web interface. " "It is worth noting that if your `github` origin uses `https://`, the only " "step you'll need a GitHub account for is closing the pull request." msgstr "" "После завершения работы с запросом на принятие изменений (pull request), " "закройте его с помощью веб-интерфейса GitHub. Стоит отметить, что если ваш " "источник `github` использует `https://`, единственным шагом, для которого " "потребуется учетная запись GitHub, будет закрытие запроса на принятие " "изменений." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2133 +#: documentation/content/en/articles/committers-guide/_index.adoc:2132 #, no-wrap msgid "Version Control History" msgstr "История системы контроля версий" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2136 +#: documentation/content/en/articles/committers-guide/_index.adoc:2135 msgid "The project has moved to crossref:committers-guide[git-primer,git]." msgstr "Проект перешёл на crossref:committers-guide[git-primer,git]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2142 +#: documentation/content/en/articles/committers-guide/_index.adoc:2141 msgid "" "The FreeBSD source repository switched from CVS to Subversion on May 31st, " "2008. The first real SVN commit is __r179447__. The source repository " "switched from Subversion to Git on December 23rd, 2020. The last real svn " "commit is __r368820__. The first real git commit hash is " "__5ef5f51d2bef80b0ede9b10ad5b0e9440b60518c__." msgstr "" "Репозиторий исходных кодов FreeBSD перешёл с CVS на Subversion 31 мая 2008 " "года. Первый настоящий коммит SVN — __r179447__. Репозиторий исходных кодов " "перешёл с Subversion на Git 23 декабря 2020 года. Последний настоящий коммит " "svn — __r368820__. Хеш первого настоящего коммита git — " "__5ef5f51d2bef80b0ede9b10ad5b0e9440b60518c__." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2148 +#: documentation/content/en/articles/committers-guide/_index.adoc:2147 msgid "" "The FreeBSD `doc/www` repository switched from CVS to Subversion on May " "19th, 2012. The first real SVN commit is __r38821__. The documentation " "repository switched from Subversion to Git on December 8th, 2020. The last " "SVN commit is __r54737__. The first real git commit hash is " "__3be01a475855e7511ad755b2defd2e0da5d58bbe__." msgstr "" "Репозиторий `doc/www` FreeBSD перешёл с CVS на Subversion 19 мая 2012 года. " "Первый настоящий коммит SVN — __r38821__. Репозиторий документации перешёл с " "Subversion на Git 8 декабря 2020 года. Последний коммит SVN — __r54737__. " "Первый настоящий хэш коммита git — " "__3be01a475855e7511ad755b2defd2e0da5d58bbe__." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2154 +#: documentation/content/en/articles/committers-guide/_index.adoc:2153 msgid "" "The FreeBSD `ports` repository switched from CVS to Subversion on July 14th, " "2012. The first real SVN commit is __r300894__. The ports repository " "switched from Subversion to Git on April 6, 2021. The last SVN commit is " "__r569609__ The first real git commit hash is " "__ed8d3eda309dd863fb66e04bccaa513eee255cbf__." msgstr "" "Репозиторий `ports` FreeBSD перешел с CVS на Subversion 14 июля 2012 года. " "Первый настоящий коммит SVN — __r300894__. Репозиторий ports перешел с " "Subversion на Git 6 апреля 2021 года. Последний коммит SVN — __r569609__. " "Первый настоящий хэш коммита git — " "__ed8d3eda309dd863fb66e04bccaa513eee255cbf__." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2156 +#: documentation/content/en/articles/committers-guide/_index.adoc:2155 #, no-wrap msgid "Setup, Conventions, and Traditions" msgstr "Настройка, соглашения и традиции" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2161 +#: documentation/content/en/articles/committers-guide/_index.adoc:2160 msgid "" "There are a number of things to do as a new developer. The first set of " "steps is specific to committers only. These steps must be done by a mentor " "for those who are not committers." msgstr "" "В качестве нового разработчика необходимо выполнить ряд действий. Первый " "набор шагов относится исключительно к коммиттерам. Эти шаги должны быть " "выполнены наставником для тех, кто не является коммиттером." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2163 +#: documentation/content/en/articles/committers-guide/_index.adoc:2162 #, no-wrap msgid "For New Committers" msgstr "Для новых коммиттеров" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2166 +#: documentation/content/en/articles/committers-guide/_index.adoc:2165 msgid "" "Those who have been given commit rights to the FreeBSD repositories must " "follow these steps." msgstr "" "Те, кому предоставлены права на коммит в репозитории FreeBSD, должны " "выполнить следующие шаги." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2168 +#: documentation/content/en/articles/committers-guide/_index.adoc:2167 msgid "Get mentor approval before committing each of these changes!" msgstr "" "Получите одобрение наставника перед внесением каждого из этих изменений!" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2169 +#: documentation/content/en/articles/committers-guide/_index.adoc:2168 msgid "" "All [.filename]#src# commits go to FreeBSD-CURRENT first before being merged " "to FreeBSD-STABLE. The FreeBSD-STABLE branch must maintain ABI and API " "compatibility with earlier versions of that branch. Do not merge changes " "that break this compatibility." msgstr "" "Все коммиты в [.filename]#src# сначала попадают в FreeBSD-CURRENT, прежде " "чем быть слитыми в FreeBSD-STABLE. Ветка FreeBSD-STABLE должна сохранять " "совместимость ABI и API с предыдущими версиями этой ветки. Не делайте " "слияние изменений, нарушающих эту совместимость." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2174 +#: documentation/content/en/articles/committers-guide/_index.adoc:2173 #, no-wrap msgid "*Steps for New Committers*\n" msgstr "*Шаги для новых коммиттеров*\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2176 +#: documentation/content/en/articles/committers-guide/_index.adoc:2175 msgid "Add an Author Entity" msgstr "Добавить автора" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2178 +#: documentation/content/en/articles/committers-guide/_index.adoc:2177 msgid "" "[.filename]#doc/shared/authors.adoc# - Add an author entity. Later steps " "depend on this entity, and missing this step will cause the [.filename]#doc/" "# build to fail. This is a relatively easy task, but remains a good first " "test of version control skills." msgstr "" "[.filename]#doc/shared/authors.adoc# - Добавить информацию об авторе. " "Последующие шаги зависят от этой информации, и пропуск этого шага приведёт к " "сбою сборки [.filename]#doc/#. Это относительно простая задача, но она " "остаётся хорошим первым испытанием навыков работы с системой контроля версий." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2179 +#: documentation/content/en/articles/committers-guide/_index.adoc:2178 msgid "Update the List of Developers and Contributors" msgstr "Обновить список разработчиков и участников" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2181 +#: documentation/content/en/articles/committers-guide/_index.adoc:2180 msgid "" "[.filename]#doc/shared/contrib-committers.adoc# - Add an entry, which will " "then appear in the \"Developers\" section of the extref:{contributors}" "[Contributors List, staff-committers]. Entries are sorted by last name." msgstr "" "[.filename]#doc/shared/contrib-committers.adoc# - Добавьте запись, которая " "затем появится в разделе \"Разработчики\" extref:{contributors}[Списка " "контрибьюторов, staff-committers]. Записи сортируются по фамилии." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2183 +#: documentation/content/en/articles/committers-guide/_index.adoc:2182 msgid "" "[.filename]#doc/shared/contrib-additional.adoc# - _Remove_ the entry. " "Entries are sorted by first name." msgstr "" "[.filename]#doc/shared/contrib-additional.adoc# - _Удалить_ запись. Записи " "отсортированы по имени." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2184 +#: documentation/content/en/articles/committers-guide/_index.adoc:2183 msgid "Add a News Item" -msgstr "Добавление статьи в Новости" +msgstr "Добавить статью в Новости" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2186 +#: documentation/content/en/articles/committers-guide/_index.adoc:2185 msgid "" "[.filename]#doc/website/data/en/news/news.toml# - Add an entry. Look for the " "other entries that announce new committers and follow the format. Use the " "date from the commit bit approval email." msgstr "" "[.filename]#doc/website/data/en/news/news.toml# - Добавьте запись. Найдите " "другие записи, объявляющие о новых коммиттерах, и следуйте формату. " "Используйте дату из письма об утверждении коммиттерских прав." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2187 +#: documentation/content/en/articles/committers-guide/_index.adoc:2186 msgid "Add a PGP Key" msgstr "Добавить PGP-ключ" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2189 +#: documentation/content/en/articles/committers-guide/_index.adoc:2188 msgid "" "`{des}` has written a shell script ([.filename]#doc/documentation/tools/" "addkey.sh#) to make this easier. See the https://cgit.freebsd.org/doc/plain/" "documentation/static/pgpkeys/README[README] file for more information." msgstr "" -"`{des}` написал сценарий оболочки ([.filename]#doc/documentation/tools/addkey" -".sh#) для упрощения этого процесса. Для получения дополнительной информации " -"обратитесь к файлу https://cgit.freebsd.org/doc/plain/documentation/static/" -"pgpkeys/README[README]." +"`{des}` написал сценарий оболочки ([.filename]#doc/documentation/tools/" +"addkey.sh#) для упрощения этого процесса. Для получения дополнительной " +"информации обратитесь к файлу https://cgit.freebsd.org/doc/plain/" +"documentation/static/pgpkeys/README[README]." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2191 +#: documentation/content/en/articles/committers-guide/_index.adoc:2190 msgid "" "Use [.filename]#doc/documentation/tools/checkkey.sh# to verify that keys " "meet minimal best-practices standards." msgstr "" "Используйте [.filename]#doc/documentation/tools/checkkey.sh# для проверки, " "что ключи соответствуют как минимум минимальным стандартам лучших практик." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2193 +#: documentation/content/en/articles/committers-guide/_index.adoc:2192 msgid "" "After adding and checking a key, add both updated files to source control " "and then commit them. Entries in this file are sorted by last name." msgstr "" "После добавления и проверки ключа добавьте оба обновленных файла в систему " "контроля версий и затем зафиксируйте (commit) их. Записи в этом файле " "отсортированы по фамилии." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2197 +#: documentation/content/en/articles/committers-guide/_index.adoc:2196 msgid "" "It is very important to have a current PGP/GnuPG key in the repository. The " "key may be required for positive identification of a committer. For example, " "the `{admins}` might need it for account recovery. A complete keyring of " "`FreeBSD.org` users is available for download from link:https://docs.FreeBSD." "org/pgpkeys/pgpkeys.txt[https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt]." msgstr "" "Очень важно иметь актуальный PGP/GnuPG ключ в репозитории. Ключ может " "потребоваться для подтверждения личности коммиттера. Например, `{admins}` " "используют его для восстановления учетной записи. Полный набор ключей " -"пользователей `FreeBSD.org` доступен для скачивания по ссылке " -"link:https://docs.FreeBSD.org/pgpkeys/pgpkeys.txt[https://docs.FreeBSD.org/" -"pgpkeys/pgpkeys.txt]." +"пользователей `FreeBSD.org` доступен для скачивания по ссылке link:https://" +"docs.FreeBSD.org/pgpkeys/pgpkeys.txt[https://docs.FreeBSD.org/pgpkeys/" +"pgpkeys.txt]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2199 +#: documentation/content/en/articles/committers-guide/_index.adoc:2198 msgid "Update Mentor and Mentee Information" -msgstr "Обновление информации о наставнике и подопечном" +msgstr "Обновить информацию о наставнике и подопечном" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2201 +#: documentation/content/en/articles/committers-guide/_index.adoc:2200 msgid "" "[.filename]#src/share/misc/committers-.dot# - Add an entry to " "the current committers section, where _repository_ is `doc`, `ports`, or " "`src`, depending on the commit privileges granted." msgstr "" "[.filename]#src/share/misc/committers-.dot# - Добавить запись в " "раздел текущих коммиттеров, где _repository_ - это `doc`, `ports` или `src`, " "в зависимости от предоставленных прав коммита." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2203 +#: documentation/content/en/articles/committers-guide/_index.adoc:2202 msgid "" "Add an entry for each additional mentor/mentee relationship in the bottom " "section." msgstr "" "Добавьте запись для каждого дополнительного отношения наставник/подопечный в " "нижнем разделе." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2204 +#: documentation/content/en/articles/committers-guide/_index.adoc:2203 +msgid "Update git mailmap file" +msgstr "Обновить файл mailmap в git" + +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:2205 +msgid "" +"[.filename]#src/.mailmap#, [.filename]#doc/.mailmap#, and [.filename]#ports/." +"mailmap# - Add an entry for commits you created prior to becoming a FreeBSD " +"committer." +msgstr "" +"[.filename]#src/.mailmap#, [.filename]#doc/.mailmap# и [.filename]#ports/." +"mailmap# - Добавьте запись для коммитов, созданных вами до получения статуса " +"коммиттера FreeBSD." + +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:2208 +msgid "" +"Mapping to your FreeBSD address allows us to track external committers who " +"may be ready for a commit bit more easily. You can also use this to correct " +"old names, mispelled names, etc in the default `git log` output." +msgstr "" +"Привязка к вашему адресу FreeBSD позволяет нам проще отслеживать внешних " +"коммиттеров, которые могут быть готовы получить права коммиттера. Вы также " +"можете использовать это для исправления старых имен, опечаток в именах и " +"т.д. в стандартном выводе `git log`." + +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:2209 msgid "Generate a Kerberos Password" msgstr "Сгенерировать пароль Kerberos" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2206 +#: documentation/content/en/articles/committers-guide/_index.adoc:2211 msgid "" "See crossref:committers-guide[kerberos-ldap, Kerberos and LDAP web Password " "for FreeBSD Cluster] to generate or set a Kerberos account for use with " "other FreeBSD services like the link:https://bugs.freebsd.org/bugzilla/[bug-" "tracking database] (you get a bug-tracking account as part of that step)." msgstr "" "См. crossref:committers-guide[kerberos-ldap, Kerberos и LDAP веб-пароль для " "кластера FreeBSD] для генерации или настройки учётной записи Kerberos для " "использования с другими сервисами FreeBSD, такими как link:https://bugs." "freebsd.org/bugzilla/[база данных отслеживания ошибок] (вы получаете учётную " "запись для отслеживания ошибок как часть этого шага)." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2207 +#: documentation/content/en/articles/committers-guide/_index.adoc:2212 msgid "Optional: Enable Wiki Account" msgstr "Необязательно: Включить учётную запись Вики" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2211 +#: documentation/content/en/articles/committers-guide/_index.adoc:2216 msgid "" "link:https://wiki.freebsd.org[FreeBSD Wiki] Account - A wiki account allows " "sharing projects and ideas. Those who do not yet have an account can follow " "instructions on the link:https://wiki.freebsd.org/Wiki/About[Wiki/About " "page] to obtain one. Contact mailto:wiki-admin@FreeBSD.org[wiki-" "admin@FreeBSD.org] if you need help with your Wiki account." msgstr "" "Учётная запись link:https://wiki.freebsd.org[FreeBSD Wiki] — учётная запись " "на вики позволяет делиться проектами и идеями. Те, у кого ещё нет учётной " "записи, могут следовать инструкциям на странице link:https://wiki.freebsd." "org/Wiki/About[Wiki/About], чтобы её получить. Свяжитесь с mailto:wiki-" "admin@FreeBSD.org[wiki-admin@FreeBSD.org], если вам нужна помощь с вашей " "учётной записью на Вики." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2212 +#: documentation/content/en/articles/committers-guide/_index.adoc:2217 msgid "Optional: Update Wiki Information" msgstr "Необязательно: Обновить информацию в Вики" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2214 +#: documentation/content/en/articles/committers-guide/_index.adoc:2219 msgid "" "Wiki Information - After gaining access to the wiki, some people add entries " "to the https://wiki.freebsd.org/HowWeGotHere[How We Got Here], https://wiki." "freebsd.org/IRC/Nicknames[IRC Nicks], https://wiki.freebsd.org/Community/" "Dogs[Dogs of FreeBSD], and or https://wiki.freebsd.org/Community/Cats[Cats " "of FreeBSD] pages." msgstr "" "Информация в вики — получив доступ к вики, некоторые добавляют записи на " -"страницы https://wiki.freebsd.org/HowWeGotHere[Как мы сюда попали], " -"https://wiki.freebsd.org/IRC/Nicknames[IRC-псевдонимы], https://wiki.freebsd." -"org/Community/Dogs[Собаки FreeBSD] и/или https://wiki.freebsd.org/Community/" +"страницы https://wiki.freebsd.org/HowWeGotHere[Как мы сюда попали], https://" +"wiki.freebsd.org/IRC/Nicknames[IRC-псевдонимы], https://wiki.freebsd.org/" +"Community/Dogs[Собаки FreeBSD] и/или https://wiki.freebsd.org/Community/" "Cats[Кошки FreeBSD]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2215 +#: documentation/content/en/articles/committers-guide/_index.adoc:2220 msgid "Optional: Update Ports with Personal Information" msgstr "Необязательно: Обновить порты с личной информацией" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2217 +#: documentation/content/en/articles/committers-guide/_index.adoc:2222 msgid "" "[.filename]#ports/astro/xearth/files/freebsd.committers.markers# and [." "filename]#src/usr.bin/calendar/calendars/calendar.freebsd# - Some people add " "entries for themselves to these files to show where they are located or the " "date of their birthday." msgstr "" "[.filename]#ports/astro/xearth/files/freebsd.committers.markers# и [." "filename]#src/usr.bin/calendar/calendars/calendar.freebsd# — Некоторые люди " "добавляют в эти файлы записи о себе, чтобы указать своё местоположение или " "дату своего дня рождения." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2218 +#: documentation/content/en/articles/committers-guide/_index.adoc:2223 msgid "Optional: Prevent Duplicate Mailings" msgstr "Необязательно: Предотвращение повторных рассылок" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2220 +#: documentation/content/en/articles/committers-guide/_index.adoc:2225 msgid "" "Subscribers to {dev-commits-doc-all}, {dev-commits-ports-all} or {dev-" "commits-src-all} might wish to unsubscribe to avoid receiving duplicate " "copies of commit messages and followups." msgstr "" "Подписчики {dev-commits-doc-all}, {dev-commits-ports-all} или {dev-commits-" "src-all}, возможно, захотят отписаться, чтобы избежать получения дубликатов " "сообщений о коммитах и ответов на них." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2223 +#: documentation/content/en/articles/committers-guide/_index.adoc:2228 #, no-wrap msgid "For Everyone" msgstr "Для всех" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2229 +#: documentation/content/en/articles/committers-guide/_index.adoc:2234 msgid "" "Introduce yourself to the other developers, otherwise no one will have any " "idea who you are or what you are working on. The introduction need not be a " "comprehensive biography, just write a paragraph or two about who you are, " "what you plan to be working on as a developer in FreeBSD, and who will be " "your mentor. Email this to the {developers-name} and you will be on your way!" msgstr "" "Представьтесь другим разработчикам, иначе никто не будет иметь " "представления, кто вы и над чем работаете. Представление не должно быть " "исчерпывающей биографией — просто напишите абзац или два о том, кто вы, чем " "планируете заниматься как разработчик в FreeBSD, и кто будет вашим " "наставником. Отправьте это по электронной почте на {developers-name}, и вы " "начнёте свой путь!" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2230 +#: documentation/content/en/articles/committers-guide/_index.adoc:2235 msgid "" "Log into `freefall.FreeBSD.org` and create a [.filename]#/var/forward/user# " "(where _user_ is your username) file containing the e-mail address where you " "want mail addressed to _yourusername_@FreeBSD.org to be forwarded. This " "includes all of the commit messages as well as any other mail addressed to " "the {committers-name} and the {developers-name}. Really large mailboxes " "which have taken up permanent residence on `freefall` may get truncated " "without warning if space needs to be freed, so forward it or save it " "elsewhere." msgstr "" "Войдите на `freefall.FreeBSD.org` и создайте файл [.filename]#/var/forward/" "пользователь# (где _пользователь_ — это ваше имя пользователя), содержащий " "адрес электронной почты, на который должны перенаправляться письма, " "адресованные на _вашеимяпользователя_@FreeBSD.org. Это включает все " "сообщения о коммитах, а также любую другую почту, адресованную {committers-" "name} и {developers-name}. Очень большие почтовые ящики, которые заняли " "постоянное место на `freefall`, могут быть усечены без предупреждения, если " "потребуется освободить место, поэтому перенаправляйте или сохраняйте их в " "другом месте." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2234 +#: documentation/content/en/articles/committers-guide/_index.adoc:2239 msgid "" "If your e-mail system uses SPF with strict rules, you should exclude `mx2." "FreeBSD.org` from SPF checks." msgstr "" "Если ваша система электронной почты использует SPF со строгими правилами, " "вам следует исключить `mx2.FreeBSD.org` из проверок SPF." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2237 +#: documentation/content/en/articles/committers-guide/_index.adoc:2242 msgid "" "Due to the severe load dealing with SPAM places on the central mail servers " "that do the mailing list processing, the front-end server does do some basic " "checks and will drop some messages based on these checks. At the moment " "proper DNS information for the connecting host is the only check in place " "but that may change. Some people blame these checks for bouncing valid " "email. To have these checks turned off for your email, create a file named [." "filename]#~/.spam_lover# on `freefall.FreeBSD.org`." msgstr "" "Из-за высокой нагрузки, которую обработка спама создает на центральных " "почтовых серверах, обрабатывающих почтовые рассылки, фронтенд-сервер " "выполняет базовые проверки и может отбрасывать некоторые сообщения на их " "основе. В настоящее время единственной активной проверкой является наличие " "корректной DNS-информации для подключающегося хоста, но это может " "измениться. Некоторые пользователи связывают эти проверки с ложным " "отбрасыванием легитимной почты. Для отключения данных проверок для вашей " "почты создайте файл с именем [.filename]#~/.spam_lover# на `freefall.FreeBSD." "org`." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2241 +#: documentation/content/en/articles/committers-guide/_index.adoc:2246 msgid "" "Those who are developers but not committers will not be subscribed to the " "committers or developers mailing lists. The subscriptions are derived from " "the access rights." msgstr "" "Те, кто являются разработчиками, но не коммиттерами, не будут подписаны на " "рассылки коммиттеров или разработчиков. Подписки определяются правами " "доступа." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:2245 +#: documentation/content/en/articles/committers-guide/_index.adoc:2250 #, no-wrap msgid "SMTP Access Setup" msgstr "Настройка доступа SMTP" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2248 +#: documentation/content/en/articles/committers-guide/_index.adoc:2253 msgid "" "For those willing to send e-mail messages through the FreeBSD.org " "infrastructure, follow the instructions below:" msgstr "" "Для тех, кто желает отправлять электронные письма через инфраструктуру " "FreeBSD.org, следуйте приведенным ниже инструкциям:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2252 +#: documentation/content/en/articles/committers-guide/_index.adoc:2257 msgid "Point your mail client at `smtp.FreeBSD.org:587`." msgstr "Направьте ваш почтовый клиент на `smtp.FreeBSD.org:587`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2253 +#: documentation/content/en/articles/committers-guide/_index.adoc:2258 msgid "Enable STARTTLS." msgstr "Включить STARTTLS." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2254 +#: documentation/content/en/articles/committers-guide/_index.adoc:2259 msgid "Ensure your `From:` address is set to `_yourusername_@FreeBSD.org`." msgstr "" "Убедитесь, что ваш адрес `From:` установлен как " "`_вашеимяпользователя_@FreeBSD.org`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2256 +#: documentation/content/en/articles/committers-guide/_index.adoc:2261 msgid "" "For authentication, you can use your FreeBSD Kerberos username and password " "(see crossref:committers-guide[kerberos-ldap, Kerberos and LDAP web Password " "for FreeBSD Cluster]). The `_yourusername_/mail` principal is preferred, as " "it is only valid for authenticating to mail resources." msgstr "" "Для аутентификации можно использовать ваше имя пользователя и пароль FreeBSD " "Kerberos (см. crossref:committers-guide[kerberos-ldap, Kerberos и LDAP веб-" "пароль для кластера FreeBSD]). Предпочтительнее использовать принципал " "`_вашеимяпользователя_/mail`, так как он действителен только для " "аутентификации к почтовым ресурсам." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2260 +#: documentation/content/en/articles/committers-guide/_index.adoc:2265 msgid "Do not include `@FreeBSD.org` when entering in your username." msgstr "При вводе имени пользователя не включайте `@FreeBSD.org`." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2262 +#: documentation/content/en/articles/committers-guide/_index.adoc:2267 #, no-wrap msgid "Additional Notes" msgstr "Дополнительные заметки" #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2266 +#: documentation/content/en/articles/committers-guide/_index.adoc:2271 msgid "" "Will only accept mail from `_yourusername_@FreeBSD.org`. If you are " "authenticated as one user, you are not permitted to send mail from another." msgstr "" "Будет принимать почту только от `_вашеимяпользователя_@FreeBSD.org`. Если вы " "аутентифицированы как один пользователь, вам не разрешено отправлять почту " "от другого." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2267 +#: documentation/content/en/articles/committers-guide/_index.adoc:2272 msgid "" "A header will be appended with the SASL username: (`Authenticated sender: " "_username_`)." msgstr "" -"Будет добавлен заголовок сообщения с именем пользователя SASL: (`" -"Authenticated sender: _имя_пользователя_`)." +"Будет добавлен заголовок сообщения с именем пользователя SASL: " +"(`Authenticated sender: _имя_пользователя_`)." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:2268 +#: documentation/content/en/articles/committers-guide/_index.adoc:2273 msgid "" "Host has various rate limits in place to cut down on brute force attempts." msgstr "" "На хосте действуют различные ограничения по скорости для сокращения попыток " "взлома перебором паролей." #. type: Title ===== -#: documentation/content/en/articles/committers-guide/_index.adoc:2272 +#: documentation/content/en/articles/committers-guide/_index.adoc:2277 #, no-wrap msgid "Using a Local MTA to Forward Emails to the FreeBSD.org SMTP Service" -msgstr "" -"Использование локального MTA для пересылки электронной почты в SMTP-сервис " -"FreeBSD.org" +msgstr "Использование локального MTA для пересылки электронной почты в SMTP-сервис FreeBSD.org" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2275 +#: documentation/content/en/articles/committers-guide/_index.adoc:2280 msgid "" "It is also possible to use a local MTA to forward locally sent emails to the " "FreeBSD.org SMTP servers." msgstr "" "Также возможно использовать локальный MTA для пересылки локально " "отправленных писем на SMTP-серверы FreeBSD.org." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2277 +#: documentation/content/en/articles/committers-guide/_index.adoc:2282 #, no-wrap msgid "Using Postfix" msgstr "Использование Postfix" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2282 +#: documentation/content/en/articles/committers-guide/_index.adoc:2287 msgid "" "To tell a local Postfix instance that anything from `_yourusername_@FreeBSD." "org` should be forwarded to the FreeBSD.org servers, add this to your [." "filename]#main.cf#:" msgstr "" "Чтобы сообщить локальному экземпляру Postfix, что любое письмо от " "`_вашеимяпользователя_@FreeBSD.org` должно быть перенаправлено на серверы " "FreeBSD.org, добавьте это в ваш [.filename]#main.cf#:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2290 +#: documentation/content/en/articles/committers-guide/_index.adoc:2295 #, no-wrap msgid "" "sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/relayhost_maps\n" "smtp_sasl_auth_enable = yes\n" "smtp_sasl_security_options = noanonymous\n" "smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd\n" "smtp_use_tls = yes\n" msgstr "" -"sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/" -"relayhost_maps\n" +"sender_dependent_relayhost_maps = hash:/usr/local/etc/postfix/relayhost_maps\n" "smtp_sasl_auth_enable = yes\n" "smtp_sasl_security_options = noanonymous\n" "smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd\n" "smtp_use_tls = yes\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2293 +#: documentation/content/en/articles/committers-guide/_index.adoc:2298 msgid "" "Create [.filename]#/usr/local/etc/postfix/relayhost_maps# with the following " "content:" msgstr "" "Создайте файл [.filename]#/usr/local/etc/postfix/relayhost_maps# со " "следующим содержимым:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2297 +#: documentation/content/en/articles/committers-guide/_index.adoc:2302 #, no-wrap msgid "yourusername@FreeBSD.org [smtp.freebsd.org]:587\n" msgstr "вашеимяпользователя@FreeBSD.org [smtp.freebsd.org]:587\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2300 +#: documentation/content/en/articles/committers-guide/_index.adoc:2305 msgid "" "Create [.filename]#/usr/local/etc/postfix/sasl_passwd# with the following " "content:" msgstr "" "Создайте [.filename]#/usr/local/etc/postfix/sasl_passwd# со следующим " "содержимым:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2304 +#: documentation/content/en/articles/committers-guide/_index.adoc:2309 #, no-wrap msgid "[smtp.freebsd.org]:587 yourusername:yourpassword\n" msgstr "[smtp.freebsd.org]:587 вашеимяпользователя:вашпароль\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2307 +#: documentation/content/en/articles/committers-guide/_index.adoc:2312 msgid "" "If the email server is used by other people, you may want to prevent them " "from sending e-mails from your address. To achieve this, add this to your [." "filename]#main.cf#:" msgstr "" "Если почтовый сервер используется другими людьми, вы можете захотеть " "предотвратить отправку ими писем с вашего адреса. Для достижения этой цели " "добавьте это в ваш [.filename]#main.cf#:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2312 +#: documentation/content/en/articles/committers-guide/_index.adoc:2317 #, no-wrap msgid "" "smtpd_sender_login_maps = hash:/usr/local/etc/postfix/sender_login_maps\n" "smtpd_sender_restrictions = reject_known_sender_login_mismatch\n" msgstr "" "smtpd_sender_login_maps = hash:/usr/local/etc/postfix/sender_login_maps\n" "smtpd_sender_restrictions = reject_known_sender_login_mismatch\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2315 +#: documentation/content/en/articles/committers-guide/_index.adoc:2320 msgid "" "Create [.filename]#/usr/local/etc/postfix/sender_login_maps# with the " "following content:" msgstr "" "Создайте файл [.filename]#/usr/local/etc/postfix/sender_login_maps# со " "следующим содержимым:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2319 +#: documentation/content/en/articles/committers-guide/_index.adoc:2324 #, no-wrap msgid "yourusername@FreeBSD.org yourlocalusername\n" msgstr "вашеимяпользователя@FreeBSD.org вашеимялокальногопользователя\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2322 +#: documentation/content/en/articles/committers-guide/_index.adoc:2327 msgid "" "Where _yourlocalusername_ is the SASL username used to connect to the local " "instance of Postfix." msgstr "" "Где _вашеимялокальногопользователя_ — это имя пользователя SASL, " "используемое для подключения к локальному экземпляру Postfix." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2325 +#: documentation/content/en/articles/committers-guide/_index.adoc:2330 #, no-wrap msgid "Using OpenSMTPD" msgstr "Использование OpenSMTPD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2330 +#: documentation/content/en/articles/committers-guide/_index.adoc:2335 msgid "" "To tell a local OpenSMTPD instance that anything from " "`_yourusername_@FreeBSD.org` should be forwarded to the FreeBSD.org servers, " "add this to your [.filename]#smtpd.conf#:" msgstr "" "Чтобы указать локальному экземпляру OpenSMTPD, что все письма от " "`_вашеимяпользователя_@FreeBSD.org` должны быть перенаправлены на серверы " "FreeBSD.org, добавьте это в ваш [.filename]#smtpd.conf#:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2335 +#: documentation/content/en/articles/committers-guide/_index.adoc:2340 #, no-wrap msgid "" "action \"freebsd\" relay host smtp+tls://freebsd@smtp.freebsd.org:587 auth \n" "match from any auth yourlocalusername mail-from \"_yourusername_@freebsd.org\" for any action \"freebsd\"\n" msgstr "" -"action \"freebsd\" relay host smtp+tls://freebsd@smtp.freebsd.org:587 auth " -"\n" -"match from any auth вашеимялокальногопользователя mail-from " -"\"_вашеимяпользователя_@freebsd.org\" for any action \"freebsd\"\n" +"action \"freebsd\" relay host smtp+tls://freebsd@smtp.freebsd.org:587 auth \n" +"match from any auth вашеимялокальногопользователя mail-from \"_вашеимяпользователя_@freebsd.org\" for any action \"freebsd\"\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2338 +#: documentation/content/en/articles/committers-guide/_index.adoc:2343 msgid "" "Where _yourlocalusername_ is the SASL username used to connect to the local " "instance of OpenSMTPD." msgstr "" "Где _вашеимялокальногопользователя_ — это имя пользователя SASL, " "используемое для подключения к локальному экземпляру OpenSMTPD." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2340 +#: documentation/content/en/articles/committers-guide/_index.adoc:2345 msgid "" "Create [.filename]#/usr/local/etc/mail/secrets# with the following content:" msgstr "" "Создайте файл [.filename]#/usr/local/etc/mail/secrets# со следующим " "содержимым:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2344 +#: documentation/content/en/articles/committers-guide/_index.adoc:2349 #, no-wrap msgid "freebsd\tyourusername:yourpassword\n" msgstr "freebsd\tвашеимяпользователя:вашпароль\n" #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2348 +#: documentation/content/en/articles/committers-guide/_index.adoc:2353 #, no-wrap msgid "Using Exim" msgstr "Использование Exim" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2354 +#: documentation/content/en/articles/committers-guide/_index.adoc:2359 #, no-wrap msgid "" "To direct a local Exim instance to forward all mail from `_example_@FreeBSD.org`\n" " to FreeBSD.org servers, add this to Exim [.filename]#configuration#:\n" msgstr "" "Чтобы направить локальный экземпляр Exim для пересылки всей почты от\n" -"`_example_@FreeBSD.org` на серверы FreeBSD.org, добавьте это в [." -"filename]#конфигурацию# Exim:\n" +"`_example_@FreeBSD.org` на серверы FreeBSD.org, добавьте это в [.filename]#конфигурацию# Exim:\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2363 +#: documentation/content/en/articles/committers-guide/_index.adoc:2368 #, no-wrap msgid "" "Routers section: (at the top of the list):\n" "freebsd_send:\n" " driver = manualroute\n" " domains = !+local_domains\n" " transport = freebsd_smtp\n" " route_data = ${lookup {${lc:$sender_address}} lsearch {/usr/local/etc/exim/freebsd_send}}\n" msgstr "" "Routers section: (at the top of the list):\n" "freebsd_send:\n" " driver = manualroute\n" " domains = !+local_domains\n" " transport = freebsd_smtp\n" " route_data = ${lookup {${lc:$sender_address}} lsearch {/usr/local/etc/exim/freebsd_send}}\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2375 +#: documentation/content/en/articles/committers-guide/_index.adoc:2380 #, no-wrap msgid "" "Transport Section:\n" "freebsd_smtp:\n" " driver = smtp\n" " tls_certificate=\n" " tls_privatekey=\n" " tls_require_ciphers = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+AESGCM:EECDH:EDH+AESGCM:EDH+aRSA:HIGH:!MEDIUM:!LOW:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP:!PSK:!SRP:!DSS\n" " dkim_domain = \n" " dkim_selector = \n" " dkim_private_key= \n" " dnssec_request_domains = *\n" " hosts_require_auth = smtp.freebsd.org\n" msgstr "" "Transport Section:\n" "freebsd_smtp:\n" " driver = smtp\n" " tls_certificate=\n" " tls_privatekey=\n" " tls_require_ciphers = EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+AESGCM:EECDH:EDH+AESGCM:EDH+aRSA:HIGH:!MEDIUM:!LOW:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP:!PSK:!SRP:!DSS\n" " dkim_domain = \n" " dkim_selector = \n" " dkim_private_key= \n" " dnssec_request_domains = *\n" " hosts_require_auth = smtp.freebsd.org\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2382 +#: documentation/content/en/articles/committers-guide/_index.adoc:2387 #, no-wrap msgid "" "Authenticators:\n" "freebsd_plain:\n" " driver = plaintext\n" " public_name = PLAIN\n" " client_send = ^example/mail^examplePassword\n" " client_condition = ${if eq{$host}{smtp.freebsd.org}}\n" msgstr "" "Authenticators:\n" "freebsd_plain:\n" " driver = plaintext\n" " public_name = PLAIN\n" " client_send = ^example/mail^examplePassword\n" " client_condition = ${if eq{$host}{smtp.freebsd.org}}\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2385 +#: documentation/content/en/articles/committers-guide/_index.adoc:2390 msgid "" "Create [.filename]#/usr/local/etc/exim/freebsd_send# with the following " "content:" msgstr "" "Создайте файл [.filename]#/usr/local/etc/exim/freebsd_send# со следующим " "содержимым:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2389 +#: documentation/content/en/articles/committers-guide/_index.adoc:2394 #, no-wrap msgid "example@freebsd.org:smtp.freebsd.org::587\n" msgstr "example@freebsd.org:smtp.freebsd.org::587\n" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2394 +#: documentation/content/en/articles/committers-guide/_index.adoc:2399 #, no-wrap msgid "Mentors" msgstr "Наставники" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2399 +#: documentation/content/en/articles/committers-guide/_index.adoc:2404 msgid "" "All new developers have a mentor assigned to them for the first few months. " "A mentor is responsible for teaching the mentee the rules and conventions of " "the project and guiding their first steps in the developer community. The " "mentor is also personally responsible for the mentee's actions during this " "initial period." msgstr "" "Все новые разработчики получают наставника на первые несколько месяцев. " "Наставник отвечает за обучение подопечного правилам и соглашениям проекта и " "направляет его первые шаги в сообществе разработчиков. Наставник также несёт " "личную ответственность за действия подопечного в течение этого начального " "периода." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2402 +#: documentation/content/en/articles/committers-guide/_index.adoc:2407 msgid "" "For committers: do not commit anything without first getting mentor " "approval. Document that approval with an `Approved by:` line in the commit " "message." msgstr "" "Для коммиттеров: не коммитьте ничего без предварительного одобрения ментора. " "Задокументируйте это одобрение строкой `Approved by:` в сообщении коммита." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2407 +#: documentation/content/en/articles/committers-guide/_index.adoc:2412 msgid "" "When the mentor decides that a mentee has learned the ropes and is ready to " "commit on their own, the mentor announces it with a commit to [." "filename]#mentors#. This file is in the [.filename]#admin# orphan branch of " "each repository. Detailed information on how to access these branches can " "be found in crossref:committers-guide[admin-branch, \"admin\" branch]." msgstr "" "Когда наставник решает, что подопечный освоил основы и готов к " "самостоятельной фиксации изменений, наставник объявляет об этом, выполняя " "коммит в [.filename]#mentors#. Этот файл находится в сиротской ветке [." "filename]#admin# каждого репозитория. Подробная информация о том, как " "получить доступ к этим веткам, доступна в crossref:committers-guide[admin-" "branch, ветке \"admin\"]." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2409 +#: documentation/content/en/articles/committers-guide/_index.adoc:2414 #, no-wrap msgid "Pre-Commit Review" msgstr "Предварительная проверка перед коммитом" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2414 +#: documentation/content/en/articles/committers-guide/_index.adoc:2419 msgid "" "Code review is one way to increase the quality of software. The following " "guidelines apply to commits to the `main` (-CURRENT) branch of the `src` " "repository. Other branches and the `ports` and `docs` trees have their own " "review policies, but these guidelines generally apply to commits requiring " "review:" msgstr "" "Рецензирование кода — один из способов повышения качества программного " -"обеспечения. Следующие рекомендации применимы к коммитам в ветку `main` " -"(-CURRENT) репозитория `src`. Другие ветки, а также деревья `ports` и `docs` " +"обеспечения. Следующие рекомендации применимы к коммитам в ветку `main` (-" +"CURRENT) репозитория `src`. Другие ветки, а также деревья `ports` и `docs` " "имеют собственные политики проверки и рецензирования, но данные рекомендации " "в целом применимы к коммитам, требующим рецензии:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2416 +#: documentation/content/en/articles/committers-guide/_index.adoc:2421 msgid "" "All non-trivial changes should be reviewed before they are committed to the " "repository." msgstr "" "Все нетривиальные изменения должны быть проверены перед их фиксацией в " "репозитории." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2417 +#: documentation/content/en/articles/committers-guide/_index.adoc:2422 msgid "" "Reviews may be conducted by email, in Bugzilla, in Phabricator, or by " "another mechanism. Where possible, reviews should be public." msgstr "" "Рецензирование может проводиться по электронной почте, в Bugzilla, в " "Phabricator или с помощью другого механизма. По возможности рецензирование " "должно быть публичным." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2418 +#: documentation/content/en/articles/committers-guide/_index.adoc:2423 msgid "" "The developer responsible for a code change is also responsible for making " "all necessary review-related changes." msgstr "" "Разработчик, ответственный за изменение кода, также обязан вносить все " "необходимые изменения, связанные с проверкой." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2419 +#: documentation/content/en/articles/committers-guide/_index.adoc:2424 msgid "" "Code review can be an iterative process, which continues until the patch is " "ready to be committed. Specifically, once a patch is sent out for review, it " "should receive an explicit \"looks good\" before it is committed. So long as " "it is explicit, this can take whatever form makes sense for the review " "method." msgstr "" "Рецензирование кода может быть итеративным процессом, который продолжается " "до тех пор, пока патч не будет готов к коммиту. В частности, после отправки " "патча на рецензирование, он должен получить явное подтверждение \"выглядит " "хорошо\" перед коммитом. Оно должно быть явным, и это может принимать любую " "форму, которая имеет смысл для метода рецензирования." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2420 +#: documentation/content/en/articles/committers-guide/_index.adoc:2425 msgid "Timeouts are not a substitute for review." msgstr "Тайм-ауты не являются заменой проверке." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2422 +#: documentation/content/en/articles/committers-guide/_index.adoc:2427 msgid "" "Sometimes code reviews will take longer than you would hope for, especially " "for larger features. Accepted ways to speed up review times for your patches " "are:" msgstr "" "Иногда проверка кода занимает больше времени, чем хотелось бы, особенно для " "большого по объему функционала. Принятые способы ускорить проверку ваших " "патчей:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2424 +#: documentation/content/en/articles/committers-guide/_index.adoc:2429 msgid "" "Review other people's patches. If you help out, everybody will be more " "willing to do the same for you; goodwill is our currency." msgstr "" "Проверяйте патчи других людей. Если вы помогаете, все будут более охотно " "делать то же самое для вас; доброжелательность — наша валюта." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2425 +#: documentation/content/en/articles/committers-guide/_index.adoc:2430 msgid "" "Ping the patch. If it is urgent, provide reasons why it is important to you " "to get this patch landed and ping it every couple of days. If it is not " "urgent, the common courtesy ping rate is one week. Remember that you are " "asking for valuable time from other professional developers." msgstr "" "Пингуйте патч. Если он срочный, укажите причины, почему для вас важно, чтобы " "этот патч был принят, и пингуйте каждые пару дней. Если он не срочный, " "общепринятая вежливая частота пинга — одна неделя. Помните, что вы просите у " "других профессиональных разработчиков их ценное время." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2426 +#: documentation/content/en/articles/committers-guide/_index.adoc:2431 msgid "" "Ask for help on mailing lists, IRC, etc. Others may be able to either help " "you directly, or suggest a reviewer." msgstr "" "Обратитесь за помощью в списки рассылки, IRC и т.д. Другие могут либо помочь " "вам напрямую, либо предложить рецензента." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2427 +#: documentation/content/en/articles/committers-guide/_index.adoc:2432 msgid "" "Split your patch into multiple smaller patches that build on each other. The " "smaller your patch, the higher the probability that somebody will take a " "quick look at it." msgstr "" "Разделите ваш патч на несколько меньших патчей, которые основываются друг на " "друге. Чем меньше ваш патч, тем выше вероятность, что кто-то бегло его " "просмотрит." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2429 +#: documentation/content/en/articles/committers-guide/_index.adoc:2434 msgid "" "When making large changes, it is helpful to keep this in mind from the " "beginning of the effort as breaking large changes into smaller ones is often " "difficult after the fact." msgstr "" "При внесении крупных изменений полезно держать это в уме с самого начала " "работы, поскольку разбиение крупных изменений на более мелкие часто бывает " "затруднительно постфактум." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2434 +#: documentation/content/en/articles/committers-guide/_index.adoc:2439 msgid "" "Developers should participate in code reviews as both reviewers and " "reviewees. If someone is kind enough to review your code, you should return " "the favor for someone else. Note that while anyone is welcome to review and " "give feedback on a patch, only an appropriate subject-matter expert can " "approve a change. This will usually be a committer who works with the code " "in question on a regular basis." msgstr "" "Разработчикам следует участвовать в проверках кода как в роли авторов, так и " "в роли рецензентов. Если кто-то любезно проверил ваш код, вы должны ответить " "тем же для кого-то другого. Обратите внимание, что хотя любой может " "проверить и дать обратную связь по патчу, только соответствующий эксперт по " "теме может одобрить изменение. Обычно это коммиттер, который регулярно " "работает с рассматриваемым кодом." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2437 +#: documentation/content/en/articles/committers-guide/_index.adoc:2442 msgid "" "In some cases, no subject-matter expert may be available. In those cases, a " "review by an experienced developer is sufficient when coupled with " "appropriate testing." msgstr "" "В некоторых случаях может не оказаться эксперта по предметной области. В " "таких случаях достаточно проверки опытным разработчиком в сочетании с " "соответствующим тестированием." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2439 +#: documentation/content/en/articles/committers-guide/_index.adoc:2444 #, no-wrap msgid "Commit Log Messages" msgstr "Журнал сообщений о коммитах" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2442 +#: documentation/content/en/articles/committers-guide/_index.adoc:2447 msgid "" "This section contains some suggestions and traditions for how commit logs " "are formatted." msgstr "" "В этом разделе содержатся некоторые предложения и традиции по форматированию " "журналов коммитов." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2443 +#: documentation/content/en/articles/committers-guide/_index.adoc:2448 #, no-wrap msgid "Why are commit messages important?" msgstr "Почему важны сообщения коммитов?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2447 +#: documentation/content/en/articles/committers-guide/_index.adoc:2452 msgid "" "When you commit a change in Git, Subversion, or another version control " "system (VCS), you're prompted to write some text describing the commit -- a " "commit message. How important is this commit message? Should you spend some " "significant effort writing it? Does it really matter if you write simply " "`fixed a bug`?" msgstr "" "При фиксации изменения в Git, Subversion или другой системе контроля версий " "(СКВ) вам предлагается написать текст с описанием коммита — сообщение о " "коммите. Насколько важно это сообщение о коммите? Стоит ли прилагать " "значительные усилия для его написания? Имеет ли значение, если вы просто " "напишете `исправлена ошибка`?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2450 +#: documentation/content/en/articles/committers-guide/_index.adoc:2455 msgid "" "Most projects have more than one developer and last for some length of " "time. Commit messages are a very important method of communicating with " "other developers, in the present and for the future." msgstr "" "У большинства проектов более одного разработчика, и они длятся в течение " "некоторого времени. Сообщения коммитов — это очень важный способ общения с " "другими разработчиками, как в настоящем, так и в будущем." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2453 +#: documentation/content/en/articles/committers-guide/_index.adoc:2458 msgid "" "FreeBSD has hundreds of active developers and hundreds of thousands of " "commits spanning decades of history. Over that time the developer community " "has learned how valuable good commit messages are; sometimes these are hard-" "learned lessons." msgstr "" "В FreeBSD сотни активных разработчиков и сотни тысяч коммитов, охватывающих " "десятилетия истории. За это время сообщество разработчиков осознало, " "насколько ценны хорошие сообщения к коммитам; иногда эти уроки давались " "тяжело." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2455 +#: documentation/content/en/articles/committers-guide/_index.adoc:2460 msgid "Commit messages serve at least three purposes:" msgstr "Сообщения коммитов служат как минимум трем целям:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2457 +#: documentation/content/en/articles/committers-guide/_index.adoc:2462 msgid "Communicating with other developers" msgstr "Сотрудничество с другими" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2462 +#: documentation/content/en/articles/committers-guide/_index.adoc:2467 msgid "" "FreeBSD commits generate email to various mailing lists. These include the " "commit message along with a copy of the patch itself. Commit messages are " "also viewed through commands like git log. These serve to make other " "developers aware of changes that are ongoing; that other developer may want " "to test the change, may have an interest in the topic and will want to " "review in more detail, or may have their own projects underway that would " "benefit from interaction." msgstr "" "Коммиты FreeBSD генерируют письма для различных списков рассылки. Они " "включают сообщение коммита вместе с копией самого патча. Сообщения коммитов " "также просматриваются с помощью команд, таких как `git log`. Это служит для " "информирования других разработчиков об изменениях, которые происходят; " "другой разработчик может захотеть протестировать изменение, может быть " "заинтересован в теме и захочет просмотреть более подробно, или может иметь " "свои собственные проекты, которые выиграют от взаимодействия." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2464 +#: documentation/content/en/articles/committers-guide/_index.adoc:2469 msgid "Making Changes Discoverable" msgstr "Обеспечение возможности обнаружения изменений" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2468 +#: documentation/content/en/articles/committers-guide/_index.adoc:2473 msgid "" "In a large project with a long history it may be difficult to find changes " "of interest when investigating an issue or change in behaviour. Verbose, " "detailed commit messages allow searches for changes that might be relevant. " "For example, `git log --since 1year --grep 'USB timeout'`." msgstr "" "В большом проекте с долгой историей может быть сложно найти интересующие " "изменения при расследовании проблемы или изменения в поведении. Подробные, " "детальные сообщения о коммитах позволяют искать изменения, которые могут " "быть релевантны. Например, `git log --since 1year --grep 'USB timeout'`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2470 +#: documentation/content/en/articles/committers-guide/_index.adoc:2475 msgid "Providing historical documentation" msgstr "Предоставление исторической документации" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2474 +#: documentation/content/en/articles/committers-guide/_index.adoc:2479 msgid "" "Commit messages serve to document changes for future developers, perhaps " "years or decades later. This future developer may even be you, the original " "author. A change that seems obvious today may be decidedly not so much " "later on." msgstr "" "Сообщения о фиксации служат для документирования изменений для будущих " "разработчиков, возможно, спустя годы или десятилетия. Этот будущий " "разработчик может оказаться даже вами, первоначальным автором. Изменение, " "которое кажется очевидным сегодня, может оказаться совсем не таким в будущем." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2476 +#: documentation/content/en/articles/committers-guide/_index.adoc:2481 msgid "" "The `git blame` command annotates each line of a source file with the change " "(hash and subject line) that brought it in." msgstr "" "Команда `git blame` аннотирует каждую строку исходного файла информацией о " "изменении (хэш и тема коммита), которое её добавило." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2478 +#: documentation/content/en/articles/committers-guide/_index.adoc:2483 msgid "" "Having established the importance, here are elements of a good FreeBSD " "commit message:" msgstr "" "Теперь, когда важность хорошего сообщения о коммите в FreeBSD несомненна, " "вот его элементы:" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2479 +#: documentation/content/en/articles/committers-guide/_index.adoc:2484 #, no-wrap msgid "Start with a subject line" msgstr "Начните со строки темы" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2483 +#: documentation/content/en/articles/committers-guide/_index.adoc:2488 msgid "" "Commit messages should start with a single-line subject that briefly " "summarizes the change. The subject should, by itself, allow the reader to " "quickly determine if the change is of interest or not." msgstr "" "Сообщения о коммите должны начинаться с однострочной темы, кратко " "описывающей изменение. Сама по себе тема должна позволять читателю быстро " "определить, представляет ли изменение интерес." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2484 +#: documentation/content/en/articles/committers-guide/_index.adoc:2489 #, no-wrap msgid "Keep subject lines short" msgstr "Сохраняйте заголовки краткими" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2489 +#: documentation/content/en/articles/committers-guide/_index.adoc:2494 msgid "" "The subject line should be as short as possible while still retaining the " "required information. This is to make browsing Git log more efficient, and " "so that git log --oneline can display the short hash and subject on a single " "80-column line. A good rule of thumb is to stay below 67 characters, and " "aim for about 50 or fewer if possible." msgstr "" "Строка темы должна быть максимально короткой, но при этом сохранять " "необходимую информацию. Это повышает эффективность просмотра журнала Git и " "позволяет команде `git log --oneline` отображать короткий хэш и тему на " "одной 80-символьной строке. Хорошим эмпирическим правилом является удержание " "длины ниже 67 символов, а по возможности — около 50 или меньше." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2490 +#: documentation/content/en/articles/committers-guide/_index.adoc:2495 #, no-wrap msgid "Prefix the subject line with a component, if applicable" -msgstr "" -"Добавьте к строке темы префикс с указанием компонента, если это применимо" +msgstr "Добавьте к строке темы префикс с указанием компонента, если это применимо" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2494 +#: documentation/content/en/articles/committers-guide/_index.adoc:2499 msgid "" "If the change relates to a specific component the subject line may be " "prefixed with that component name and a colon (:). If applicable, try to " "use the same prefix used in previous commits to the same files." msgstr "" "Если изменение относится к определённому компоненту, строка темы может быть " "предварена именем этого компонента и двоеточием (:). По возможности " "используйте тот же префикс, который применялся в предыдущих коммитах к тем " "же файлам." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2496 +#: documentation/content/en/articles/committers-guide/_index.adoc:2501 msgid "✓ `foo: Add -k option to keep temporary data`" msgstr "✓ `foo: Add -k option to keep temporary data`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2498 +#: documentation/content/en/articles/committers-guide/_index.adoc:2503 msgid "" "Include the prefix in the 67-character limit suggested above, so that `git " "log --oneline` avoids wrapping." msgstr "" "Включите префикс в лимит 67 символов, чтобы `git log --oneline` избегал " "переноса." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2499 +#: documentation/content/en/articles/committers-guide/_index.adoc:2504 #, no-wrap msgid "Capitalize the first letter of the subject" msgstr "Напишите первую букву темы с заглавной буквы" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2503 +#: documentation/content/en/articles/committers-guide/_index.adoc:2508 msgid "" "Capitalize the first letter of the subject itself. The prefix, if any, is " "not capitalized unless necessary (e.g., `USB:` is capitalized)." msgstr "" "Первая буква темы должна быть заглавной. Префикс, если он есть, с заглавной " "буквы не пишется, если это не требуется (например, `USB:` пишется с " "заглавной буквы)." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2504 +#: documentation/content/en/articles/committers-guide/_index.adoc:2509 #, no-wrap msgid "Do not end the subject line with punctuation" msgstr "Не заканчивайте строку темы знаками препинания" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2508 +#: documentation/content/en/articles/committers-guide/_index.adoc:2513 msgid "" "Do not end with a period or other punctuation. In this regard the subject " "line is like a newspaper headline." msgstr "" "Не ставьте точку или другие знаки препинания в конце. В этом отношении " "строка темы подобна заголовку в газете." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2509 +#: documentation/content/en/articles/committers-guide/_index.adoc:2514 #, no-wrap msgid "Separate the subject and body with a blank line" msgstr "Разделите тему и тело письма пустой строкой" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2512 +#: documentation/content/en/articles/committers-guide/_index.adoc:2517 msgid "Separate the body from the subject with a blank line." msgstr "Отделите тело от темы пустой строкой." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2514 +#: documentation/content/en/articles/committers-guide/_index.adoc:2519 msgid "" "Some trivial commits do not require a body, and will have only a subject." msgstr "" "Некоторые тривиальные коммиты не требуют тела и содержат только заголовок." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2516 +#: documentation/content/en/articles/committers-guide/_index.adoc:2521 msgid "✓ `ls: Fix typo in usage text`" msgstr "✓ `ls: Fix typo in usage text`" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2517 +#: documentation/content/en/articles/committers-guide/_index.adoc:2522 #, no-wrap msgid "Limit messages to 72 columns" msgstr "Ограничьте сообщения до 72 колонок" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2523 +#: documentation/content/en/articles/committers-guide/_index.adoc:2528 msgid "" "`git log` and `git format-patch` indent the commit message by four spaces. " "Wrapping at 72 columns provides a matching margin on the right edge. " "Limiting messages to 72 characters also keeps the commit message in " "formatted patches below RFC 2822's suggested email line length limit of 78 " "characters. This limit works well with a variety of tools that may render " "commit messages; line wrapping might be inconsistent with longer line length." msgstr "" "`git log` и `git format-patch` делают отступ в сообщении коммита на четыре " "пробела. Перенос строк на 72-й колонке обеспечивает соответствующий отступ " "по правому краю. Ограничение сообщений 72 символами также удерживает " "сообщение коммита в форматированных патчах ниже рекомендованного RFC 2822 " "ограничения длины строки электронной почты в 78 символов. Это ограничение " "хорошо работает с различными инструментами, которые могут отображать " "сообщения коммитов; перенос строк может быть непоследовательным при большей " "длине строки." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2524 +#: documentation/content/en/articles/committers-guide/_index.adoc:2529 #, no-wrap msgid "Use the present tense, imperative mood" msgstr "Используйте настоящее время, повелительное наклонение" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2529 +#: documentation/content/en/articles/committers-guide/_index.adoc:2534 msgid "" "This facilitates short subject lines and provides consistency, including " "with automatically generated commit messages (e.g., as generated by git " "revert). This is important when reading a list of commit subjects. Think " "of the subject as finishing the sentence \"when applied, this change will ..." "\"." msgstr "" "Это способствует краткости тем и обеспечивает единообразие, включая " "автоматически генерируемые сообщения коммитов (например, создаваемые `git " "revert`). Это важно при чтении списка тем коммитов. Думайте о теме как о " "завершении фразы «при применении это изменение позволит...(when applied, " "this change will ...)»." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2534 +#: documentation/content/en/articles/committers-guide/_index.adoc:2539 #, no-wrap msgid "" "✓ `foo: Implement the -k (keep) option`\n" "✗ `foo: Implemented the -k option`\n" "✗ `This change implements the -k option in foo`\n" "✗ `-k option added`" msgstr "" "✓ `foo: Implement the -k (keep) option`\n" "✗ `foo: Implemented the -k option`\n" "✗ `This change implements the -k option in foo`\n" "✗ `-k option added`" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2535 +#: documentation/content/en/articles/committers-guide/_index.adoc:2540 #, no-wrap msgid "Focus on what and why, not how" msgstr "Сосредоточьтесь на том, что и почему, а не на том, как" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2538 +#: documentation/content/en/articles/committers-guide/_index.adoc:2543 msgid "" "Explain what the change accomplishes and why it is being done, rather than " "how." msgstr "Объясните, чего достигает изменение и почему оно делается, а не как." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2542 +#: documentation/content/en/articles/committers-guide/_index.adoc:2547 msgid "" "Do not assume that the reader is familiar with the issue. Explain the " "background and motivation for the change. Include benchmark data if you " "have it." msgstr "" "Не предполагайте, что читатель знаком с проблемой. Объясните предысторию и " "мотивацию изменения. Включите данные тестирования производительности, если " "они у вас есть." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2544 +#: documentation/content/en/articles/committers-guide/_index.adoc:2549 msgid "" "If there are limitations or incomplete aspects of the change, describe them " "in the commit message." msgstr "" "Если в изменениях есть ограничения или неполные аспекты, опишите их в " "сообщении коммита." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2545 +#: documentation/content/en/articles/committers-guide/_index.adoc:2550 #, no-wrap msgid "Consider whether parts of the commit message could be code comments instead" -msgstr "" -"Подумайте, можно ли части сообщения коммита оформить как комментарии в коде" +msgstr "Подумайте, можно ли части сообщения коммита оформить как комментарии в коде" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2548 +#: documentation/content/en/articles/committers-guide/_index.adoc:2553 msgid "" "Sometimes while writing a commit message you may find yourself writing a " "sentence or two explaining some tricky or confusing aspect of the change. " "When this happens consider whether it would be valuable to have that " "explanation as a comment in the code itself." msgstr "" "Иногда при написании сообщения коммита вы можете обнаружить, что пишете одно-" "два предложения, объясняющих какой-то сложный или запутанный аспект " "изменения. В таких случаях стоит подумать, будет ли полезно иметь это " "объяснение в виде комментария в самом коде." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2549 +#: documentation/content/en/articles/committers-guide/_index.adoc:2554 #, no-wrap msgid "Write commit messages for your future self" msgstr "Напишите сообщения коммитов для себя в будущем" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2553 +#: documentation/content/en/articles/committers-guide/_index.adoc:2558 msgid "" "While writing the commit message for a change you have all of the context in " "mind - what prompted the change, alternate approaches that were considered " "and rejected, limitations of the change, and so on. Imagine yourself " "revisiting the change a year or two in the future, and write the commit " "message in a way that would provide that necessary context." msgstr "" "При написании сообщения коммита для изменения у вас есть весь контекст в " "голове — что вызвало изменение, альтернативные подходы, которые " "рассматривались и были отклонены, ограничения изменения и так далее. " "Представьте, что вы возвращаетесь к изменению через год или два, и напишите " "сообщение коммита таким образом, чтобы оно предоставило этот необходимый " "контекст." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2554 +#: documentation/content/en/articles/committers-guide/_index.adoc:2559 #, no-wrap msgid "Commit messages should stand alone" msgstr "Сообщения о коммитах должны быть самодостаточными" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2558 +#: documentation/content/en/articles/committers-guide/_index.adoc:2563 msgid "" "You may include references to mailing list postings, benchmark result web " "sites, or code review links. However, the commit message should contain all " "of the relevant information in case these references are no longer available " "in the future." msgstr "" "Вы можете включать ссылки на сообщения в почтовых рассылках, сайты с " "результатами тестирования производительности или ссылки на проверки кода. " "Однако, сообщение о коммите должно содержать всю соответствующую информацию " "на случай, если эти ссылки станут недоступны в будущем." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2562 +#: documentation/content/en/articles/committers-guide/_index.adoc:2567 msgid "" "Similarly, a commit may refer to a previous commit, for example in the case " "of a bug fix or revert. In addition to the commit identifier (revision or " "hash), include the subject line from the referenced commit (or another " "suitable brief reference). With each VCS migration (from CVS to Subversion " "to Git) revision identifiers from previous systems may become difficult to " "follow." msgstr "" "Аналогично, коммит может ссылаться на предыдущий коммит, например, в случае " "исправления ошибки или отката. Помимо идентификатора коммита (ревизии или " "хеша), включите строку темы из упомянутого коммита (или другую подходящую " "краткую ссылку). С каждой миграцией системы контроля версий (от CVS к " "Subversion и затем к Git) идентификаторы ревизий из предыдущих систем могут " "становиться трудными для отслеживания." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:2563 +#: documentation/content/en/articles/committers-guide/_index.adoc:2568 #, no-wrap msgid "Include appropriate metadata in a footer" msgstr "Укажите необходимые метаданные в нижней части" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2566 +#: documentation/content/en/articles/committers-guide/_index.adoc:2571 msgid "" "As well as including an informative message with each commit, some " "additional information may be needed." msgstr "" "Помимо включения информативного сообщения с каждым коммитом, может " "потребоваться некоторая дополнительная информация." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2568 +#: documentation/content/en/articles/committers-guide/_index.adoc:2573 msgid "" "This information consists of one or more lines containing the key word or " "phrase, a colon, tabs for formatting, and then the additional information." msgstr "" "Эта информация состоит из одной или нескольких строк, содержащих ключевое " "слово или фразу, двоеточие, табуляции для форматирования и затем " "дополнительную информацию." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2570 +#: documentation/content/en/articles/committers-guide/_index.adoc:2575 msgid "" "For key words where multiple values make sense (e.g., `PR:` with a comma-" "separated list of PRs), it is permitted to use the same keyword multiple " "times to avoid ambiguity or improve readability." msgstr "" "Для ключевых слов, где допустимы множественные значения (например, `PR:` со " "списком PR через запятую), разрешается использовать одно и то же ключевое " "слово несколько раз, чтобы избежать неоднозначности или улучшить читаемость." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2572 +#: documentation/content/en/articles/committers-guide/_index.adoc:2577 msgid "The key words or phrases are:" msgstr "Ключевые слова или фразы:" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2578 +#: documentation/content/en/articles/committers-guide/_index.adoc:2583 #, no-wrap msgid "`PR:`" msgstr "`PR:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2580 +#: documentation/content/en/articles/committers-guide/_index.adoc:2585 #, no-wrap msgid "The problem report (if any) which is affected (typically, by being closed) by this commit. Multiple PRs may be specified on one line, separated by commas or spaces." -msgstr "" -"Номер отчета о проблеме (если есть), на который влияет данный коммит (обычно " -"путем закрытия). Можно указать несколько номеров PR в одной строке, разделяя " -"их запятыми или пробелами." +msgstr "Номер отчета о проблеме (если есть), на который влияет данный коммит (обычно путем закрытия). Можно указать несколько номеров PR в одной строке, разделяя их запятыми или пробелами." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2581 +#: documentation/content/en/articles/committers-guide/_index.adoc:2586 #, no-wrap msgid "`Reported by:`" msgstr "`Reported by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2585 +#: documentation/content/en/articles/committers-guide/_index.adoc:2590 #, no-wrap msgid "" "The name and e-mail address of the person that reported the issue; for developers, just the username on the FreeBSD cluster.\n" "Typically used when there is no PR, for example if the issue was reported on\n" "a mailing list." msgstr "" -"Имя и адрес электронной почты лица, сообщившего о проблеме; для " -"разработчиков — только имя пользователя в кластере FreeBSD.\n" +"Имя и адрес электронной почты лица, сообщившего о проблеме; для разработчиков — только имя пользователя в кластере FreeBSD.\n" "Обычно используется, когда нет PR, например, если проблема была сообщена в\n" "почтовой рассылке." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2587 +#: documentation/content/en/articles/committers-guide/_index.adoc:2592 #, no-wrap msgid "" "`Submitted by:` +\n" "(deprecated)" msgstr "" "`Submitted by:` +\n" "(deprecated)" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2589 +#: documentation/content/en/articles/committers-guide/_index.adoc:2594 #, no-wrap msgid "This has been deprecated with git; submitted patches should have the author set by using `git commit --author` with a full name and valid email." -msgstr "" -"Это устарело в git; отправляемые патчи должны указывать автора с помощью `" -"git commit --author` с указанием полного имени и действительного email." +msgstr "Это устарело в git; отправляемые патчи должны указывать автора с помощью `git commit --author` с указанием полного имени и действительного email." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2590 +#: documentation/content/en/articles/committers-guide/_index.adoc:2595 #, no-wrap msgid "`Reviewed by:`" msgstr "`Reviewed by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2605 +#: documentation/content/en/articles/committers-guide/_index.adoc:2610 #, no-wrap msgid "" "The name and e-mail address of the person or people that reviewed the change; for developers, just the username on the FreeBSD cluster. If a patch was submitted to a mailing list for review, and the review was favorable, then just include the list name. If the reviewer is not a member of the project, provide the name, email, and if ports an external role like maintainer:\n" "\n" "Reviewed by a developer:\n" "[source,shell]\n" "....\n" "Reviewed by: username\n" "....\n" "\n" "Reviewed by a ports maintainer that is not a developer:\n" "[source,shell]\n" "....\n" "Reviewed by: Full Name (maintainer)\n" "...." msgstr "" -"Имя и адрес электронной почты человека или людей, которые проверили " -"изменение; для разработчиков достаточно указать имя пользователя в кластере " -"FreeBSD. Если патч был отправлен в список рассылки для проверки и получил " -"положительный отзыв, то укажите только название списка. Если рецензент не " -"является участником проекта, укажите имя, электронную почту и, если это " -"порт, внешнюю роль, например, сопровождающего:\n" +"Имя и адрес электронной почты человека или людей, которые проверили изменение; для разработчиков достаточно указать имя пользователя в кластере FreeBSD. Если патч был отправлен в список рассылки для проверки и получил положительный отзыв, то укажите только название списка. Если рецензент не является участником проекта, укажите имя, электронную почту и, если это порт, внешнюю роль, например, сопровождающего:\n" "\n" "Проверено разработчиком:\n" "[source,shell]\n" "....\n" "Reviewed by: username\n" "....\n" "\n" "Проверено сопровождающим портов, не являющимся разработчиком:\n" "[source,shell]\n" "....\n" "Reviewed by: Full Name (maintainer)\n" "...." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2606 +#: documentation/content/en/articles/committers-guide/_index.adoc:2611 #, no-wrap msgid "`Tested by:`" msgstr "`Tested by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2608 +#: documentation/content/en/articles/committers-guide/_index.adoc:2613 #, no-wrap msgid "The name and e-mail address of the person or people that tested the change; for developers, just the username on the FreeBSD cluster." -msgstr "" -"Имя и адрес электронной почты человека или людей, которые проверили " -"изменение; для разработчиков — просто имя пользователя в кластере FreeBSD." +msgstr "Имя и адрес электронной почты человека или людей, которые проверили изменение; для разработчиков — просто имя пользователя в кластере FreeBSD." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2609 +#: documentation/content/en/articles/committers-guide/_index.adoc:2614 #, no-wrap msgid "`Discussed with:`" msgstr "`Discussed with:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2612 +#: documentation/content/en/articles/committers-guide/_index.adoc:2617 #, no-wrap msgid "" "The name and e-mail address of the person or people that contributed to the patch by providing meaningful feedback; for developers, just the username on the FreeBSD cluster.\n" "Typically used to credit those who did not explicitly review, test, or approve the change, but nevertheless contributed to the discussion surrounding the change, which led to improvements and a better understanding of its impact on the FreeBSD project." msgstr "" -"Имя и адрес электронной почты человека или людей, которые внесли вклад в " -"исправление, предоставив содержательную обратную связь; для разработчиков — " -"просто имя пользователя в кластере FreeBSD.\n" -"Обычно используется для упоминания тех, кто не проводил явного " -"рецензирования, тестирования или одобрения изменения, но тем не менее " -"участвовал в обсуждении, связанном с изменением, что привело к улучшениям и " -"лучшему пониманию его влияния на проект FreeBSD." +"Имя и адрес электронной почты человека или людей, которые внесли вклад в исправление, предоставив содержательную обратную связь; для разработчиков — просто имя пользователя в кластере FreeBSD.\n" +"Обычно используется для упоминания тех, кто не проводил явного рецензирования, тестирования или одобрения изменения, но тем не менее участвовал в обсуждении, связанном с изменением, что привело к улучшениям и лучшему пониманию его влияния на проект FreeBSD." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2613 +#: documentation/content/en/articles/committers-guide/_index.adoc:2618 #, no-wrap msgid "`Approved by:`" msgstr "`Approved by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2639 +#: documentation/content/en/articles/committers-guide/_index.adoc:2644 #, no-wrap msgid "" "The name and e-mail address of the person or people that approved the change; for developers, just the username on the FreeBSD cluster.\n" "\n" "There are several cases where approval is customary:\n" "\n" "* while a new committer is under mentorship\n" "* commits to an area of the tree covered by the LOCKS file (src)\n" "* during a release cycle\n" "* committing to a repo where you do not hold a commit bit (e.g. src committer committing to docs)\n" "* committing to a port maintained by someone else\n" "\n" "While under mentorship, get mentor approval before the commit. Enter the mentor's username in this field, and note that they are a mentor:\n" "\n" "[source,shell]\n" "....\n" "Approved by: username-of-mentor (mentor)\n" "....\n" "\n" "If a team approved these commits then include the team name followed by the username of the approver in parentheses. For example:\n" "\n" "[source,shell]\n" "....\n" "Approved by: re (username)\n" "...." msgstr "" -"Имя и адрес электронной почты лица или лиц, утвердивших изменение; для " -"разработчиков — просто имя пользователя в кластере FreeBSD.\n" +"Имя и адрес электронной почты лица или лиц, утвердивших изменение; для разработчиков — просто имя пользователя в кластере FreeBSD.\n" "\n" "Есть несколько случаев, когда утверждение является обычной практикой:\n" "\n" "* когда новый коммиттер находится под наставничеством\n" "* коммиты в область дерева, указанную в файле LOCKS (src)\n" "* во время цикла выпуска\n" -"* коммиты в репозиторий, где у вас нет права на коммит (например, коммиттер " -"src делает коммит в docs)\n" +"* коммиты в репозиторий, где у вас нет права на коммит (например, коммиттер src делает коммит в docs)\n" "* коммиты в порт, поддерживаемый кем-то другим\n" "\n" -"Во время наставничества получите одобрение наставника перед коммитом. " -"Укажите имя пользователя наставника в этом поле и отметьте, что он является " -"наставником:\n" +"Во время наставничества получите одобрение наставника перед коммитом. Укажите имя пользователя наставника в этом поле и отметьте, что он является наставником:\n" "\n" "[source,shell]\n" "....\n" "Approved by: имя-пользователя-наставника (mentor)\n" "....\n" "\n" -"Если коммиты были утверждены командой, укажите название команды, за которым " -"в скобках следует имя пользователя утверждающего. Например:\n" +"Если коммиты были утверждены командой, укажите название команды, за которым в скобках следует имя пользователя утверждающего. Например:\n" "\n" "[source,shell]\n" "....\n" "Approved by: re (имя-пользователя)\n" "...." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2640 +#: documentation/content/en/articles/committers-guide/_index.adoc:2645 #, no-wrap msgid "`Obtained from:`" msgstr "`Obtained from:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2642 +#: documentation/content/en/articles/committers-guide/_index.adoc:2647 #, no-wrap msgid "The name of the project (if any) from which the code was obtained. Do not use this line for the name of an individual person." -msgstr "" -"Название проекта (если есть), из которого был получен код. Не используйте " -"эту строку для указания имени отдельного человека." +msgstr "Название проекта (если есть), из которого был получен код. Не используйте эту строку для указания имени отдельного человека." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2643 +#: documentation/content/en/articles/committers-guide/_index.adoc:2648 #, no-wrap msgid "`Fixes:`" msgstr "`Fixes:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2646 +#: documentation/content/en/articles/committers-guide/_index.adoc:2651 #, no-wrap msgid "" "The Git short hash and the title line of a commit that is fixed by this change as returned by `git log -n 1 --pretty=format:'%h (\"%s\")' GIT-COMMIT-HASH`.\n" "We include the commit title so that the referenced commit can be located even in the case that a future VCS migration invalidates hash references." msgstr "" -"Короткий хэш Git и заголовок коммита, который исправлен этим изменением, как " -"возвращается командой `git log -n 1 --pretty=format:'%h (\"%s\")' GIT-COMMIT-" -"HASH`.\n" -"Мы включаем заголовок коммита, чтобы можно было найти указанный коммит даже " -"в случае, если будущая миграция системы контроля версий сделает ссылки по " -"хэшу недействительными." +"Короткий хэш Git и заголовок коммита, который исправлен этим изменением, как возвращается командой `git log -n 1 --pretty=format:'%h (\"%s\")' GIT-COMMIT-HASH`.\n" +"Мы включаем заголовок коммита, чтобы можно было найти указанный коммит даже в случае, если будущая миграция системы контроля версий сделает ссылки по хэшу недействительными." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2647 +#: documentation/content/en/articles/committers-guide/_index.adoc:2652 #, no-wrap msgid "`MFC after:`" msgstr "`MFC after:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2649 +#: documentation/content/en/articles/committers-guide/_index.adoc:2654 #, no-wrap msgid "To receive an e-mail reminder to MFC at a later date, specify the number of days, weeks, or months after which an MFC is planned." -msgstr "" -"Чтобы получить напоминание по электронной почте о запланированном MFC через " -"определенное время, укажите количество дней, недель или месяцев, после " -"которых планируется выполнить MFC." +msgstr "Чтобы получить напоминание по электронной почте о запланированном MFC через определенное время, укажите количество дней, недель или месяцев, после которых планируется выполнить MFC." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2650 +#: documentation/content/en/articles/committers-guide/_index.adoc:2655 #, no-wrap msgid "`MFC to:`" msgstr "`MFC to:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2652 +#: documentation/content/en/articles/committers-guide/_index.adoc:2657 #, no-wrap msgid "If the commit should be merged to a subset of stable branches, specify the branch names." -msgstr "" -"Если коммиту должно быть сделано слияние в подмножество стабильных веток, " -"укажите названия веток." +msgstr "Если коммиту должно быть сделано слияние в подмножество стабильных веток, укажите названия веток." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2653 +#: documentation/content/en/articles/committers-guide/_index.adoc:2658 #, no-wrap msgid "`MFH:`" msgstr "`MFH:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2655 +#: documentation/content/en/articles/committers-guide/_index.adoc:2660 #, no-wrap msgid "If the commit is to be merged into a ports quarterly branch name, specify the quarterly branch. For example `2021Q2`." -msgstr "" -"Если коммиту должно быть сделано слияние в квартальную ветку портов, укажите " -"квартальную ветку. Например, `2021Q2`." +msgstr "Если коммиту должно быть сделано слияние в квартальную ветку портов, укажите квартальную ветку. Например, `2021Q2`." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2656 +#: documentation/content/en/articles/committers-guide/_index.adoc:2661 #, no-wrap msgid "`Relnotes:`" msgstr "`Relnotes:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2658 +#: documentation/content/en/articles/committers-guide/_index.adoc:2662 #, no-wrap msgid "If the change is a candidate for inclusion in the release notes for the next release from the branch, set to `yes`." +msgstr "Если изменение является кандидатом для включения в примечания к выпуску следующей версии из ветки, установите значение `yes`." + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:2663 +#, no-wrap +msgid "Candidates are user-visible changes, new features, compatibility breaks, etc.." +msgstr "" +"Кандидатами являются изменения, видимые пользователям, новые функции, " +"нарушения совместимости и т.д." + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:2664 +#, no-wrap +msgid "If you forget to set this line, or want to provide more details, add an entry to the `RELNOTES` file in the root of the src tree." +msgstr "" +"Если вы забыли установить эту строку или хотите предоставить более подробную " +"информацию, добавьте запись в файл `RELNOTES` в корне дерева исходного кода " +"src." + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:2665 +#, no-wrap +msgid "The `RELNOTES` file is used to generate release notes for the next release." +msgstr "" +"Файл `RELNOTES` используется для формирования примечаний к выпуску для " +"следующего релиза." + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:2667 +#, no-wrap +msgid "Do not use the `Relnotes:` line to describe the change: its only valid value is `yes`." msgstr "" -"Если изменение является кандидатом для включения в примечания к выпуску " -"следующей версии из ветки, установите значение `yes`." +"Не используйте строку `Relnotes:` для описания изменения: ее единственное " +"допустимое значение - `yes`." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2659 +#: documentation/content/en/articles/committers-guide/_index.adoc:2668 #, no-wrap msgid "`Security:`" msgstr "`Security:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2661 +#: documentation/content/en/articles/committers-guide/_index.adoc:2670 #, no-wrap msgid "If the change is related to a security vulnerability or security exposure, include one or more references or a description of the issue. If possible, include a VuXML URL or a CVE ID." -msgstr "" -"Если изменение связано с уязвимостью или угрозой безопасности, укажите одну " -"или несколько ссылок либо описание проблемы. По возможности включите URL " -"VuXML или идентификатор CVE." +msgstr "Если изменение связано с уязвимостью или угрозой безопасности, укажите одну или несколько ссылок либо описание проблемы. По возможности включите URL VuXML или идентификатор CVE." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2662 +#: documentation/content/en/articles/committers-guide/_index.adoc:2671 #, no-wrap msgid "`Event:`" msgstr "`Event:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2664 +#: documentation/content/en/articles/committers-guide/_index.adoc:2673 #, no-wrap msgid "The description for the event where this commit was made. If this is a recurring event, add the year or even the month to it. For example, this could be `FooBSDcon 2019`. The idea behind this line is to put recognition to conferences, gatherings, and other types of meetups and to show that these are useful to have. Please do not use the `Sponsored by:` line for this as that is meant for organizations sponsoring certain features or developers working on them." -msgstr "" -"Описание события, в рамках которого был выполнен этот коммит. Если это " -"повторяющееся событие, добавьте год или даже месяц. Например, это может быть " -"`FooBSDcon 2019`. Идея этой строки — отдать должное конференциям, встречам и " -"другим подобным мероприятиям, а также показать, что их проведение полезно. " -"Пожалуйста, не используйте строку `Sponsored by:` для этого, так как она " -"предназначена для организаций, спонсирующих определённые функции, или " -"разработчиков, работающих над ними." +msgstr "Описание события, в рамках которого был выполнен этот коммит. Если это повторяющееся событие, добавьте год или даже месяц. Например, это может быть `FooBSDcon 2019`. Идея этой строки — отдать должное конференциям, встречам и другим подобным мероприятиям, а также показать, что их проведение полезно. Пожалуйста, не используйте строку `Sponsored by:` для этого, так как она предназначена для организаций, спонсирующих определённые функции, или разработчиков, работающих над ними." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2665 +#: documentation/content/en/articles/committers-guide/_index.adoc:2674 #, no-wrap msgid "`Sponsored by:`" msgstr "`Sponsored by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2667 +#: documentation/content/en/articles/committers-guide/_index.adoc:2676 #, no-wrap msgid "Sponsoring organizations for this change, if any. Separate multiple organizations with commas. If only a portion of the work was sponsored, or different amounts of sponsorship were provided to different authors, please give appropriate credit in parentheses after each sponsor name. For example, `Example.com (alice, code refactoring), Wormulon (bob), Momcorp (cindy)` shows that Alice was sponsored by Example.com to do code refactoring, while Wormulon sponsored Bob's work and Momcorp sponsored Cindy's work. Other authors were either not sponsored or chose not to list sponsorship." -msgstr "" -"Организации, спонсировавшие это изменение (если есть). Разделяйте несколько " -"организаций запятыми. Если только часть работы была спонсирована или разные " -"суммы спонсорской поддержки были предоставлены разным авторам, укажите " -"соответствующую информацию в скобках после каждого имени спонсора. Например, " -"`Example.com (alice, code refactoring), Wormulon (bob), Momcorp (cindy)` " -"показывает, что Alice была спонсирована Example.com для рефакторинга кода, в " -"то время как Wormulon спонсировал работу Bob, а Momcorp спонсировал работу " -"Cindy. Другие авторы либо не были спонсированы, либо решили не указывать " -"спонсорство." +msgstr "Организации, спонсировавшие это изменение (если есть). Разделяйте несколько организаций запятыми. Если только часть работы была спонсирована или разные суммы спонсорской поддержки были предоставлены разным авторам, укажите соответствующую информацию в скобках после каждого имени спонсора. Например, `Example.com (alice, code refactoring), Wormulon (bob), Momcorp (cindy)` показывает, что Alice была спонсирована Example.com для рефакторинга кода, в то время как Wormulon спонсировал работу Bob, а Momcorp спонсировал работу Cindy. Другие авторы либо не были спонсированы, либо решили не указывать спонсорство." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2668 +#: documentation/content/en/articles/committers-guide/_index.adoc:2677 #, no-wrap msgid "`Pull Request:`" msgstr "`Pull Request:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2672 +#: documentation/content/en/articles/committers-guide/_index.adoc:2681 #, no-wrap msgid "" "This change was submitted as a pull request or merge request against one of FreeBSD's public read-only Git repositories.\n" "It should include the entire URL to the pull request, as these often act as code reviews for the code.\n" "For example: `https://github.com/freebsd/freebsd-src/pull/745`" msgstr "" -"Это изменение было отправлено как запрос на принятие изменений (pull request)" -" или запрос на слияние (merge request) в один из публичных Git-репозиториев " -"FreeBSD только для чтения.\n" -"Оно должно включать полный URL запроса на включение изменений, так как они " -"часто выполняют роль рецензий кода.\n" +"Это изменение было отправлено как запрос на принятие изменений (pull request) или запрос на слияние (merge request) в один из публичных Git-репозиториев FreeBSD только для чтения.\n" +"Оно должно включать полный URL запроса на включение изменений, так как они часто выполняют роль рецензий кода.\n" "Например: `https://github.com/freebsd/freebsd-src/pull/745`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2673 +#: documentation/content/en/articles/committers-guide/_index.adoc:2682 #, no-wrap msgid "`Co-authored-by:`" msgstr "`Co-authored-by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2676 +#: documentation/content/en/articles/committers-guide/_index.adoc:2685 #, no-wrap msgid "" "The name and email address of an additional author of the commit.\n" "GitHub has a detailed description of the Co-authored-by trailer at https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors." msgstr "" "Имя и адрес электронной почты дополнительного автора коммита.\n" -"GitHub содержит подробное описание трейлера Co-authored-by по адресу " -"https://docs.github.com/en/pull-requests/committing-changes-to-your-project/" -"creating-and-editing-commits/creating-a-commit-with-multiple-authors." +"GitHub содержит подробное описание трейлера Co-authored-by по адресу https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors." #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2677 +#: documentation/content/en/articles/committers-guide/_index.adoc:2686 #, no-wrap msgid "`Signed-off-by:`" msgstr "`Signed-off-by:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2679 +#: documentation/content/en/articles/committers-guide/_index.adoc:2688 #, no-wrap msgid "ID certifies compliance with https://developercertificate.org/" -msgstr "" -"ID подтверждает соответствие требованиям https://developercertificate.org/" +msgstr "ID подтверждает соответствие требованиям https://developercertificate.org/" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2680 +#: documentation/content/en/articles/committers-guide/_index.adoc:2689 #, no-wrap msgid "`Differential Revision:`" msgstr "`Differential Revision:`" #. type: Table -#: documentation/content/en/articles/committers-guide/_index.adoc:2682 +#: documentation/content/en/articles/committers-guide/_index.adoc:2691 #, no-wrap msgid "The full URL of the Phabricator review. This line __must be the last line__. For example: `https://reviews.freebsd.org/D1708`." -msgstr "" -"Полный URL обзора в Phabricator. Эта строка __должна быть последней " -"строкой__. Например: `https://reviews.freebsd.org/D1708`." +msgstr "Полный URL обзора в Phabricator. Эта строка __должна быть последней строкой__. Например: `https://reviews.freebsd.org/D1708`." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2684 +#: documentation/content/en/articles/committers-guide/_index.adoc:2693 #, no-wrap msgid "Commit Log for a Commit Based on a PR" msgstr "Журнал изменений для коммита на основе PR" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2690 +#: documentation/content/en/articles/committers-guide/_index.adoc:2699 msgid "" "The commit is based on a patch from a PR submitted by John Smith. The " "commit message \"PR\" field is filled." msgstr "" "Коммит основан на патче из PR, предоставленного Джоном Смитом. Поле \"PR\" в " "сообщении коммита заполнено." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2694 -#: documentation/content/en/articles/committers-guide/_index.adoc:2712 -#: documentation/content/en/articles/committers-guide/_index.adoc:2727 -#: documentation/content/en/articles/committers-guide/_index.adoc:2743 -#: documentation/content/en/articles/committers-guide/_index.adoc:2758 +#: documentation/content/en/articles/committers-guide/_index.adoc:2703 +#: documentation/content/en/articles/committers-guide/_index.adoc:2721 +#: documentation/content/en/articles/committers-guide/_index.adoc:2736 +#: documentation/content/en/articles/committers-guide/_index.adoc:2752 +#: documentation/content/en/articles/committers-guide/_index.adoc:2767 #, no-wrap msgid "...\n" msgstr "...\n" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2696 +#: documentation/content/en/articles/committers-guide/_index.adoc:2705 #, no-wrap msgid "PR:\t\t12345\n" msgstr "PR:\t\t12345\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2699 +#: documentation/content/en/articles/committers-guide/_index.adoc:2708 msgid "" "The committer sets the author of the patch with `git commit --author \"John " "Smith \"`." msgstr "" "Участник устанавливает автора патча с помощью `git commit --author \"John " "Smith \"`." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2702 +#: documentation/content/en/articles/committers-guide/_index.adoc:2711 #, no-wrap msgid "Commit Log for a Commit Needing Review" msgstr "Журнал изменений для коммита, требующего проверки" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2708 +#: documentation/content/en/articles/committers-guide/_index.adoc:2717 msgid "" "The virtual memory system is being changed. After posting patches to the " "appropriate mailing list (in this case, `freebsd-arch`) and the changes have " "been approved." msgstr "" "Вносятся изменения в систему виртуальной памяти. После отправки патчей в " "соответствующий список рассылки (в данном случае, `freebsd-arch`) и " "утверждения изменений." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2714 +#: documentation/content/en/articles/committers-guide/_index.adoc:2723 #, no-wrap msgid "Reviewed by:\t-arch\n" msgstr "Reviewed by:\t-arch\n" #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2718 +#: documentation/content/en/articles/committers-guide/_index.adoc:2727 #, no-wrap msgid "Commit Log for a Commit Needing Approval" msgstr "Журнал изменений для коммита, требующего одобрения" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2723 +#: documentation/content/en/articles/committers-guide/_index.adoc:2732 msgid "" "Commit a port, after working with the listed MAINTAINER, who said to go " "ahead and commit." msgstr "" "Закоммитить порт после согласования с указанным MAINTAINER, который дал " "добро на коммит." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2729 +#: documentation/content/en/articles/committers-guide/_index.adoc:2738 #, no-wrap msgid "Approved by:\tabc (maintainer)\n" msgstr "Approved by:\tabc (maintainer)\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2732 +#: documentation/content/en/articles/committers-guide/_index.adoc:2741 msgid "Where _abc_ is the account name of the person who approved." msgstr "Где _abc_ — имя учётной записи лица, одобрившего коммит." #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2734 +#: documentation/content/en/articles/committers-guide/_index.adoc:2743 #, no-wrap msgid "Commit Log for a Commit Bringing in Code from OpenBSD" msgstr "Журнал изменений для коммита, вносящего код из OpenBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2739 +#: documentation/content/en/articles/committers-guide/_index.adoc:2748 msgid "Committing some code based on work done in the OpenBSD project." -msgstr "Коммит некоторого кода на основе работы, выполненной в проекте OpenBSD." +msgstr "" +"Коммит некоторого кода на основе работы, выполненной в проекте OpenBSD." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2745 +#: documentation/content/en/articles/committers-guide/_index.adoc:2754 #, no-wrap msgid "Obtained from:\tOpenBSD\n" msgstr "Obtained from:\tOpenBSD\n" #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2749 +#: documentation/content/en/articles/committers-guide/_index.adoc:2758 #, no-wrap msgid "Commit Log for a Change to FreeBSD-CURRENT with a Planned Commit to FreeBSD-STABLE to Follow at a Later Date." -msgstr "" -"Журнал коммитов для правки в FreeBSD-CURRENT с запланированным коммитом в " -"FreeBSD-STABLE в последующее время." +msgstr "Журнал коммитов для правки в FreeBSD-CURRENT с запланированным коммитом в FreeBSD-STABLE в последующее время." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2754 +#: documentation/content/en/articles/committers-guide/_index.adoc:2763 msgid "" "Committing some code which will be merged from FreeBSD-CURRENT into the " "FreeBSD-STABLE branch after two weeks." msgstr "" "Коммит некоторого кода, которому будет сделано слияние из ветки FreeBSD-" "CURRENT в ветку FreeBSD-STABLE через две недели." #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2760 +#: documentation/content/en/articles/committers-guide/_index.adoc:2769 #, no-wrap msgid "MFC after:\t2 weeks\n" msgstr "MFC after:\t2 weeks\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2763 +#: documentation/content/en/articles/committers-guide/_index.adoc:2772 msgid "" "Where _2_ is the number of days, weeks, or months after which an MFC is " "planned. The _weeks_ option may be `day`, `days`, `week`, `weeks`, `month`, " "`months`." msgstr "" "Где _2_ — количество дней, недель или месяцев, после которых запланировано " "MFC. Вариант _weeks_ может быть — `day`, `days`, `week`, `weeks`, `month`, " "`months`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2766 +#: documentation/content/en/articles/committers-guide/_index.adoc:2775 msgid "It is often necessary to combine these." msgstr "Часто необходимо комбинировать их." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2770 +#: documentation/content/en/articles/committers-guide/_index.adoc:2779 msgid "" "Consider the situation where a user has submitted a PR containing code from " "the NetBSD project. Looking at the PR, the developer sees it is not an area " "of the tree they normally work in, so they have the change reviewed by the " "`arch` mailing list. Since the change is complex, the developer opts to MFC " "after one month to allow adequate testing." msgstr "" "Рассмотрим ситуацию, когда пользователь отправил PR с кодом из проекта " "NetBSD. Разработчик, просматривая PR, видит, что это не та часть дерева, с " "которой он обычно работает, поэтому он отправляет изменение на " "рецензирование в список рассылки `arch`. Поскольку изменение сложное, " "разработчик решает отложить MFC на месяц, чтобы обеспечить достаточное " "тестирование." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2772 +#: documentation/content/en/articles/committers-guide/_index.adoc:2781 msgid "" "The extra information to include in the commit would look something like" msgstr "" "Дополнительная информация, которую нужно включить в коммит, будет выглядеть " "примерно так" #. type: Block title -#: documentation/content/en/articles/committers-guide/_index.adoc:2773 +#: documentation/content/en/articles/committers-guide/_index.adoc:2782 #, no-wrap msgid "Example Combined Commit Log" msgstr "Пример объединённого журнала коммитов" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2784 +#: documentation/content/en/articles/committers-guide/_index.adoc:2793 #, no-wrap msgid "" "PR:\t\t54321\n" "Reviewed by:\t-arch\n" "Obtained from:\tNetBSD\n" "MFC after:\t1 month\n" "Relnotes:\tyes\n" msgstr "" "PR:\t\t54321\n" "Reviewed by:\t-arch\n" "Obtained from:\tNetBSD\n" "MFC after:\t1 month\n" "Relnotes:\tyes\n" #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2789 +#: documentation/content/en/articles/committers-guide/_index.adoc:2798 #, no-wrap msgid "Preferred License for New Files" msgstr "Предпочтительная лицензия для новых файлов" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2795 +#: documentation/content/en/articles/committers-guide/_index.adoc:2804 msgid "" "The FreeBSD Project's full license policy can be found at link:https://www." "FreeBSD.org/internal/software-license/[https://www.FreeBSD.org/internal/" "software-license]. The rest of this section is intended to help you get " "started. As a rule, when in doubt, ask. It is much easier to give advice " "than to fix the source tree." msgstr "" -"Полная политика лицензирования проекта FreeBSD доступна по ссылке " -"link:https://www.FreeBSD.org/internal/software-license/[https://www.FreeBSD." -"org/internal/software-license]. Остальная часть этого раздела предназначена " -"для того, чтобы помочь вам начать работу. Как правило, если сомневаетесь — " +"Полная политика лицензирования проекта FreeBSD доступна по ссылке link:" +"https://www.FreeBSD.org/internal/software-license/[https://www.FreeBSD.org/" +"internal/software-license]. Остальная часть этого раздела предназначена для " +"того, чтобы помочь вам начать работу. Как правило, если сомневаетесь — " "спрашивайте. Дать совет гораздо проще, чем исправлять дерево исходного кода." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2797 +#: documentation/content/en/articles/committers-guide/_index.adoc:2806 msgid "" "The FreeBSD Project suggests and uses this text as the preferred license " "scheme:" msgstr "" "Проект FreeBSD предлагает и использует следующий текст в качестве " "предпочтительной схемы лицензирования:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2828 +#: documentation/content/en/articles/committers-guide/_index.adoc:2837 #, no-wrap msgid "" "/*\n" " * SPDX-License-Identifier: BSD-2-Clause\n" " *\n" " * Copyright (c) [year] [your name]\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n" " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" " * SUCH DAMAGE.\n" " *\n" " * [id for your version control system, if any]\n" " */\n" msgstr "" "/*\n" " * SPDX-License-Identifier: BSD-2-Clause\n" " *\n" " * Copyright (c) [year] [your name]\n" " *\n" " * Redistribution and use in source and binary forms, with or without\n" " * modification, are permitted provided that the following conditions\n" " * are met:\n" " * 1. Redistributions of source code must retain the above copyright\n" " * notice, this list of conditions and the following disclaimer.\n" " * 2. Redistributions in binary form must reproduce the above copyright\n" " * notice, this list of conditions and the following disclaimer in the\n" " * documentation and/or other materials provided with the distribution.\n" " *\n" " * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n" " * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n" " * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n" " * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n" " * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n" " * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n" " * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n" " * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n" " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n" " * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n" " * SUCH DAMAGE.\n" " *\n" " * [id for your version control system, if any]\n" " */\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2834 +#: documentation/content/en/articles/committers-guide/_index.adoc:2843 msgid "" "The FreeBSD project strongly discourages the so-called \"advertising clause" "\" in new code. Due to the large number of contributors to the FreeBSD " "project, complying with this clause for many commercial vendors has become " "difficult. If you have code in the tree with the advertising clause, please " "consider removing it. In fact, please consider using the above license for " "your code." msgstr "" -"Проект FreeBSD настоятельно не рекомендует использовать так называемую «" -"рекламную оговорку» в новом коде. Из-за большого числа участников проекта " +"Проект FreeBSD настоятельно не рекомендует использовать так называемую " +"«рекламную оговорку» в новом коде. Из-за большого числа участников проекта " "FreeBSD соблюдение этой оговорки стало затруднительным для многих " "коммерческих вендоров. Если ваш код в дереве содержит рекламную оговорку, " "пожалуйста, рассмотрите возможность её удаления. Более того, пожалуйста, " "рассмотрите возможность использования вышеуказанной лицензии для вашего кода." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2838 +#: documentation/content/en/articles/committers-guide/_index.adoc:2847 msgid "" "The FreeBSD project discourages completely new licenses and variations on " "the standard licenses. New licenses require the approval of {core-email} to " "reside in the `src` repository. The more different licenses that are used " "in the tree, the more problems that this causes to those wishing to utilize " "this code, typically from unintended consequences from a poorly worded " "license." msgstr "" "Проект FreeBSD не приветствует полностью новые лицензии и вариации " "стандартных лицензий. Новые лицензии требуют одобрения {core-email} для " "размещения в репозитории `src`. Чем больше различных лицензий используется в " "дереве, тем больше проблем это создаёт для тех, кто желает использовать этот " "код, обычно из-за непредвиденных последствий плохо сформулированной лицензии." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2842 +#: documentation/content/en/articles/committers-guide/_index.adoc:2851 msgid "" "Project policy dictates that code under some non-BSD licenses must be placed " "only in specific sections of the repository, and in some cases, compilation " "must be conditional or even disabled by default. For example, the GENERIC " "kernel must be compiled under only licenses identical to or substantially " "similar to the BSD license. GPL, APSL, CDDL, etc, licensed software must " "not be compiled into GENERIC." msgstr "" "Политика проекта требует, чтобы код под некоторыми не-BSD лицензиями " "размещался только в определённых разделах репозитория, а в некоторых случаях " "компиляция должна быть условной или даже отключена по умолчанию. Например, " "ядро GENERIC должно компилироваться только под лицензиями, идентичными или " "существенно схожими с лицензией BSD. Программное обеспечение под лицензиями " "GPL, APSL, CDDL и т.п. не должно компилироваться в GENERIC." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2845 +#: documentation/content/en/articles/committers-guide/_index.adoc:2854 msgid "" "Developers are reminded that in open source, getting \"open\" right is just " "as important as getting \"source\" right, as improper handling of " "intellectual property has serious consequences. Any questions or concerns " "should immediately be brought to the attention of the core team." msgstr "" "Разработчикам следует помнить, что в открытом исходном коде правильное " "понимание «открытости» так же важно, как и правильное понимание «исходного " "кода», поскольку неправильное обращение с интеллектуальной собственностью " "имеет серьёзные последствия. Любые вопросы или опасения следует немедленно " "доводить до сведения основной команды." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2847 +#: documentation/content/en/articles/committers-guide/_index.adoc:2856 #, no-wrap msgid "Keeping Track of Licenses Granted to the FreeBSD Project" msgstr "Отслеживание лицензий, предоставленных проекту FreeBSD" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2852 +#: documentation/content/en/articles/committers-guide/_index.adoc:2861 msgid "" "Various software or data exist in the repositories where the FreeBSD project " "has been granted a special license to be able to use them. A case in point " "are the Terminus fonts for use with man:vt[4]. Here the author Dimitar " "Zhekov has allowed us to use the \"Terminus BSD Console\" font under a 2-" "clause BSD license rather than the regular Open Font License he normally " "uses." msgstr "" "Различное программное обеспечение или данные существуют в репозиториях, где " "проект FreeBSD получил специальную лицензию для их использования. Примером " "могут служить шрифты Terminus для использования с man:vt[4]. Здесь автор " "Димитар Жеков разрешил нам использовать шрифт \"Terminus BSD Console\" под " "лицензией BSD с двумя пунктами, а не под обычной Open Font License, которую " "он обычно применяет." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2857 +#: documentation/content/en/articles/committers-guide/_index.adoc:2866 msgid "" "It is clearly sensible to keep a record of any such license grants. To that " "end, the {core-email} has decided to keep an archive of them. Whenever the " "FreeBSD project is granted a special license we require the {core-email} to " "be notified. Any developers involved in arranging such a license grant, " "please send details to the {core-email} including:" msgstr "" "Очевидно, разумно вести учет всех подобных разрешений лицензий. С этой целью " "{core-email} решил сохранять их архив. Каждый раз, когда проекту FreeBSD " "предоставляется специальная лицензия, мы требуем уведомлять {core-email}. " "Разработчики, участвующие в организации такого разрешения, пожалуйста, " "присылайте детали на {core-email}, включая:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2859 +#: documentation/content/en/articles/committers-guide/_index.adoc:2868 msgid "" "Contact details for people or organizations granting the special license." msgstr "" "Контактные данные лиц или организаций, предоставляющих специальную лицензию." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2860 +#: documentation/content/en/articles/committers-guide/_index.adoc:2869 msgid "" "What files, directories etc. in the repositories are covered by the license " "grant including the revision numbers where any specially licensed material " "was committed." msgstr "" "Какие файлы, каталоги и т.д. в репозиториях охватываются предоставлением " "лицензии, включая номера ревизий, в которые был добавлен любой материал с " "особыми условиями лицензирования." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2861 +#: documentation/content/en/articles/committers-guide/_index.adoc:2870 msgid "" "The date the license comes into effect from. Unless otherwise agreed, this " "will be the date the license was issued by the authors of the software in " "question." msgstr "" "Дата вступления лицензии в силу. Если не согласовано иное, это будет дата " "выдачи лицензии авторами соответствующего программного обеспечения." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2862 +#: documentation/content/en/articles/committers-guide/_index.adoc:2871 msgid "The license text." msgstr "Текст лицензии." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2863 +#: documentation/content/en/articles/committers-guide/_index.adoc:2872 msgid "" "A note of any restrictions, limitations or exceptions that apply " "specifically to FreeBSD's usage of the licensed material." msgstr "" "Примечание о любых ограничениях, исключениях или особых условиях, которые " "применяются конкретно к использованию лицензионных материалов в FreeBSD." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2864 +#: documentation/content/en/articles/committers-guide/_index.adoc:2873 msgid "Any other relevant information." msgstr "Любая другая соответствующая информация." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2867 +#: documentation/content/en/articles/committers-guide/_index.adoc:2876 msgid "" "Once the {core-email} is satisfied that all the necessary details have been " "gathered and are correct, the secretary will send a PGP-signed " "acknowledgment of receipt including the license details. This receipt will " "be persistently archived and serve as our permanent record of the license " "grant." msgstr "" "Как только {core-email} убедится, что собраны все необходимые данные и они " "корректны, секретарь отправит подтверждение о получении, подписанное PGP, " "включая детали лицензии. Это подтверждение будет постоянно архивироваться и " "служить нашим постоянным свидетельством о предоставлении лицензии." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2870 +#: documentation/content/en/articles/committers-guide/_index.adoc:2879 msgid "" "The license archive should contain only details of license grants; this is " "not the place for any discussions around licensing or other subjects. " "Access to data within the license archive will be available on request to " "the {core-email}." msgstr "" "Архив лицензий должен содержать только сведения о предоставленных лицензиях; " "это не место для обсуждений вопросов лицензирования или других тем. Доступ к " "данным в архиве лицензий будет предоставляться по запросу в {core-email}." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2872 +#: documentation/content/en/articles/committers-guide/_index.adoc:2881 #, no-wrap msgid "SPDX Tags in the tree" msgstr "Теги SPDX в дереве" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2883 +#: documentation/content/en/articles/committers-guide/_index.adoc:2892 msgid "" "The project uses https://spdx.dev[SPDX] tags in our source base. At " "present, these tags are indented to help automated tools reconstruct license " "requirements mechanically. All _SPDX-License-Identifier_ tags in the tree " "should be considered to be informative. All files in the FreeBSD source " "tree with these tags also have a copy of the license which governs use of " "that file. In the event of a discrepancy, the verbatim license is " "controlling. The project tries to follow the https://spdx.github.io/spdx-" "spec/v2.2.2/[SPDX Specification, Version 2.2]. How to mark source files and " "valid algebraic expressions are found in https://spdx.github.io/spdx-spec/" "v2.2.2/SPDX-license-expressions/[Annex D] and https://spdx.github.io/spdx-" "spec/v2.2.2/using-SPDX-short-identifiers-in-source-files/[Annex E]. The " "project draws identifiers from SPDX's list of valid https://spdx.org/" "licenses/[short license identifiers]. The project uses only the _SPDX-" "License-Identifier_ tag." msgstr "" "Проект использует теги https://spdx.dev[SPDX] в нашей исходной базе. На " "данный момент эти теги выделены отступами, чтобы автоматизированные средства " "могли программно извлекать лицензионные условия. Все теги _SPDX-License-" "Identifier_ в дереве следует считать информативными. Все файлы в дереве " "исходных кодов FreeBSD с этими тегами также содержат копию лицензии, " "регулирующей использование данного файла. Если возникает противоречие, " "руководствоваться следует дословным текстом лицензии. Проект старается " "следовать https://spdx.github.io/spdx-spec/v2.2.2/[Спецификации SPDX, версия " "2.2]. Инструкцию, как помечать исходные файлы, и допустимые алгебраические " -"выражения можно найти в https://spdx.github.io/spdx-spec/v2.2.2/" -"SPDX-license-expressions/[Приложении D] и https://spdx.github.io/spdx-spec/v2" -".2.2/using-SPDX-short-identifiers-in-source-files/[Приложении E]. Проект " -"берет идентификаторы из списка допустимых https://spdx.org/licenses/[кратких " +"выражения можно найти в https://spdx.github.io/spdx-spec/v2.2.2/SPDX-license-" +"expressions/[Приложении D] и https://spdx.github.io/spdx-spec/v2.2.2/using-" +"SPDX-short-identifiers-in-source-files/[Приложении E]. Проект берет " +"идентификаторы из списка допустимых https://spdx.org/licenses/[кратких " "лицензионных идентификаторов] SPDX. Проект использует только тег _SPDX-" "License-Identifier_." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2885 +#: documentation/content/en/articles/committers-guide/_index.adoc:2894 msgid "" "As of March 2021, approximately 25,000 out of 90,000 files in the tree have " "been marked." msgstr "" "По состоянию на март 2021 года примерно 25 000 из 90 000 файлов в дереве " "были помечены." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2886 +#: documentation/content/en/articles/committers-guide/_index.adoc:2895 #, no-wrap msgid "Developer Relations" msgstr "Отношения с разработчиками" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2892 +#: documentation/content/en/articles/committers-guide/_index.adoc:2901 msgid "" "When working directly on your own code or on code which is already well " "established as your responsibility, then there is probably little need to " "check with other committers before jumping in with a commit. When working " "on a bug in an area of the system which is clearly orphaned (and there are a " "few such areas, to our shame), the same applies. When modifying parts of " "the system which are maintained, formally or informally, consider asking for " "a review just as a developer would have before becoming a committer. For " "ports, contact the listed `MAINTAINER` in the [.filename]#Makefile#." msgstr "" "При работе непосредственно с вашим собственным кодом или с кодом, который " "уже хорошо зарекомендовал себя как ваша зона ответственности, вероятно, нет " "особой необходимости согласовывать действия с другими коммиттерами перед " "внесением изменений. Это же относится и к исправлению ошибок в явно " "заброшенных частях системы (к сожалению, такие области существуют). При " -"изменении частей системы, которые поддерживаются (формально или неформально)" -", рассмотрите возможность запроса рецензирования, как это делал бы " -"разработчик до получения прав коммиттера. Для портов свяжитесь с " +"изменении частей системы, которые поддерживаются (формально или " +"неформально), рассмотрите возможность запроса рецензирования, как это делал " +"бы разработчик до получения прав коммиттера. Для портов свяжитесь с " "сопровождающим, указанным в переменной `MAINTAINER` в файле [." "filename]#Makefile#." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2896 +#: documentation/content/en/articles/committers-guide/_index.adoc:2905 msgid "" "To determine if an area of the tree is maintained, check the MAINTAINERS " "file at the root of the tree. If nobody is listed, scan the revision " "history to see who has committed changes in the past. To list the names and " "email addresses of all commit authors for a given file in the last 2 years " "and the number of commits each has authored, ordered by descending number of " "commits, use:" msgstr "" "Чтобы определить, поддерживается ли определённая часть дерева, проверьте " "файл MAINTAINERS в корне дерева. Если там никого не указано, просмотрите " "историю изменений, чтобы увидеть, кто вносил изменения в прошлом. Чтобы " "вывести список имён и адресов электронной почты всех авторов коммитов для " "заданного файла за последние 2 года, а также количество коммитов каждого " "автора, отсортированных по убыванию количества коммитов, используйте:" #. type: delimited block - 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2900 +#: documentation/content/en/articles/committers-guide/_index.adoc:2909 #, no-wrap msgid "% git -C /path/to/repo shortlog -sne --since=\"2 years\" -- relative/path/to/file\n" msgstr "% git -C /path/to/repo shortlog -sne --since=\"2 years\" -- relative/path/to/file\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2903 +#: documentation/content/en/articles/committers-guide/_index.adoc:2912 msgid "" "If queries go unanswered or the committer otherwise indicates a lack of " "interest in the area affected, go ahead and commit it." msgstr "" "Если запросы остаются без ответа или коммиттер иным образом демонстрирует " "отсутствие интереса к затронутой области, можно смело выполнять коммит." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2908 +#: documentation/content/en/articles/committers-guide/_index.adoc:2917 msgid "" "Avoid sending private emails to maintainers. Other people might be " "interested in the conversation, not just the final output." msgstr "" "Избегайте отправки личных писем сопровождающим. Других людей может " "заинтересовать не только итоговый результат, но и обсуждение." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2914 +#: documentation/content/en/articles/committers-guide/_index.adoc:2923 msgid "" "If there is any doubt about a commit for any reason at all, have it reviewed " "before committing. Better to have it flamed then and there rather than when " "it is part of the repository. If a commit does results in controversy " "erupting, it may be advisable to consider backing the change out again until " "the matter is settled. Remember, with a version control system we can " "always change it back." msgstr "" "Если есть какие-либо сомнения относительно коммита по любой причине, " "необходимо провести его рецензирование перед выполнением. Лучше получить " "критику сразу, чем когда он станет частью репозитория. Если коммит вызывает " "споры, возможно, стоит рассмотреть возможность отката изменений до " "разрешения вопроса. Помните, что с системой контроля версий мы всегда можем " "вернуть всё обратно." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2918 +#: documentation/content/en/articles/committers-guide/_index.adoc:2927 msgid "" "Do not impugn the intentions of others. If they see a different solution to " "a problem, or even a different problem, it is probably not because they are " "stupid, because they have questionable parentage, or because they are trying " "to destroy hard work, personal image, or FreeBSD, but basically because they " "have a different outlook on the world. Different is good." msgstr "" "Не оспаривайте намерения других. Если они видят иное решение проблемы или " "даже иную проблему, скорее всего, это не потому, что они глупы, имеют " "сомнительное происхождение или пытаются разрушить чужой труд, личный имидж " "или FreeBSD, а просто потому, что у них иной взгляд на мир. Разное — это " "хорошо." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2921 +#: documentation/content/en/articles/committers-guide/_index.adoc:2930 msgid "" "Disagree honestly. Argue your position from its merits, be honest about any " "shortcomings it may have, and be open to seeing their solution, or even " "their vision of the problem, with an open mind." msgstr "" "Честно выражайте несогласие. Обосновывайте свою позицию по её достоинствам, " "будьте честны относительно возможных недостатков и будьте открыты для " "понимания их решения или даже их видения проблемы." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2927 +#: documentation/content/en/articles/committers-guide/_index.adoc:2936 msgid "" "Accept correction. We are all fallible. When you have made a mistake, " "apologize and get on with life. Do not beat up yourself, and certainly do " "not beat up others for your mistake. Do not waste time on embarrassment or " "recrimination, just fix the problem and move on." msgstr "" "Примите исправление. Все мы не безгрешны. Когда вы совершили ошибку, " "извинитесь и продолжайте жить дальше. Не корите себя и уж тем более не " "вините других за свою ошибку. Не тратьте время на смущение или взаимные " "обвинения — просто исправьте проблему и двигайтесь дальше." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2931 +#: documentation/content/en/articles/committers-guide/_index.adoc:2940 msgid "" "Ask for help. Seek out (and give) peer reviews. One of the ways open " "source software is supposed to excel is in the number of eyeballs applied to " "it; this does not apply if nobody will review code." msgstr "" "Попросите о помощи. Ищите (и предоставляйте) рецензии коллег. Одно из " "преимуществ открытого программного обеспечения заключается в большом " "количестве проверяющих; но это не работает, если никто не проверяет код." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2933 +#: documentation/content/en/articles/committers-guide/_index.adoc:2942 #, no-wrap msgid "If in Doubt..." msgstr "Если сомневаетесь..." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2937 +#: documentation/content/en/articles/committers-guide/_index.adoc:2946 msgid "" "When unsure about something, whether it be a technical issue or a project " "convention be sure to ask. If you stay silent you will never make progress." msgstr "" "Если вы в чем-то не уверены, будь то технический вопрос или соглашение по " "проекту, обязательно спросите. Если вы промолчите, вы никогда не " "продвинетесь вперед." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2941 +#: documentation/content/en/articles/committers-guide/_index.adoc:2950 msgid "" "If it relates to a technical issue ask on the public mailing lists. Avoid " "the temptation to email the individual person that knows the answer. This " "way everyone will be able to learn from the question and the answer." msgstr "" "Если вопрос связан с технической проблемой, задайте его в публичных списках " "рассылки. Удержитесь от соблазна написать лично тому, кто знает ответ. Так " "каждый сможет извлечь пользу из вопроса и ответа." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2943 +#: documentation/content/en/articles/committers-guide/_index.adoc:2952 msgid "For project specific or administrative questions ask, in order:" msgstr "" "Для административных вопросов и вопросов, связанных с конкретным проектом, " "обращайтесь в следующем порядке:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2945 +#: documentation/content/en/articles/committers-guide/_index.adoc:2954 msgid "Your mentor or former mentor." msgstr "Ваш наставник или бывший наставник." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2946 +#: documentation/content/en/articles/committers-guide/_index.adoc:2955 msgid "An experienced committer on IRC, email, etc." msgstr "Опытный коммиттер — по IRC, электронной почте и т.д." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2947 +#: documentation/content/en/articles/committers-guide/_index.adoc:2956 msgid "Any team with a \"hat\", as they can give you a definitive answer." msgstr "" "Любая команда с ролью (\"hat\"), так как в ней вам могут дать окончательный " "ответ." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2948 +#: documentation/content/en/articles/committers-guide/_index.adoc:2957 msgid "If still not sure, ask on {developers-name}." msgstr "Если всё ещё не уверены, спросите на {developers-name}." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2950 +#: documentation/content/en/articles/committers-guide/_index.adoc:2959 msgid "" "Once your question is answered, if no one pointed you to documentation that " "spelled out the answer to your question, document it, as others will have " "the same question." msgstr "" "Когда ваш вопрос будет решён, если никто не указал вам на документацию, " "содержащую ответ на ваш вопрос, задокументируйте его, так как у других " "возникнет тот же вопрос." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2952 +#: documentation/content/en/articles/committers-guide/_index.adoc:2961 #, no-wrap msgid "Bugzilla" msgstr "Bugzilla" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2957 +#: documentation/content/en/articles/committers-guide/_index.adoc:2966 msgid "" "The FreeBSD Project utilizes Bugzilla for tracking bugs and change " "requests. If you commit a fix or suggestion found in the PR database, be " "sure to close the PR. It is also considered nice if you take time to close " "any other PRs associated with your commits." msgstr "" "Проект FreeBSD использует Bugzilla для отслеживания ошибок и запросов на " "изменения. Если вы исправили проблему или реализовали предложение из базы " "данных PR, обязательно закройте PR. Также будет вежливо, если вы найдёте " "время закрыть другие PR, связанные с вашими коммитами." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2959 +#: documentation/content/en/articles/committers-guide/_index.adoc:2968 msgid "" "Committers with non-``FreeBSD.org`` Bugzilla accounts can have the old " "account merged with the `FreeBSD.org` account by following these steps:" msgstr "" "Коммиттеры с учётными записями Bugzilla не на ``FreeBSD.org`` могут " "объединить старую учётную запись с учётной записью `FreeBSD.org`, выполнив " "следующие шаги:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2963 +#: documentation/content/en/articles/committers-guide/_index.adoc:2972 msgid "Log in using your old account." msgstr "Войдите, используя старую учетную запись." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2964 +#: documentation/content/en/articles/committers-guide/_index.adoc:2973 msgid "" "Open new bug. Choose `Services` as the Product, and `Bug Tracker` as the " "Component. In bug description list accounts you wish to be merged." msgstr "" "Открыть новую ошибку. Выбрать `Services` в качестве продукта и `Bug Tracker` " "в качестве компонента. В описании ошибки перечислите аккаунты, которые нужно " "объединить." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2966 +#: documentation/content/en/articles/committers-guide/_index.adoc:2975 msgid "" "Log in using `FreeBSD.org` account and post comment to newly opened bug to " "confirm ownership. See crossref:committers-guide[kerberos-ldap, Kerberos and " "LDAP web Password for FreeBSD Cluster] for more details on how to generate " "or set a password for your `FreeBSD.org` account." msgstr "" "Войдите, используя учетную запись `FreeBSD.org`, и оставьте комментарий к " "только что созданной ошибке, чтобы подтвердить владение. Дополнительные " "сведения о том, как сгенерировать или установить пароль для вашей учетной " "записи `FreeBSD.org`, см. в crossref:committers-guide[kerberos-ldap, " "Kerberos и LDAP веб-пароль для кластера FreeBSD]." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2967 +#: documentation/content/en/articles/committers-guide/_index.adoc:2976 msgid "" "If there are more than two accounts to merge, post comments from each of " "them." msgstr "" "Если необходимо объединить более двух учетных записей, оставьте комментарии " "от каждой из них." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2970 +#: documentation/content/en/articles/committers-guide/_index.adoc:2979 msgid "You can find out more about Bugzilla at:" msgstr "Вы можете узнать больше о Bugzilla на:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2972 +#: documentation/content/en/articles/committers-guide/_index.adoc:2981 msgid "extref:{pr-guidelines}[FreeBSD Problem Report Handling Guidelines]" msgstr "" "extref:{pr-guidelines}[Рекомендации по работе с сообщениями о проблемах " "FreeBSD]" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2973 +#: documentation/content/en/articles/committers-guide/_index.adoc:2982 msgid "link:https://www.FreeBSD.org/support/[https://www.FreeBSD.org/support]" msgstr "link:https://www.FreeBSD.org/support/[https://www.FreeBSD.org/support]" #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2975 +#: documentation/content/en/articles/committers-guide/_index.adoc:2984 #, no-wrap msgid "Phabricator" msgstr "Phabricator" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2979 +#: documentation/content/en/articles/committers-guide/_index.adoc:2988 msgid "" "The FreeBSD Project utilizes https://reviews.freebsd.org[Phabricator] for " "code review requests. See the https://wiki.freebsd.org/" "Phabricator[Phabricator wiki page] for details." msgstr "" "Проект FreeBSD использует https://reviews.freebsd.org[Phabricator] для " "запросов на рецензирование кода. Подробности можно найти на https://wiki." "freebsd.org/Phabricator[странице Phabricator в вики]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2982 +#: documentation/content/en/articles/committers-guide/_index.adoc:2991 msgid "" "Please use the `git arc` command provided by `devel/freebsd-git-devtools` " "(install the port or package, then type `git help arc` for documentation) to " "create and update Phabricator reviews. This will make it easier for others " "to review and test your patches." msgstr "" "Пожалуйста, используйте команду `git arc`, предоставляемую `devel/freebsd-" "git-devtools` (установите порт или пакет, затем введите `git help arc` для " "получения документации), для создания и обновления рецензий в Phabricator. " "Это упростит другим процесс проверки и тестирования ваших патчей." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:2984 +#: documentation/content/en/articles/committers-guide/_index.adoc:2993 msgid "" "Committers with non-``FreeBSD.org`` Phabricator accounts can have the old " "account renamed to the ``FreeBSD.org`` account by following these steps:" msgstr "" "Коммиттеры с учётными записями Phabricator не на ``FreeBSD.org`` могут " "переименовать старую учётную запись в ``FreeBSD.org``, выполнив следующие " "шаги:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2988 +#: documentation/content/en/articles/committers-guide/_index.adoc:2997 msgid "Change your Phabricator account email to your `FreeBSD.org` email." msgstr "" "Измените адрес электронной почты вашей учетной записи Phabricator на ваш " "`FreeBSD.org` email." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2990 +#: documentation/content/en/articles/committers-guide/_index.adoc:2999 msgid "" "Open new bug on our bug tracker using your `FreeBSD.org` account, see " "crossref:committers-guide[bugzilla, Bugzilla] for more information. Choose " "`Services` as the Product, and `Code Review` as the Component. In bug " "description request that your Phabricator account be renamed, and provide a " "link to your Phabricator user. For example, `https://reviews.freebsd.org/p/" "bob_example.com/`" msgstr "" "Открыть новую ошибку в нашем трекере ошибок, используя вашу учетную запись " "`FreeBSD.org`, см. crossref:committers-guide[bugzilla, Bugzilla] для " "получения дополнительной информации. Выберите `Services` в качестве продукта " "и `Code Review` в качестве компонента. В описании ошибки запросите " "переименование вашей учетной записи Phabricator и укажите ссылку на вашего " "пользователя Phabricator. Например, `https://reviews.freebsd.org/p/" "bob_example.com/`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:2995 +#: documentation/content/en/articles/committers-guide/_index.adoc:3004 msgid "" "Phabricator accounts cannot be merged, please do not open a new account." msgstr "" "Учетные записи Phabricator не могут быть объединены, пожалуйста, не " "создавайте новую учетную запись." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:2998 +#: documentation/content/en/articles/committers-guide/_index.adoc:3007 #, no-wrap msgid "Who's Who" msgstr "Кто есть кто" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3001 +#: documentation/content/en/articles/committers-guide/_index.adoc:3010 msgid "" "Besides the repository meisters, there are other FreeBSD project members and " "teams whom you will probably get to know in your role as a committer. " "Briefly, and by no means all-inclusively, these are:" msgstr "" "Помимо хранителей репозиториев, есть и другие участники проекта FreeBSD и " "команды, с которыми вам, скорее всего, предстоит познакомиться в роли " "коммиттера. Кратко и далеко не исчерпывающе, вот они:" #. type: Labeled list -#: documentation/content/en/articles/committers-guide/_index.adoc:3002 +#: documentation/content/en/articles/committers-guide/_index.adoc:3011 #, no-wrap msgid "`{doceng}`" msgstr "`{doceng}`" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3008 +#: documentation/content/en/articles/committers-guide/_index.adoc:3017 msgid "" "doceng is the group responsible for the documentation build infrastructure, " "approving new documentation committers, and ensuring that the FreeBSD " "website and documentation on the FTP site is up to date with respect to the " "Subversion tree. It is not a conflict resolution body. The vast majority " "of documentation related discussion takes place on the {freebsd-doc}. More " "details regarding the doceng team can be found in its https://www.FreeBSD." "org/internal/doceng/[charter]. Committers interested in contributing to the " "documentation should familiarize themselves with the extref:{fdp-primer}" "[Documentation Project Primer]." msgstr "" "doceng — это группа, ответственная за инфраструктуру сборки документации, " "утверждение новых коммиттеров документации и обеспечение актуальности веб-" "сайта FreeBSD и документации на FTP-сайте в соответствии с деревом " "Subversion. Она не является органом по разрешению конфликтов. Подавляющее " "большинство обсуждений, связанных с документацией, происходит в рассылке " "{freebsd-doc}. Подробнее о команде doceng можно узнать в её https://www." "FreeBSD.org/internal/doceng/[уставе]. Коммиттеры, заинтересованные в работе " -"над документацией, должны ознакомиться с руководством extref:{fdp-primer}[" -"Проект документации FreeBSD: введение для новых участников]." +"над документацией, должны ознакомиться с руководством extref:{fdp-primer}" +"[Проект документации FreeBSD: введение для новых участников]." #. type: Labeled list -#: documentation/content/en/articles/committers-guide/_index.adoc:3009 +#: documentation/content/en/articles/committers-guide/_index.adoc:3018 #, no-wrap msgid "`{re-members}`" msgstr "`{re-members}`" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3014 +#: documentation/content/en/articles/committers-guide/_index.adoc:3023 msgid "" "These are the members of the `{re}`. This team is responsible for setting " "release deadlines and controlling the release process. During code freezes, " "the release engineers have final authority on all changes to the system for " "whichever branch is pending release status. If there is something you want " "merged from FreeBSD-CURRENT to FreeBSD-STABLE (whatever values those may " "have at any given time), these are the people to talk to about it." msgstr "" "Вот члены команды `{re}`. Эта команда отвечает за установку сроков выпуска и " "контроль процесса выпуска. Во время заморозки кода, инженеры выпуска " "обладают окончательным правом принятия решений по всем изменениям в системе " "для ветки, ожидающей статуса выпуска. Если у вас есть что-то, что вы хотите " "влить (merge) из FreeBSD-CURRENT в FreeBSD-STABLE (какими бы ни были их " "значения в любой момент времени), именно с этими людьми нужно обсудить этот " "вопрос." #. type: Labeled list -#: documentation/content/en/articles/committers-guide/_index.adoc:3015 +#: documentation/content/en/articles/committers-guide/_index.adoc:3024 #, no-wrap msgid "`{so}`" msgstr "`{so}`" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3017 +#: documentation/content/en/articles/committers-guide/_index.adoc:3026 msgid "" "`{so-name}` is the link:https://www.FreeBSD.org/security/[FreeBSD Security " "Officer] and oversees the `{security-officer}`." msgstr "" "`{so-name}` — это link:https://www.FreeBSD.org/security/[ответственный за " "безопасность FreeBSD], который курирует работу `{security-officer}`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3022 +#: documentation/content/en/articles/committers-guide/_index.adoc:3031 msgid "" "{committers-name}:: {dev-src-all}, {dev-ports-all} and {dev-doc-all} are the " "mailing lists that the version control system uses to send commit messages " "to. _Never_ send email directly to these lists. Only send replies to this " "list when they are short and are directly related to a commit." msgstr "" "{committers-name}:: {dev-src-all}, {dev-ports-all} и {dev-doc-all} — это " "списки рассылки, которые система управления версиями использует для отправки " "сообщений о коммитах. _Никогда_ не отправляйте письма напрямую в эти списки. " "Отправляйте ответы в этот список только в том случае, если они короткие и " "непосредственно связаны с коммитом." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3027 +#: documentation/content/en/articles/committers-guide/_index.adoc:3036 msgid "" "{developers-name}:: All committers are subscribed to -developers. This list " "was created to be a forum for the committers \"community\" issues. Examples " "are Core voting, announcements, etc." msgstr "" "{developers-name}:: Все коммиттеры подписаны на список рассылки -developers. " "Этот список был создан для обсуждения вопросов, связанных с сообществом " "коммиттеров. Примеры включают голосования Core, объявления и т.д." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3031 +#: documentation/content/en/articles/committers-guide/_index.adoc:3040 msgid "" "The {developers-name} is for the exclusive use of FreeBSD committers. To " "develop FreeBSD, committers must have the ability to openly discuss matters " "that will be resolved before they are publicly announced. Frank discussions " "of work in progress are not suitable for open publication and may harm " "FreeBSD." msgstr "" "`{developers-name}` предназначен исключительно для использования " "коммиттерами FreeBSD. Для разработки FreeBSD коммиттеры должны иметь " "возможность открыто обсуждать вопросы, которые будут решены до их публичного " "объявления. Откровенные обсуждения работы в процессе не подходят для " "открытой публикации и могут навредить FreeBSD." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3035 +#: documentation/content/en/articles/committers-guide/_index.adoc:3044 msgid "" "All FreeBSD committers are expected not to not publish or forward messages " "from the {developers-name} outside the list membership without permission of " "all of the authors. Violators will be removed from the {developers-name}, " "resulting in a suspension of commit privileges. Repeated or flagrant " "violations may result in permanent revocation of commit privileges." msgstr "" "Все коммиттеры FreeBSD обязаны не публиковать и не пересылать сообщения из " "{developers-name} за пределы списка рассылки без разрешения всех авторов. " "Нарушители будут удалены из {developers-name}, что приведёт к приостановке " "привилегий на коммит. Повторные или вопиющие нарушения могут привести к " "постоянному лишению привилегий на коммит." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3041 +#: documentation/content/en/articles/committers-guide/_index.adoc:3050 msgid "" "This list is _not_ intended as a place for code reviews or for any technical " "discussion. In fact using it as such hurts the FreeBSD Project as it gives " "a sense of a closed list where general decisions affecting all of the " "FreeBSD using community are made without being \"open\". Last, but not " "least __never, never ever, email the {developers-name} and CC:/BCC: another " "FreeBSD list__. Never, ever email another FreeBSD email list and CC:/BCC: " "the {developers-name}. Doing so can greatly diminish the benefits of this " "list." msgstr "" "Этот список _не_ предназначен для обзора кода или каких-либо технических " "обсуждений. На самом деле, использование его в таком качестве вредит проекту " "FreeBSD, так как создаёт впечатление закрытого списка, где общие решения, " "затрагивающие всех пользователей FreeBSD, принимаются без \"открытости\". И " "последнее, но не менее важное: __никогда, ни при каких обстоятельствах, не " "отправляйте письмо на {developers-name} с копией (CC:/BCC:) на другой список " "FreeBSD__. Никогда не отправляйте письмо на другой список рассылки FreeBSD с " "копией (CC:/BCC:) на {developers-name}. Это может значительно снизить пользу " "от данного списка." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3042 +#: documentation/content/en/articles/committers-guide/_index.adoc:3051 #, no-wrap msgid "SSH Quick-Start Guide" msgstr "Руководство по быстрому началу работы с SSH" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3047 +#: documentation/content/en/articles/committers-guide/_index.adoc:3056 msgid "" "If you do not wish to type your password in every time you use man:ssh[1], " "and you use keys to authenticate, man:ssh-agent[1] is there for your " "convenience. If you want to use man:ssh-agent[1], make sure that you run it " "before running other applications. X users, for example, usually do this " "from their [.filename]#.xsession# or [.filename]#.xinitrc#. See man:ssh-" "agent[1] for details." msgstr "" "Если вы не хотите каждый раз вводить пароль при использовании man:ssh[1] и " "используете ключи для аутентификации, man:ssh-agent[1] создан для вашего " "удобства. Если вы хотите использовать man:ssh-agent[1], убедитесь, что " "запускаете его перед запуском других приложений. Например, пользователи X " "обычно делают это в [.filename]#.xsession# или [.filename]#.xinitrc#. " "Подробности см. в man:ssh-agent[1]." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3048 +#: documentation/content/en/articles/committers-guide/_index.adoc:3057 msgid "" "Generate a key pair using man:ssh-keygen[1]. The key pair will wind up in " "your [.filename]#$HOME/.ssh/# directory." msgstr "" "Сгенерируйте пару ключей с помощью man:ssh-keygen[1]. Пара ключей окажется в " "вашем каталоге [.filename]#$HOME/.ssh/#." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:3052 +#: documentation/content/en/articles/committers-guide/_index.adoc:3061 msgid "Only ECDSA, Ed25519 or RSA keys are supported." msgstr "Поддерживаются только ключи ECDSA, Ed25519 или RSA." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3054 +#: documentation/content/en/articles/committers-guide/_index.adoc:3063 msgid "" "Send your public key ([.filename]#$HOME/.ssh/id_ecdsa.pub#, [.filename]#" "$HOME/.ssh/id_ed25519.pub#, or [.filename]#$HOME/.ssh/id_rsa.pub#) to the " "person setting you up as a committer so it can be put into [." "filename]#yourlogin# in [.filename]#/etc/ssh-keys/# on `freefall`." msgstr "" "Отправьте ваш открытый ключ ([.filename]#$HOME/.ssh/id_ecdsa.pub#, [." "filename]#$HOME/.ssh/id_ed25519.pub# или [.filename]#$HOME/.ssh/id_rsa.pub#) " "человеку, который настраивает вас как коммиттера, чтобы его можно было " "добавить в [.filename]#yourlogin# в [.filename]#/etc/ssh-keys/# на " "`freefall`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3059 +#: documentation/content/en/articles/committers-guide/_index.adoc:3068 msgid "" "Now man:ssh-add[1] can be used for authentication once per session. It " "prompts for the private key's pass phrase, and then stores it in the " "authentication agent (man:ssh-agent[1]). Use `ssh-add -d` to remove keys " "stored in the agent." msgstr "" "Теперь man:ssh-add[1] можно использовать для аутентификации один раз за " "сеанс. Он запрашивает парольную фразу для закрытого ключа и затем сохраняет " "её в агенте аутентификации (man:ssh-agent[1]). Используйте `ssh-add -d` для " "удаления ключей, сохранённых в агенте." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3061 +#: documentation/content/en/articles/committers-guide/_index.adoc:3070 msgid "Test with a simple remote command: `ssh freefall.FreeBSD.org ls /usr`." msgstr "" -"Проверка с помощью простой удалённой команды: `ssh freefall.FreeBSD.org ls " -"/usr`." +"Проверка с помощью простой удалённой команды: `ssh freefall.FreeBSD.org ls /" +"usr`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3063 +#: documentation/content/en/articles/committers-guide/_index.adoc:3072 msgid "" "For more information, see package:security/openssh-portable[], man:ssh[1], " "man:ssh-add[1], man:ssh-agent[1], man:ssh-keygen[1], and man:scp[1]." msgstr "" "Для получения дополнительной информации см. package:security/openssh-" "portable[], man:ssh[1], man:ssh-add[1], man:ssh-agent[1], man:ssh-keygen[1] " "и man:scp[1]." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3065 +#: documentation/content/en/articles/committers-guide/_index.adoc:3074 msgid "" "For information on adding, changing, or removing man:ssh[1] keys, see " "https://wiki.freebsd.org/clusteradm/ssh-keys[this article]." msgstr "" "Для информации о добавлении, изменении или удалении ключей man:ssh[1], см. " "https://wiki.freebsd.org/clusteradm/ssh-keys[эту статью]." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3067 +#: documentation/content/en/articles/committers-guide/_index.adoc:3076 #, no-wrap msgid "Coverity(R) Availability for FreeBSD Committers" msgstr "Доступность Coverity(R) для коммиттеров FreeBSD" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3071 +#: documentation/content/en/articles/committers-guide/_index.adoc:3080 msgid "" "All FreeBSD developers can obtain access to Coverity analysis results of all " "FreeBSD Project software. All who are interested in obtaining access to the " "analysis results of the automated Coverity runs, can sign up at http://scan." "coverity.com/[Coverity Scan]." msgstr "" "Все разработчики FreeBSD могут получить доступ к результатам анализа " "Coverity для всего программного обеспечения проекта FreeBSD. Все, кто " "заинтересован в доступе к результатам автоматического анализа Coverity, " "могут зарегистрироваться на http://scan.coverity.com/[Coverity Scan]." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3074 +#: documentation/content/en/articles/committers-guide/_index.adoc:3083 msgid "" "The FreeBSD wiki includes a mini-guide for developers who are interested in " "working with the Coverity(R) analysis reports: https://wiki.freebsd.org/" "CoverityPrevent[https://wiki.freebsd.org/CoverityPrevent]. Please note that " "this mini-guide is only readable by FreeBSD developers, so if you cannot " "access this page, you will have to ask someone to add you to the appropriate " "Wiki access list." msgstr "" "В вики FreeBSD есть мини-руководство для разработчиков, которые " "заинтересованы в работе с отчетами анализа Coverity(R): https://wiki.freebsd." "org/CoverityPrevent[https://wiki.freebsd.org/CoverityPrevent]. Обратите " "внимание, что это мини-руководство доступно только разработчикам FreeBSD, " "поэтому если вы не можете открыть эту страницу, вам нужно будет попросить " "добавить вас в соответствующий список доступа к вики." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3076 +#: documentation/content/en/articles/committers-guide/_index.adoc:3085 msgid "" "Finally, all FreeBSD developers who are going to use Coverity(R) are always " "encouraged to ask for more details and usage information, by posting any " "questions to the mailing list of the FreeBSD developers." msgstr "" "Наконец, все разработчики FreeBSD, которые собираются использовать " "Coverity(R), всегда могут запросить дополнительные детали и информацию об " "использовании, задав любые вопросы в списке рассылки разработчиков FreeBSD." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3078 +#: documentation/content/en/articles/committers-guide/_index.adoc:3087 #, no-wrap msgid "The FreeBSD Committers' Big List of Rules" msgstr "Большой список правил коммиттеров FreeBSD" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3083 +#: documentation/content/en/articles/committers-guide/_index.adoc:3092 msgid "" "Everyone involved with the FreeBSD project is expected to abide by the _Code " "of Conduct_ available from link:https://www.FreeBSD.org/internal/code-of-" "conduct/[https://www.FreeBSD.org/internal/code-of-conduct]. As committers, " "you form the public face of the project, and how you behave has a vital " "impact on the public perception of it. This guide expands on the parts of " "the _Code of Conduct_ specific to committers." msgstr "" "Все участники проекта FreeBSD должны соблюдать _Кодекс поведения_, доступный " "по ссылке link:https://www.FreeBSD.org/internal/code-of-conduct/[https://www." "FreeBSD.org/internal/code-of-conduct]. Как коммиттеры, вы представляете " "публичное лицо проекта, и ваше поведение оказывает существенное влияние на " "его общественное восприятие. Это руководство расширяет разделы _Кодекса " "поведения_, относящиеся к коммиттерам." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3085 -#: documentation/content/en/articles/committers-guide/_index.adoc:3115 +#: documentation/content/en/articles/committers-guide/_index.adoc:3094 +#: documentation/content/en/articles/committers-guide/_index.adoc:3124 msgid "Respect other committers." msgstr "Уважайте других коммиттеров." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3086 -#: documentation/content/en/articles/committers-guide/_index.adoc:3131 +#: documentation/content/en/articles/committers-guide/_index.adoc:3095 +#: documentation/content/en/articles/committers-guide/_index.adoc:3140 msgid "Respect other contributors." msgstr "Уважайте других участников." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3087 -#: documentation/content/en/articles/committers-guide/_index.adoc:3146 +#: documentation/content/en/articles/committers-guide/_index.adoc:3096 +#: documentation/content/en/articles/committers-guide/_index.adoc:3155 msgid "Discuss any significant change _before_ committing." msgstr "Обсудите любые значительные изменения _перед_ коммитом." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3088 +#: documentation/content/en/articles/committers-guide/_index.adoc:3097 msgid "" "Respect existing maintainers (if listed in the `MAINTAINER` field in [." "filename]#Makefile# or in [.filename]#MAINTAINER# in the top-level " "directory)." msgstr "" "Уважайте существующих сопровождающих (если они указаны в поле `MAINTAINER` в " "файле [.filename]#Makefile# или в файле [.filename]#MAINTAINER# в корневом " "каталоге)." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3089 -#: documentation/content/en/articles/committers-guide/_index.adoc:3161 +#: documentation/content/en/articles/committers-guide/_index.adoc:3098 +#: documentation/content/en/articles/committers-guide/_index.adoc:3170 msgid "" "Any disputed change must be backed out pending resolution of the dispute if " "requested by a maintainer. Security related changes may override a " "maintainer's wishes at the Security Officer's discretion." msgstr "" "Любое оспариваемое изменение должно быть отменено до разрешения спора, если " "этого потребует сопровождающий. Изменения, связанные с безопасностью, могут " "перекрыть пожелания сопровождающего по усмотрению Ответственного за " "безопасность." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3090 +#: documentation/content/en/articles/committers-guide/_index.adoc:3099 msgid "" "Changes go to FreeBSD-CURRENT before FreeBSD-STABLE unless specifically " "permitted by the release engineer or unless they are not applicable to " "FreeBSD-CURRENT. Any non-trivial or non-urgent change which is applicable " "should also be allowed to sit in FreeBSD-CURRENT for at least 3 days before " "merging so that it can be given sufficient testing. The release engineer has " "the same authority over the FreeBSD-STABLE branch as outlined for the " "maintainer in rule #5." msgstr "" "Изменения попадают в FreeBSD-CURRENT до FreeBSD-STABLE, если только это явно " "не разрешено инженером выпуска или если они не применимы к FreeBSD-CURRENT. " "Любое нетривиальное или не срочное изменение, которое применимо, также " "должно оставаться в FreeBSD-CURRENT как минимум 3 дня перед слиянием, чтобы " "его можно было достаточно протестировать. Инженер выпуска имеет те же " "полномочия в отношении ветки FreeBSD-STABLE, что и сопровождающий, согласно " "правилу №5." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3091 -#: documentation/content/en/articles/committers-guide/_index.adoc:3176 +#: documentation/content/en/articles/committers-guide/_index.adoc:3100 +#: documentation/content/en/articles/committers-guide/_index.adoc:3185 msgid "Do not fight in public with other committers; it looks bad." msgstr "" "Не устраивайте публичные разборки с другими разработчиками; это выглядит " "плохо." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3092 +#: documentation/content/en/articles/committers-guide/_index.adoc:3101 msgid "" "Respect all code freezes and read the `committers` and `developers` mailing " "lists in a timely manner so you know when a code freeze is in effect." msgstr "" "Соблюдайте все периоды заморозки кода и своевременно читайте рассылки " "`committers` и `developers`, чтобы знать, когда действует заморозка кода." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3093 -#: documentation/content/en/articles/committers-guide/_index.adoc:3191 +#: documentation/content/en/articles/committers-guide/_index.adoc:3102 +#: documentation/content/en/articles/committers-guide/_index.adoc:3200 msgid "When in doubt on any procedure, ask first!" msgstr "Если сомневаетесь в каком-либо действии — сначала спросите!" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3094 -#: documentation/content/en/articles/committers-guide/_index.adoc:3196 +#: documentation/content/en/articles/committers-guide/_index.adoc:3103 +#: documentation/content/en/articles/committers-guide/_index.adoc:3205 msgid "Test your changes before committing them." msgstr "Проверьте свои изменения перед их применением." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3095 -#: documentation/content/en/articles/committers-guide/_index.adoc:3206 +#: documentation/content/en/articles/committers-guide/_index.adoc:3104 +#: documentation/content/en/articles/committers-guide/_index.adoc:3215 msgid "" "Do not commit to contributed software without _explicit_ approval from the " "respective maintainers." msgstr "" "Не вносите изменения в предоставленное программное обеспечение без _явного_ " "одобрения соответствующих сопровождающих." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3106 +#: documentation/content/en/articles/committers-guide/_index.adoc:3115 msgid "" "As noted, breaking some of these rules can be grounds for suspension or, " "upon repeated offense, permanent removal of commit privileges. Individual " "members of core have the power to temporarily suspend commit privileges " "until core as a whole has the chance to review the issue. In case of an " "\"emergency\" (a committer doing damage to the repository), a temporary " "suspension may also be done by the repository meisters. Only a 2/3 majority " "of core has the authority to suspend commit privileges for longer than a " "week or to remove them permanently. This rule does not exist to set core up " "as a bunch of cruel dictators who can dispose of committers as casually as " "empty soda cans, but to give the project a kind of safety fuse. If someone " "is out of control, it is important to be able to deal with this immediately " "rather than be paralyzed by debate. In all cases, a committer whose " "privileges are suspended or revoked is entitled to a \"hearing\" by core, " "the total duration of the suspension being determined at that time. A " "committer whose privileges are suspended may also request a review of the " "decision after 30 days and every 30 days thereafter (unless the total " "suspension period is less than 30 days). A committer whose privileges have " "been revoked entirely may request a review after a period of 6 months has " "elapsed. This review policy is _strictly informal_ and, in all cases, core " "reserves the right to either act on or disregard requests for review if they " "feel their original decision to be the right one." msgstr "" "Как уже отмечалось, нарушение некоторых из этих правил может стать " "основанием для временного лишения прав на коммиты или, при повторных " -"нарушениях, для их постоянного отзыва. Отдельные члены Основной Команды (" -"Core Team) имеют право временно приостановить права на коммиты до тех пор, " -"пока основная команда в полном составе не рассмотрит вопрос. В случае «" -"чрезвычайной ситуации» (например, если коммиттер наносит ущерб репозиторию), " -"временное лишение прав может также быть осуществлено хранителями " -"репозитория. Только Основная Команда 2/3 большинства голосов имеет право " -"приостановить права на коммиты сроком более чем на неделю или отозвать их " -"полностью. Это правило существует не для того, чтобы сделать основную " -"команду сборищем жестоких диктаторов, которые могут избавляться от " +"нарушениях, для их постоянного отзыва. Отдельные члены Основной Команды " +"(Core Team) имеют право временно приостановить права на коммиты до тех пор, " +"пока основная команда в полном составе не рассмотрит вопрос. В случае " +"«чрезвычайной ситуации» (например, если коммиттер наносит ущерб " +"репозиторию), временное лишение прав может также быть осуществлено " +"хранителями репозитория. Только Основная Команда 2/3 большинства голосов " +"имеет право приостановить права на коммиты сроком более чем на неделю или " +"отозвать их полностью. Это правило существует не для того, чтобы сделать " +"основную команду сборищем жестоких диктаторов, которые могут избавляться от " "коммиттеров так же легко, как от пустых банок из-под газировки, а чтобы дать " "проекту своего рода предохранительный клапан. Если кто-то выходит из-под " "контроля, важно иметь возможность немедленно принять меры, а не быть " "парализованными дискуссией. Во всех случаях коммиттер, чьи права " "приостановлены или отозваны, имеет право на «слушание» в основной команде, " "где определяется общая продолжительность приостановки. Коммиттер, чьи права " "приостановлены, также может запросить пересмотр решения через 30 дней и " "каждые 30 дней после этого (если общий срок приостановки не менее 30 дней). " "Коммиттер, чьи права были полностью отозваны, может запросить пересмотр по " "истечении 6 месяцев. Эта политика пересмотра _строго неформальна_, и во всех " "случаях основная команда оставляет за собой право как удовлетворить, так и " "проигнорировать запрос на пересмотр, если считает первоначальное решение " "правильным." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3110 +#: documentation/content/en/articles/committers-guide/_index.adoc:3119 msgid "" "In all other aspects of project operation, core is a subset of committers " "and is bound by the __same rules__. Just because someone is in core this " "does not mean that they have special dispensation to step outside any of the " "lines painted here; core's \"special powers\" only kick in when it acts as a " "group, not on an individual basis. As individuals, the core team members " "are all committers first and core second." msgstr "" "Во всех остальных аспектах работы проекта основная команда является " "подмножеством коммиттеров и связана __теми же правилами__. Тот факт, что кто-" "то входит в основную команду, не означает, что им позволено выходить за " "рамки обозначенных здесь границ; «особые полномочия» основной команды " "активируются только при действиях в качестве группы, а не индивидуально. Как " "отдельные лица, члены основной команды — это прежде всего коммиттеры, и " "только во вторую очередь — основная команда." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3111 +#: documentation/content/en/articles/committers-guide/_index.adoc:3120 #, no-wrap msgid "Details" msgstr "Подробности" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3119 +#: documentation/content/en/articles/committers-guide/_index.adoc:3128 msgid "" "This means that you need to treat other committers as the peer-group " "developers that they are. Despite our occasional attempts to prove the " "contrary, one does not get to be a committer by being stupid and nothing " "rankles more than being treated that way by one of your peers. Whether we " "always feel respect for one another or not (and everyone has off days), we " "still have to _treat_ other committers with respect at all times, on public " "forums and in private email." msgstr "" "Это означает, что вы должны относиться к другим коммиттерам как к коллегам-" "разработчикам, каковыми они и являются. Несмотря на наши периодические " "попытки доказать обратное, коммиттером не становятся по глупости, и ничто не " "раздражает больше, чем когда коллеги относятся к вам именно так. Независимо " "от того, испытываем ли мы всегда уважение друг к другу или нет (у всех " "бывают плохие дни), мы должны _относиться_ к другим коммиттерам с уважением " "всегда — как на публичных форумах, так и в личной переписке." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3121 +#: documentation/content/en/articles/committers-guide/_index.adoc:3130 msgid "" "Being able to work together long term is this project's greatest asset, one " "far more important than any set of changes to the code, and turning " "arguments about code into issues that affect our long-term ability to work " "harmoniously together is just not worth the trade-off by any conceivable " "stretch of the imagination." msgstr "" "Способность долгосрочного сотрудничества — это самое ценное достояние " "проекта, гораздо более важное, чем любые изменения в коде, и превращение " "споров о коде в проблемы, влияющие на нашу способность гармонично работать " "вместе, ни при каких обстоятельствах не стоит того." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3127 +#: documentation/content/en/articles/committers-guide/_index.adoc:3136 msgid "" "To comply with this rule, do not send email when you are angry or otherwise " "behave in a manner which is likely to strike others as needlessly " "confrontational. First calm down, then think about how to communicate in " "the most effective fashion for convincing the other persons that your side " "of the argument is correct, do not just blow off some steam so you can feel " "better in the short term at the cost of a long-term flame war. Not only is " "this very bad \"energy economics\", but repeated displays of public " "aggression which impair our ability to work well together will be dealt with " "severely by the project leadership and may result in suspension or " "termination of your commit privileges. The project leadership will take " "into account both public and private communications brought before it. It " "will not seek the disclosure of private communications, but it will take it " "into account if it is volunteered by the committers involved in the " "complaint." msgstr "" "Для соблюдения этого правила не отправляйте электронные письма, когда вы " "злитесь или ведёте себя таким образом, который может показаться другим " "излишне конфронтационным. Сначала успокойтесь, затем подумайте, как наиболее " "эффективно донести свою точку зрения, чтобы убедить других в своей правоте, " "а не просто выпустить пар для кратковременного облегчения за счёт " "долгосрочного конфликта. Иначе это обернётся не только крайне нерациональной " "тратой сил, но и тем, что повторяющиеся проявления публичной агрессии, " "мешающие нашей совместной работе, будут строго пресекаться руководством " "проекта и могут привести к приостановке или лишению ваших прав на коммит. " "Руководство проекта будет учитывать как публичные, так и приватные " "сообщения, представленные на его рассмотрение. Оно не будет требовать " "раскрытия приватной переписки, но примет её во внимание, если участники, " "вовлечённые в жалобу, предоставят её добровольно." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3130 +#: documentation/content/en/articles/committers-guide/_index.adoc:3139 msgid "" "All of this is never an option which the project's leadership enjoys in the " "slightest, but unity comes first. No amount of code or good advice is worth " "trading that away." msgstr "" "Всё это никогда не является вариантом, который руководство проекта хоть " "сколько-нибудь радует, но единство важнее. Никакое количество кода или " "полезных советов не стоит того, чтобы этим пожертвовать." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3143 +#: documentation/content/en/articles/committers-guide/_index.adoc:3152 msgid "" "You were not always a committer. At one time you were a contributor. " "Remember that at all times. Remember what it was like trying to get help " "and attention. Do not forget that your work as a contributor was very " "important to you. Remember what it was like. Do not discourage, belittle, " "or demean contributors. Treat them with respect. They are our committers in " "waiting. They are every bit as important to the project as committers. " "Their contributions are as valid and as important as your own. After all, " "you made many contributions before you became a committer. Always remember " "that." msgstr "" "Вы не всегда были коммиттером. Когда-то вы были контрибьютором. Помните об " "этом всегда. Вспомните, каково это — пытаться получить помощь и внимание. Не " "забывайте, что ваша работа в качестве контрибьютора была для вас очень " "важна. Вспомните, каково это. Не отговаривайте, не принижайте и не унижайте " "контрибьюторов. Относитесь к ним с уважением. Они — наши будущие коммиттеры. " "Они так же важны для проекта, как и коммиттеры. Их вклад так же важен и " "значим, как и ваш. В конце концов, вы сами сделали множество вкладов, прежде " "чем стали коммиттером. Всегда помните об этом." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3145 +#: documentation/content/en/articles/committers-guide/_index.adoc:3154 msgid "" "Consider the points raised under crossref:committers-guide[respect,Respect " "other committers] and apply them also to contributors." msgstr "" -"Учитывайте моменты, поднятые в разделе crossref:committers-guide[" -"respect,Уважайте других коммиттеров], и применяйте их также к контрибьюторам." +"Учитывайте моменты, поднятые в разделе crossref:committers-guide[respect," +"Уважайте других коммиттеров], и применяйте их также к контрибьюторам." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3152 +#: documentation/content/en/articles/committers-guide/_index.adoc:3161 msgid "" "The repository is not where changes are initially submitted for correctness " "or argued over, that happens first in the mailing lists or by use of the " "Phabricator service. The commit will only happen once something resembling " "consensus has been reached. This does not mean that permission is required " "before correcting every obvious syntax error or manual page misspelling, " "just that it is good to develop a feel for when a proposed change is not " "quite such a no-brainer and requires some feedback first. People really do " "not mind sweeping changes if the result is something clearly better than " "what they had before, they just do not like being _surprised_ by those " "changes. The very best way of making sure that things are on the right " "track is to have code reviewed by one or more other committers." msgstr "" "Репозиторий — это не место, где изменения первоначально отправляются на " "проверку корректности или обсуждаются, сначала это происходит в почтовых " "рассылках или с помощью сервиса Phabricator. Коммит произойдет только после " "того, как будет достигнуто некое подобие консенсуса. Это не означает, что " "требуется разрешение для исправления каждой очевидной синтаксической ошибки " "или опечатки на странице руководства, просто полезно развить чутьё, когда " "предлагаемое изменение не столь очевидно и требует предварительного " "обсуждения. Люди действительно не против масштабных изменений, если " "результат явно лучше того, что было раньше, им просто не нравится, когда эти " "изменения становятся _неожиданностью_. Самый лучший способ убедиться, что " "всё идёт по правильному пути, — это провести рецензирование кода одним или " "несколькими другими коммиттерами." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3154 +#: documentation/content/en/articles/committers-guide/_index.adoc:3163 msgid "When in doubt, ask for review!" msgstr "Если сомневаетесь, запросите рецензию!" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3155 +#: documentation/content/en/articles/committers-guide/_index.adoc:3164 msgid "Respect existing maintainers if listed." msgstr "Уважайте существующих сопровождающих, если они указаны." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3160 +#: documentation/content/en/articles/committers-guide/_index.adoc:3169 msgid "" "Many parts of FreeBSD are not \"owned\" in the sense that any specific " "individual will jump up and yell if you commit a change to \"their\" area, " "but it still pays to check first. One convention we use is to put a " "maintainer line in the [.filename]#Makefile# for any package or subtree " "which is being actively maintained by one or more people; see extref:" -"{developers-handbook}[Source Tree Guidelines and Policies, policies] for " -"documentation on this. Where sections of code have several maintainers, " +"{developers-handbook}policies[Source Tree Guidelines and Policies, policies] " +"for documentation on this. Where sections of code have several maintainers, " "commits to affected areas by one maintainer need to be reviewed by at least " "one other maintainer. In cases where the \"maintainer-ship\" of something " "is not clear, look at the repository logs for the files in question and see " "if someone has been working recently or predominantly in that area." msgstr "" "Многие части FreeBSD не \"являются чьей-то собственностью\" в том смысле, " "что конкретный человек вскочит и начнёт кричать, если вы внесёте изменения в " "\"его\" область, но всё же лучше сначала проверить. Одно из используемых " "соглашений — добавление строки `maintainer` в [.filename]#Makefile# для " "любого пакета или поддерева, за которые активно отвечает один или несколько " "людей; см. extref:{developers-handbook}policies[Рекомендации и политики " "дерева исходного кода, policies] для документации по этому поводу. Если у " "участков кода есть несколько сопровождающих, изменения в затронутых " "областях, внесённые одним сопровождающим, должны быть проверены хотя бы " "одним другим сопровождающим. В случаях, когда \"сопровождение\" чего-либо " "неясно, посмотрите логи репозитория для соответствующих файлов и проверьте, " "работал ли кто-то недавно или преимущественно в этой области." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3166 +#: documentation/content/en/articles/committers-guide/_index.adoc:3175 msgid "" "This may be hard to swallow in times of conflict (when each side is " "convinced that they are in the right, of course) but a version control " "system makes it unnecessary to have an ongoing dispute raging when it is far " "easier to simply reverse the disputed change, get everyone calmed down again " "and then try to figure out what is the best way to proceed. If the change " "turns out to be the best thing after all, it can be easily brought back. If " "it turns out not to be, then the users did not have to live with the bogus " "change in the tree while everyone was busily debating its merits. People " "_very_ rarely call for back-outs in the repository since discussion " "generally exposes bad or controversial changes before the commit even " "happens, but on such rare occasions the back-out should be done without " "argument so that we can get immediately on to the topic of figuring out " "whether it was bogus or not." msgstr "" "Это может быть трудно принять во время конфликтов (когда каждая сторона " "убеждена, что она права, конечно), но система контроля версий делает " "ненужным продолжение споров, когда гораздо проще просто отменить спорное " "изменение, успокоить всех и затем попытаться выяснить, как лучше поступить. " "Если окажется, что изменение всё-таки было правильным, его можно легко " "вернуть. Если же нет, то пользователям не придётся мириться с ошибочным " "изменением в дереве, пока все активно обсуждают его достоинства. Люди " "_очень_ редко требуют отмены изменений в репозитории, поскольку обсуждение " "обычно выявляет плохие или спорные изменения ещё до коммита, но в таких " "редких случаях отмена должна производиться без споров, чтобы можно было " "сразу перейти к выяснению, было ли изменение ошибочным или нет." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3167 +#: documentation/content/en/articles/committers-guide/_index.adoc:3176 msgid "" "Changes go to FreeBSD-CURRENT before FreeBSD-STABLE unless specifically " "permitted by the release engineer or unless they are not applicable to " "FreeBSD-CURRENT. Any non-trivial or non-urgent change which is applicable " "should also be allowed to sit in FreeBSD-CURRENT for at least 3 days before " "merging so that it can be given sufficient testing. The release engineer has " "the same authority over the FreeBSD-STABLE branch as outlined in rule #5." msgstr "" "Изменения вносятся в FreeBSD-CURRENT до FreeBSD-STABLE, если это не " "разрешено специально инженером выпуска или если они не применимы к FreeBSD-" "CURRENT. Любое нетривиальное или несрочное изменение, которое применимо, " "также должно оставаться в FreeBSD-CURRENT как минимум 3 дня перед слиянием, " "чтобы его можно было достаточно протестировать. Инженер выпуска имеет те же " "полномочия в отношении ветки FreeBSD-STABLE, как указано в правиле №5." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3173 +#: documentation/content/en/articles/committers-guide/_index.adoc:3182 msgid "" "This is another \"do not argue about it\" issue since it is the release " "engineer who is ultimately responsible (and gets beaten up) if a change " "turns out to be bad. Please respect this and give the release engineer your " "full cooperation when it comes to the FreeBSD-STABLE branch. The management " "of FreeBSD-STABLE may frequently seem to be overly conservative to the " "casual observer, but also bear in mind the fact that conservatism is " "supposed to be the hallmark of FreeBSD-STABLE and different rules apply " "there than in FreeBSD-CURRENT. There is also really no point in having " "FreeBSD-CURRENT be a testing ground if changes are merged over to FreeBSD-" "STABLE immediately. Changes need a chance to be tested by the FreeBSD-" "CURRENT developers, so allow some time to elapse before merging unless the " "FreeBSD-STABLE fix is critical, time sensitive or so obvious as to make " "further testing unnecessary (spelling fixes to manual pages, obvious bug/" "typo fixes, etc.) In other words, apply common sense." msgstr "" "Это ещё один вопрос, о котором не стоит спорить, поскольку инженер выпуска " "несёт окончательную ответственность (и получает по шапке), если изменение " "окажется неудачным. Пожалуйста, уважайте это и оказывайте инженеру выпуска " "полное сотрудничество, когда дело касается ветки FreeBSD-STABLE. Управление " "FreeBSD-STABLE может часто казаться излишне консервативным для случайного " "наблюдателя, но также стоит помнить, что консерватизм — это отличительная " "черта FreeBSD-STABLE, и там действуют другие правила, чем в FreeBSD-CURRENT. " "Также нет смысла в том, чтобы FreeBSD-CURRENT был испытательным полигоном, " "если изменения немедленно переносятся в FreeBSD-STABLE. Изменения должны " "быть протестированы разработчиками FreeBSD-CURRENT, поэтому дайте некоторое " "время перед слиянием, если только исправление в FreeBSD-STABLE не является " "критическим, срочным или настолько очевидным, что дальнейшее тестирование не " "требуется (исправления опечаток в руководствах, очевидные исправления ошибок/" "опечаток и т.д.). Другими словами, руководствуйтесь здравым смыслом." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3175 +#: documentation/content/en/articles/committers-guide/_index.adoc:3184 msgid "" "Changes to the security branches (for example, `releng/9.3`) must be " "approved by a member of the `{security-officer}`, or in some cases, by a " "member of the `{re}`." msgstr "" "Изменения в ветках безопасности (например, `releng/9.3`) должны быть " "одобрены членом группы — `{security-officer}` или, в некоторых случаях, " "членом группы — `{re}`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3186 +#: documentation/content/en/articles/committers-guide/_index.adoc:3195 msgid "" "This project has a public image to uphold and that image is very important " "to all of us, especially if we are to continue to attract new members. " "There will be occasions when, despite everyone's very best attempts at self-" "control, tempers are lost and angry words are exchanged. The best thing " "that can be done in such cases is to minimize the effects of this until " "everyone has cooled back down. Do not air angry words in public and do not " "forward private correspondence or other private communications to public " "mailing lists, mail aliases, instant messaging channels or social media " "sites. What people say one-to-one is often much less sugar-coated than what " "they would say in public, and such communications therefore have no place " "there - they only serve to inflame an already bad situation. If the person " "sending a flame-o-gram at least had the grace to send it privately, then " "have the grace to keep it private yourself. If you feel you are being " "unfairly treated by another developer, and it is causing you anguish, bring " "the matter up with core rather than taking it public. Core will do its best " "to play peace makers and get things back to sanity. In cases where the " "dispute involves a change to the codebase and the participants do not appear " "to be reaching an amicable agreement, core may appoint a mutually-agreeable " "third party to resolve the dispute. All parties involved must then agree to " "be bound by the decision reached by this third party." msgstr "" "Этот проект поддерживает публичный имидж, который очень важен для всех нас, " "особенно если мы хотим продолжать привлекать новых участников. Бывают " "случаи, когда, несмотря на все усилия сохранять самообладание, люди теряют " "терпение и обмениваются резкими словами. Лучшее, что можно сделать в таких " "ситуациях, — минимизировать последствия, пока все не остынут. Не выносите " "гневные слова на публику и не пересылайте личную переписку или другие " "частные сообщения в публичные списки рассылки, почтовые алиасы, каналы " "мгновенных сообщений или социальные сети. То, что люди говорят один на один, " "часто менее приукрашено, чем их публичные высказывания, и такие сообщения не " "имеют места в публичном пространстве — они только усугубляют и без того " "сложную ситуацию. Если человек, отправляющий гневное сообщение, хотя бы " "проявил такт и отправил его лично, проявите такт и вы — оставьте это в " "тайне. Если вы чувствуете, что другой разработчик относится к вам " -"несправедливо, и это причиняет вам страдания, обратитесь к Основной команде (" -"Core team), а не выносите это на публику. Основная команда постарается " +"несправедливо, и это причиняет вам страдания, обратитесь к Основной команде " +"(Core team), а не выносите это на публику. Основная команда постарается " "выступить в роли миротворцев и вернуть ситуацию в разумное русло. Если спор " "касается изменений в кодовой базе и участники не могут прийти к согласию, " "основная команда может назначить третью сторону, устраивающую всех, для " "разрешения спора. Все вовлечённые стороны должны согласиться с решением, " "принятым этой третьей стороной." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3187 +#: documentation/content/en/articles/committers-guide/_index.adoc:3196 msgid "" "Respect all code freezes and read the `committers` and `developers` mailing " "list on a timely basis so you know when a code freeze is in effect." msgstr "" "Соблюдайте все периоды заморозки кода и своевременно читайте рассылки " "`committers` и `developers`, чтобы знать, когда действует заморозка кода." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3190 +#: documentation/content/en/articles/committers-guide/_index.adoc:3199 msgid "" "Committing unapproved changes during a code freeze is a really big mistake " "and committers are expected to keep up-to-date on what is going on before " "jumping in after a long absence and committing 10 megabytes worth of " "accumulated stuff. People who abuse this on a regular basis will have their " "commit privileges suspended until they get back from the FreeBSD Happy " "Reeducation Camp we run in Greenland." msgstr "" "Внесение неподтверждённых изменений во время заморозки кода — это серьёзная " "ошибка, и от коммиттеров ожидается, что они будут в курсе происходящего, " "прежде чем, вернувшись после долгого отсутствия, закоммитить 10 мегабайт " "накопленных изменений. Те, кто злоупотребляет этим на регулярной основе, " "будут лишены прав на коммиты до возвращения из Лагеря весёлого " "перевоспитания FreeBSD, который мы проводим в Гренландии." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3195 +#: documentation/content/en/articles/committers-guide/_index.adoc:3204 msgid "" "Many mistakes are made because someone is in a hurry and just assumes they " "know the right way of doing something. If you have not done it before, " "chances are good that you do not actually know the way we do things and " "really need to ask first or you are going to completely embarrass yourself " "in public. There is no shame in asking \"how in the heck do I do this?\" We " "already know you are an intelligent person; otherwise, you would not be a " "committer." msgstr "" "Многие ошибки совершаются из-за того, что кто-то торопится и просто " "предполагает, что знает правильный способ что-то сделать. Если вы не делали " "этого раньше, велика вероятность, что вы на самом деле не знаете, как у нас " "принято делать, и вам действительно нужно сначала спросить, иначе вы " -"рискуете полностью опозориться на публике. Нет ничего постыдного в вопросе «" -"как, черт возьми, это сделать?» Мы уже знаем, что вы умный человек; иначе вы " -"не были бы коммиттером." +"рискуете полностью опозориться на публике. Нет ничего постыдного в вопросе " +"«как, черт возьми, это сделать?» Мы уже знаем, что вы умный человек; иначе " +"вы не были бы коммиттером." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3205 +#: documentation/content/en/articles/committers-guide/_index.adoc:3214 msgid "" "If your changes are to the kernel, make sure you can still compile both " "GENERIC and LINT. If your changes are anywhere else, make sure you can " "still compile userspace via `make buildworld`. If your changes are to a " "branch, make sure your testing occurs with a machine which is running that " "code. If you have a change which also may break another architecture, be " "sure and test on all supported architectures. Please ensure your change " "works for crossref:committers-guide[compilers,supported toolchains]. Please " "refer to the https://www.FreeBSD.org/internal/[FreeBSD Internal Page] for a " "list of available resources. As other architectures are added to the " "FreeBSD supported platforms list, the appropriate shared testing resources " "will be made available." msgstr "" "Если ваши изменения касаются ядра, убедитесь, что вы по-прежнему можете " "компилировать как GENERIC, так и LINT. Если ваши изменения касаются других " "частей системы, убедитесь, что вы по-прежнему можете компилировать " "пользовательское пространство с помощью `make buildworld`. Если ваши " "изменения относятся к ветке, убедитесь, что тестирование проводится на " "машине, которая работает с этим кодом. Если ваше изменение может нарушить " "работу другой архитектуры, обязательно протестируйте его на всех " "поддерживаемых архитектурах. Пожалуйста, убедитесь, что ваше изменение " "работает для crossref:committers-guide[compilers,поддерживаемых инструментов " -"сборки]. Пожалуйста, обратитесь к https://www.FreeBSD.org/internal/[" -"Внутренней странице FreeBSD] для получения списка доступных ресурсов. По " +"сборки]. Пожалуйста, обратитесь к https://www.FreeBSD.org/internal/" +"[Внутренней странице FreeBSD] для получения списка доступных ресурсов. По " "мере добавления других архитектур в список поддерживаемых платформ FreeBSD " "будут предоставлены соответствующие общие ресурсы для тестирования." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3208 +#: documentation/content/en/articles/committers-guide/_index.adoc:3217 msgid "" "Contributed software is anything under the [.filename]#src/contrib#, [." "filename]#src/crypto#, or [.filename]#src/sys/contrib# trees." msgstr "" "Предоставленное программное обеспечение — это всё, что находится в деревьях " -"каталогов [.filename]#src/contrib#, [.filename]#src/crypto# или [.filename]#" -"src/sys/contrib#." +"каталогов [.filename]#src/contrib#, [.filename]#src/crypto# или [." +"filename]#src/sys/contrib#." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3213 +#: documentation/content/en/articles/committers-guide/_index.adoc:3222 msgid "" "The trees mentioned above are for contributed software usually imported onto " "a vendor branch. Committing something there may cause unnecessary headaches " "when importing newer versions of the software. As a general consider " "sending patches upstream to the vendor. Patches may be committed to FreeBSD " "first with permission of the maintainer." msgstr "" "Упомянутые выше деревья предназначены для предоставленного программного " "обеспечения, обычно импортируемого в ветку вендора. Фиксация изменений там " "может вызвать ненужные проблемы при импорте более новых версий программного " "обеспечения. В общем случае рекомендуется отправлять исправления напрямую " "вендору. Исправления могут быть сначала зафиксированы в FreeBSD с разрешения " "сопровождающего." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3217 +#: documentation/content/en/articles/committers-guide/_index.adoc:3226 msgid "" "Reasons for modifying upstream software range from wanting strict control " "over a tightly coupled dependency to lack of portability in the canonical " "repository's distribution of their code. Regardless of the reason, effort " "to minimize the maintenance burden of fork is helpful to fellow " "maintainers. Avoid committing trivial or cosmetic changes to files since it " "makes every merge thereafter more difficult: such patches need to be " "manually re-verified every import." msgstr "" "Причины изменения стороннего программного обеспечения варьируются от желания " "строго контролировать тесно связанную зависимость до отсутствия " "переносимости в каноническом репозитории с их кодом. Независимо от причины, " "усилия по минимизации нагрузки на поддержку форка полезны для других " "сопровождающих. Избегайте внесения тривиальных или косметических изменений в " "файлы, так как это усложняет каждое последующее слияние: такие патчи " "необходимо вручную перепроверять при каждом импорте." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3220 +#: documentation/content/en/articles/committers-guide/_index.adoc:3229 msgid "" "If a particular piece of software lacks a maintainer, you are encouraged to " "take up ownership. If you are unsure of the current maintainership email " "{freebsd-arch} and ask." msgstr "" "Если конкретное программное обеспечение не имеет сопровождающего, вам " "предлагается взять на себя ответственность за него. Если вы не уверены в " "текущем сопровождении, напишите на {freebsd-arch} и уточните." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3221 +#: documentation/content/en/articles/committers-guide/_index.adoc:3230 #, no-wrap msgid "Policy on Multiple Architectures" msgstr "Политика поддержки нескольких архитектур" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3224 +#: documentation/content/en/articles/committers-guide/_index.adoc:3233 msgid "" "In an effort to make it easier to keep FreeBSD portable across the platforms " "we support, core has developed this mandate:" msgstr "" "В попытке упростить поддержку переносимости FreeBSD на платформы, которые мы " "поддерживаем, ядро системы разработало следующее предписание:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3227 +#: documentation/content/en/articles/committers-guide/_index.adoc:3236 msgid "" "Major design work (including major API and ABI changes) must prove itself on " "at least one Tier 1 platform before it may be committed to the source tree." msgstr "" "Основные проектные работы (включая значительные изменения API и ABI) должны " "подтвердить свою работоспособность как минимум на одной платформе Уровня 1 " "перед тем, как они могут быть включены в дерево исходного кода." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3231 +#: documentation/content/en/articles/committers-guide/_index.adoc:3240 msgid "" "Developers should also be aware of our Tier Policy for the long term support " "of hardware architectures. The rules here are intended to provide guidance " "during the development process, and are distinct from the requirements for " "features and architectures listed in that section. The Tier rules for " "feature support on architectures at release-time are more strict than the " "rules for changes during the development process." msgstr "" "Разработчики также должны учитывать нашу политику уровней поддержки " "аппаратных архитектур в долгосрочной перспективе. Эти правила предназначены " "для предоставления рекомендаций в процессе разработки и отличаются от " "требований к функциям и архитектурам, указанным в этом разделе. Правила " "уровней поддержки функций для архитектур на момент выпуска более строгие, " "чем правила для изменений в процессе разработки." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3233 +#: documentation/content/en/articles/committers-guide/_index.adoc:3242 #, no-wrap msgid "Policy on Multiple Compilers" msgstr "Политика по использованию нескольких компиляторов" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3247 +#: documentation/content/en/articles/committers-guide/_index.adoc:3256 msgid "" "The FreeBSD base system builds with both Clang and GCC. The project does " "this in a careful and controlled way to maximize benefits from this extra " "work, while keeping the extra work to a minimum. Supporting both Clang and " "GCC improves the flexibility our users have. These compilers have different " "strengths and weaknesses, and supporting both allows users to pick the best " "one for their needs. Clang and GCC support similar dialects of C and C++, " "necessitating a relatively small amount of conditional code. The project " "gains increased code coverage and improves the code quality by using " "features from both compilers. The project is able to build in more user " "environments and leverage more CI environments by supporting this range, " "increasing convenience for users and giving them more tools to test with. " "By carefully constraining the range of versions supported to modern versions " "of these compilers, the project avoids unduly increasing the testing " "matrix. Older and obscure compilers, as well as older dialects of the " "languages, have extremely limited support that allow user programs to build " "with them, but without constraining the base system to being built with " "them. The exact balance continues to evolve to ensure the benefits of extra " "work remain greater than the burdens it imposes. The project used to " "support really old Intel compilers or old GCC versions, but we traded " "supporting those obsolete compilers for a carefully selected range of modern " "compilers. This section documents where we use different compilers, and the " "expectations around that." msgstr "" "Базовая система FreeBSD собирается как с Clang, так и с GCC. Проект делает " "это тщательно и контролируемо, чтобы максимизировать преимущества от этой " "дополнительной работы, сводя эту работу к минимуму. Поддержка обоих " "компиляторов повышает гибкость для наших пользователей. У этих компиляторов " "разные сильные и слабые стороны, и их совместная поддержка позволяет " "пользователям выбирать наиболее подходящий для их задач. Clang и GCC " "поддерживают схожие диалекты C и C++, что требует относительно небольшого " "количества условного кода. Проект получает улучшенное покрытие кода и " "повышает его качество, используя возможности обоих компиляторов. Поддержка " "этого диапазона позволяет проекту собираться в большем количестве " "пользовательских окружений и задействовать больше CI-окружений, увеличивая " "удобство для пользователей и предоставляя им больше инструментов для " "тестирования. Тщательно ограничивая диапазон поддерживаемых версий " "современными версиями этих компиляторов, проект избегает чрезмерного " "увеличения матрицы тестирования. Устаревшие и малоизвестные компиляторы, а " "также старые диалекты языков, имеют крайне ограниченную поддержку, " "позволяющую собирать пользовательские программы, но без ограничений на " "сборку базовой системы с их помощью. Точный баланс продолжает развиваться, " "чтобы гарантировать, что преимущества дополнительной работы остаются выше " "накладываемых ею затрат. Раньше проект поддерживал очень старые компиляторы " "Intel или старые версии GCC, но мы заменили поддержку этих устаревших " "компиляторов на тщательно выбранный диапазон современных компиляторов. В " "этом разделе описано, где мы используем разные компиляторы и какие ожидания " "с этим связаны." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3252 +#: documentation/content/en/articles/committers-guide/_index.adoc:3261 msgid "" "The FreeBSD base system includes an in-tree Clang compiler. Due to being in " "the tree, this compiler is the most supported compiler. All changes must " "compile with it, prior to commit. Complete testing, as appropriate for the " "change, should be done with this compiler." msgstr "" "Базовая система FreeBSD включает в себя компилятор Clang, входящий в дерево " "исходного кода. Поскольку он является частью дерева, этот компилятор " "обладает наибольшей поддержкой. Все изменения должны компилироваться с ним " "перед коммитом. Полное тестирование, соответствующее изменениям, должно " "проводиться с этим компилятором." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3267 +#: documentation/content/en/articles/committers-guide/_index.adoc:3276 msgid "" "The FreeBSD base system also supports various versions of Clang and GCC as " "out-of-tree compilers. For large or risky changes, committers should do a " "test build with a supported version of GCC. Out of tree compilers are " "available as packages. GCC compilers are available as `${TARGET_ARCH}-gcc" "${VERSION}` packages, such as package:devel/freebsd-gcc14@aarch64[aarch64-" "gcc14]. Clang compilers are available as `llvm${VERSION}` packages, such as " "package:devel/llvm18[llvm18]. The project runs automated CI jobs to build " "everything with these compilers. Committers are expected to fix the jobs " "they break with their changes. Committers may test builds of userspace or " "individual kernels by setting `CROSS_TOOLCHAIN` to the package name, for " "example `CROSS_TOOLCHAIN=aarch64-gcc14` or `CROSS_TOOLCHAIN=llvm18`. For " "universe or tinderbox builds, `USE_GCC_TOOLCHAINS=gcc${VERSION}` builds all " "architectures using the appropriate GCC compiler packages. For universe or " "tinderbox builds using an out-of-tree Clang, pass `CROSS_TOOLCHAIN=llvm" "${VERSION}`. Note that while all architectures in the base system can be " "compiled by Clang, only a few architectures can be fully built by GCC." msgstr "" "Базовая система FreeBSD также поддерживает различные версии Clang и GCC в " "качестве компиляторов, не входящих в дерево исходного кода. Для крупных или " "рискованных изменений коммиттеры должны выполнить тестовую сборку с " "поддерживаемой версией GCC. Компиляторы, не входящие в дерево исходного " -"кода, доступны в виде пакетов. Компиляторы GCC доступны в виде пакетов " -"`${TARGET_ARCH}-gcc${VERSION}`, например package:devel/freebsd-" -"gcc14@aarch64[aarch64-gcc14]. Компиляторы Clang доступны в виде пакетов " -"`llvm${VERSION}`, например package:devel/llvm18[llvm18]. Проект запускает " +"кода, доступны в виде пакетов. Компиляторы GCC доступны в виде пакетов `" +"${TARGET_ARCH}-gcc${VERSION}`, например package:devel/freebsd-" +"gcc14@aarch64[aarch64-gcc14]. Компиляторы Clang доступны в виде пакетов `llvm" +"${VERSION}`, например package:devel/llvm18[llvm18]. Проект запускает " "автоматизированные задачи CI для сборки всего с использованием этих " "компиляторов. Ожидается, что коммиттеры исправят задачи, которые они сломали " "своими изменениями. Коммиттеры могут тестировать сборки пользовательского " "пространства или отдельных ядер, установив переменную `CROSS_TOOLCHAIN` в " "имя пакета, например `CROSS_TOOLCHAIN=aarch64-gcc14` или " "`CROSS_TOOLCHAIN=llvm18`. Для сборки universe или tinderbox, " "`USE_GCC_TOOLCHAINS=gcc${VERSION}` собирает все архитектуры с использованием " "соответствующих пакетов компиляторов GCC. Для сборки universe или tinderbox " "с использованием Clang, не входящего в дерево исходного кода, передайте " "`CROSS_TOOLCHAIN=llvm${VERSION}`. Обратите внимание, что хотя все " "архитектуры в базовой системе могут быть скомпилированы с помощью Clang, " "только несколько архитектур могут быть полностью собраны с помощью GCC." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3271 +#: documentation/content/en/articles/committers-guide/_index.adoc:3280 msgid "" "The FreeBSD project also has some CI pipelines on github. For pull requests " "on github and some branches pushed to github forks, a number of cross " "compilation jobs run. These test FreeBSD building using versions of Clang " "that lag the in-tree compiler by one or more major versions." msgstr "" "Проект FreeBSD также имеет несколько CI-пайплайнов на GitHub. Для запросов " "на принятие изменений (pull request) на GitHub и некоторых веток, " "отправленных в форки на GitHub, выполняется ряд задач кросс-компиляции. Они " "тестируют сборку FreeBSD с использованием версий Clang, которые отстают от " "встроенного компилятора на одну или несколько основных версий." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3277 +#: documentation/content/en/articles/committers-guide/_index.adoc:3286 msgid "" "The FreeBSD project is also upgrading compilers. Both Clang and GCC are " "fast moving targets. Some work to change things in the tree, for example " "removing the old-style K&R function declarations and definitions, will land " "in the tree prior to the compiler landing. Committers should try to be " "mindful about this and be receptive to looking into problems with their code " "or changes with these new compilers. Also, just after a new compiler " "version hits the tree, people may need to compile things with the old " "version if there was an undetected regression suspected." msgstr "" "Проект FreeBSD также обновляет компиляторы. И Clang, и GCC быстро " "развиваются. Некоторые изменения, такие как удаление устаревших объявлений и " "определений функций в стиле K&R, будут внесены в дерево до появления нового " "компилятора. Коммиттерам следует учитывать это и быть готовыми к проверке " "проблем в своём коде или изменениях с этими новыми компиляторами. Кроме " "того, сразу после появления новой версии компилятора в дереве, может " "потребоваться компиляция с использованием старой версии, если есть " "подозрение на необнаруженную регрессию." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3281 +#: documentation/content/en/articles/committers-guide/_index.adoc:3290 msgid "" "In addition to the compiler, LLVM's LLD and GNU's binutils are used " "indirectly by the compiler. Committers should be mindful of variations in " "assembler syntax and features of the linkers and ensure both variants work. " "These components will be tested as part of FreeBSD's CI jobs for Clang or " "GCC." msgstr "" "В дополнение к компилятору, LLD от LLVM и binutils от GNU используются " "компилятором косвенно. Коммиттеры должны учитывать различия в синтаксисе " "ассемблера и особенностях компоновщиков, а также обеспечивать " "работоспособность обоих вариантов. Эти компоненты будут тестироваться в " "рамках CI-задач FreeBSD для Clang или GCC." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3287 +#: documentation/content/en/articles/committers-guide/_index.adoc:3296 msgid "" "The FreeBSD project provides headers and libraries that allow other " "compilers to be used to build software not in the base system. These " "headers have support for making the environment as strict as the standard, " "supporting prior dialects of ANSI-C back to C89, and other edge cases our " "large ports collection has uncovered. This support constrains retirement of " "older standards in places like header files, but does not constrain updating " "the base system to newer dialects. Nor does it require the base system to " "compile with these older standards as a whole. Breaking this support will " "cause packages in the ports collection to fail, so should be avoided where " "possible, and promptly fixed when it is easy to do so." msgstr "" "Проект FreeBSD предоставляет заголовочные файлы и библиотеки, которые " "позволяют использовать другие компиляторы для сборки программного " "обеспечения, не входящего в базовую систему. Эти заголовочные файлы " "поддерживают создание среды, соответствующей стандартам, включая более " "ранние диалекты ANSI-C, начиная с C89, а также другие специфичные случаи, " "выявленные нашей обширной коллекцией портов. Эта поддержка ограничивает " "отказ от старых стандартов в таких местах, как заголовочные файлы, но не " "мешает обновлению базовой системы до более новых диалектов. Также она не " "требует, чтобы базовая система целиком компилировалась с использованием этих " "старых стандартов. Нарушение этой поддержки приведёт к сбоям в сборке " "пакетов из коллекции портов, поэтому по возможности этого следует избегать, " "а при обнаружении проблем — оперативно их исправлять." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3292 +#: documentation/content/en/articles/committers-guide/_index.adoc:3301 msgid "" "The FreeBSD build system currently accommodates these different " "environments. As new warnings are added to compilers, the project tries to " "fix them. However, sometimes these warnings require extensive rework, so " "are suppressed in some way by using make variables that evaluate to the " "proper thing depending on the compiler version. Developers should be " "mindful of this, and ensure any compiler specific flags are properly " "conditionalized." msgstr "" "Система сборки FreeBSD в настоящее время поддерживает эти различные среды. " "По мере добавления новых предупреждений в компиляторы проект старается их " "исправлять. Однако иногда эти предупреждения требуют значительной " "переработки, поэтому они подавляются каким-либо образом с использованием " "переменных make, которые вычисляют правильное значение в зависимости от " "версии компилятора. Разработчики должны учитывать это и обеспечивать " "правильную условную обработку любых флагов, специфичных для компилятора." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3293 +#: documentation/content/en/articles/committers-guide/_index.adoc:3302 #, no-wrap msgid "Current Compiler Versions" msgstr "Текущие версии компиляторов" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3296 +#: documentation/content/en/articles/committers-guide/_index.adoc:3305 msgid "" "The versions of supported compilers for a given branch such as `main` or " "`stable/X` varies over time. The authoritative source for supported " "compiler versions are automated CI jobs tested in GitHub's cross-build " "actions and Jenkins." msgstr "" "Версии поддерживаемых компиляторов для конкретной ветки, такой как `main` " "или `stable/X`, со временем меняются. Авторитетным источником информации о " "поддерживаемых версиях компиляторов являются автоматизированные задачи CI, " "тестируемые в кросс-сборках GitHub Actions и Jenkins." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3300 +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3309 +#, no-wrap +msgid "Branch" +msgstr "Ветка" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3310 +#, no-wrap +msgid "In-tree Compiler" +msgstr "Компилятор ветки" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3310 +#, no-wrap +msgid "llvm12" +msgstr "llvm12" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3310 +#, no-wrap +msgid "llvm13" +msgstr "llvm13" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3310 +#, no-wrap +msgid "llvm14" +msgstr "llvm14" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3310 +#, no-wrap +msgid "llvm15" +msgstr "llvm15" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3311 +#, no-wrap +msgid "llvm18" +msgstr "llvm18" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3311 +#, no-wrap +msgid "amd64-gcc12" +msgstr "amd64-gcc12" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3311 +#, no-wrap +msgid "amd64-gcc13" +msgstr "amd64-gcc13" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3313 +#, no-wrap +msgid "amd64-gcc14" +msgstr "amd64-gcc14" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3313 +#, no-wrap +msgid "main" +msgstr "main" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3314 +#: documentation/content/en/articles/committers-guide/_index.adoc:3318 +#: documentation/content/en/articles/committers-guide/_index.adoc:3322 +#: documentation/content/en/articles/committers-guide/_index.adoc:3326 +#, no-wrap +msgid "llvm 19" +msgstr "llvm 19" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3314 +#: documentation/content/en/articles/committers-guide/_index.adoc:3315 +#: documentation/content/en/articles/committers-guide/_index.adoc:3317 +#: documentation/content/en/articles/committers-guide/_index.adoc:3318 +#: documentation/content/en/articles/committers-guide/_index.adoc:3319 +#: documentation/content/en/articles/committers-guide/_index.adoc:3321 +#: documentation/content/en/articles/committers-guide/_index.adoc:3322 +#: documentation/content/en/articles/committers-guide/_index.adoc:3323 +#: documentation/content/en/articles/committers-guide/_index.adoc:3325 +#: documentation/content/en/articles/committers-guide/_index.adoc:3326 +#: documentation/content/en/articles/committers-guide/_index.adoc:3327 +#: documentation/content/en/articles/committers-guide/_index.adoc:3328 +#, no-wrap +msgid "Y" +msgstr "Y" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3317 +#, no-wrap +msgid "stable/15" +msgstr "stable/15" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3321 +#, no-wrap +msgid "stable/14" +msgstr "stable/14" + +#. type: Table +#: documentation/content/en/articles/committers-guide/_index.adoc:3325 +#, no-wrap +msgid "stable/13" +msgstr "stable/13" + +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3332 msgid "" -"For `main`, the in-tree compiler is currently Clang 19. Currently, GCC 12, " -"13, and 14 are tested for amd64 via CI jobs in Jenkins. Clang 14 and 18 are " -"tested for aarch64 and arm64 in GitHub's cross-build actions." +"GCC toolchains are tested for amd64 via CI jobs in Jenkins. LLVM toolchains " +"are tested for aarch64 and arm64 in GitHub's cross-build actions." msgstr "" -"Для ветки `main` встроенным компилятором в настоящее время является Clang " -"19. В настоящее время GCC 12, 13 и 14 тестируются для amd64 через задания CI " -"в Jenkins. Clang 14 и 18 тестируются для aarch64 и arm64 в кросс-сборках " -"GitHub." +"Набор инструментов разработки GCC тестируется для amd64 через задания CI в " +"Jenkins. Набор инструментов разработки LLVM тестируется для aarch64 и arm64 " +"в кросс-сборках GitHub." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3301 +#: documentation/content/en/articles/committers-guide/_index.adoc:3333 #, no-wrap msgid "Other Suggestions" msgstr "Другие предложения" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3305 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3337 msgid "" "When committing documentation changes, use a spell checker before " "committing. For all XML docs, verify that the formatting directives are " "correct by running `make lint` and package:textproc/igor[]." msgstr "" "При внесении изменений в документацию перед коммитом проверяйте орфографию. " "Для всех XML-документов убедитесь в корректности директив форматирования, " "выполнив `make lint` и package:textproc/igor[]." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3307 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3339 msgid "" "For manual pages, run package:sysutils/manck[] and package:textproc/igor[] " "over the manual page to verify all of the cross references and file " "references are correct and that the man page has all of the appropriate " "`MLINKS` installed." msgstr "" "Для страниц руководства запустите package:sysutils/manck[] и package:" "textproc/igor[] на странице руководства, чтобы проверить, что все " "перекрестные ссылки и ссылки на файлы корректны, а также что страница " "руководства имеет все необходимые `MLINKS`." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3314 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3346 msgid "" "Do not mix style fixes with new functionality. A style fix is any change " "which does not modify the functionality of the code. Mixing the changes " "obfuscates the functionality change when asking for differences between " "revisions, which can hide any new bugs. Do not include whitespace changes " "with content changes in commits to [.filename]#doc/#. The extra clutter in " "the diffs makes the translators' job much more difficult. Instead, make any " "style or whitespace changes in separate commits that are clearly labeled as " "such in the commit message." msgstr "" "Не смешивайте исправления стиля с новой функциональностью. Исправление стиля " "— это любое изменение, которое не меняет функциональность кода. Смешивание " "изменений затрудняет понимание изменений функциональности при запросе " "различий между версиями, что может скрыть новые ошибки. Не включайте " "изменения пробелов вместе с изменениями содержимого в коммитах для [." "filename]#doc/#. Лишний шум в различиях значительно усложняет работу " "переводчиков. Вместо этого вносите исправления стиля или пробелов в " "отдельных коммитах, явно обозначенных как таковые в сообщении коммита." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3315 +#: documentation/content/en/articles/committers-guide/_index.adoc:3347 #, no-wrap msgid "Deprecating Features" msgstr "Устаревающие функции" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3318 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3350 msgid "" "When it is necessary to remove functionality from software in the base " "system, follow these guidelines whenever possible:" msgstr "" "Когда необходимо удалить функциональность из программного обеспечения в " "базовой системе, по возможности следуйте этим рекомендациям:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3320 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3352 msgid "" "Mention is made in the manual page and possibly the release notes that the " "option, utility, or interface is deprecated. Use of the deprecated feature " "generates a warning." msgstr "" "Упоминание о том, что опция, утилита или интерфейс устарели, содержится в " "руководстве и, возможно, в примечаниях к выпуску. Использование устаревшей " "функции вызывает предупреждение." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3321 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3353 msgid "" "The option, utility, or interface is preserved until the next major (point " "zero) release." msgstr "" -"Опция, утилита или интерфейс сохраняются до следующего мажорного (точка-ноль)" -" релиза." +"Опция, утилита или интерфейс сохраняются до следующего мажорного (точка-" +"ноль) релиза." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3322 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3354 msgid "" "The option, utility, or interface is removed and no longer documented. It is " "now obsolete. It is also generally a good idea to note its removal in the " "release notes." msgstr "" "Опция, утилита или интерфейс удалены и больше не документируются. Они " "считаются устаревшими. Также обычно рекомендуется указать их удаление в " "примечаниях к выпуску." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3323 +#: documentation/content/en/articles/committers-guide/_index.adoc:3355 #, no-wrap msgid "Privacy and Confidentiality" msgstr "Конфиденциальность и приватность" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3326 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3358 msgid "Most FreeBSD business is done in public." msgstr "Большая часть работы над FreeBSD выполняется публично." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3329 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3361 msgid "" "FreeBSD is an _open_ project. Which means that not only can anyone use the " "source code, but that most of the development process is open to public " "scrutiny." msgstr "" "FreeBSD — это _открытый_ проект. Это означает, что не только любой может " "использовать исходный код, но и большая часть процесса разработки открыта " "для публичного изучения." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3330 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3362 msgid "Certain sensitive matters must remain private or held under embargo." msgstr "" "Некоторые конфиденциальные вопросы должны оставаться в тайне или быть под " "запретом на разглашение." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3336 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3368 msgid "" "There unfortunately cannot be complete transparency. As a FreeBSD developer " "you will have a certain degree of privileged access to information. " "Consequently you are expected to respect certain requirements for " "confidentiality. Sometimes the need for confidentiality comes from external " "collaborators or has a specific time limit. Mostly though, it is a matter " "of not releasing private communications." msgstr "" "К сожалению, полной прозрачности быть не может. Как разработчик FreeBSD, вы " "будете иметь определенную степень привилегированного доступа к информации. " "Следовательно, от вас ожидается соблюдение определенных требований " "конфиденциальности. Иногда необходимость конфиденциальности исходит от " "внешних сотрудников или имеет конкретный временной лимит. Однако в " "большинстве случаев это вопрос неразглашения частных переписок." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3337 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3369 msgid "" "The Security Officer has sole control over the release of security " "advisories." msgstr "" "Ответственный за безопасность обладает исключительным правом публикации " "уведомлений о безопасности." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3342 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3374 msgid "" "Where there are security problems that affect many different operating " "systems, FreeBSD frequently depends on early access to be able to prepare " "advisories for coordinated release. Unless FreeBSD developers can be " "trusted to maintain security, such early access will not be made available. " "The Security Officer is responsible for controlling pre-release access to " "information about vulnerabilities, and for timing the release of all " "advisories. He may request help under condition of confidentiality from any " "developer with relevant knowledge to prepare security fixes." msgstr "" "Где есть проблемы безопасности, затрагивающие множество различных " "операционных систем, FreeBSD часто зависит от раннего доступа, чтобы иметь " "возможность подготовить уведомления для согласованного выпуска. Если " "разработчики FreeBSD не могут быть доверены в вопросах поддержания " "безопасности, такой ранний доступ предоставлен не будет. Ответственный за " "безопасность контролирует доступ к информации об уязвимостях до их " "публикации и определяет время выпуска всех уведомлений. Он может запросить " "помощь при условии конфиденциальности у любого разработчика с " "соответствующими знаниями для подготовки исправлений безопасности." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3343 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3375 msgid "" "Communications with Core are kept confidential for as long as necessary." msgstr "" "Коммуникации с Основной командой (Core Team) сохраняются в " "конфиденциальности столько времени, сколько необходимо." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3348 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3380 msgid "" "Communications to core will initially be treated as confidential. " "Eventually however, most of Core's business will be summarized into the " "monthly or quarterly core reports. Care will be taken to avoid publicising " "any sensitive details. Records of some particularly sensitive subjects may " "not be reported on at all and will be retained only in Core's private " "archives." msgstr "" "Коммуникации с Основной командой изначально будут рассматриваться как " "конфиденциальные. Однако в конечном итоге большая часть деятельности " "Основной команды будет обобщена в ежемесячных или квартальных отчетах ядра. " "Будет уделено внимание тому, чтобы избежать разглашения каких-либо " "чувствительных деталей. Записи по некоторым особо чувствительным темам могут " "вообще не попадать в отчеты и будут храниться только в частных архивах " "Основной команды." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3349 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3381 msgid "" "Non-disclosure Agreements may be required for access to certain commercially " "sensitive data." msgstr "" "Соглашения о неразглашении могут потребоваться для доступа к определенной " "коммерчески чувствительной информации." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3352 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3384 msgid "" "Access to certain commercially sensitive data may only be available under a " "Non-Disclosure Agreement. The FreeBSD Foundation legal staff must be " "consulted before any binding agreements are entered into." msgstr "" "Доступ к определенным коммерчески чувствительным данным может быть " "предоставлен только при подписании Соглашения о неразглашении. Перед " "заключением каких-либо юридически обязывающих соглашений необходимо " "проконсультироваться с юридическим отделом Фонда FreeBSD." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3353 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3385 msgid "Private communications must not be made public without permission." msgstr "Приватные сообщения не должны становиться публичными без разрешения." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3356 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3388 msgid "" "Beyond the specific requirements above there is a general expectation not to " "publish private communications between developers without the consent of all " "parties involved. Ask permission before forwarding a message onto a public " "mailing list, or posting it to a forum or website that can be accessed by " "other than the original correspondents." msgstr "" "Помимо указанных выше конкретных требований, существует общее правило не " "публиковать личную переписку между разработчиками без согласия всех " "вовлеченных сторон. Перед пересылкой сообщения в публичную рассылку, " "размещением на форуме или веб-сайте, доступном не только для исходных " "корреспондентов, необходимо запросить разрешение." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3357 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3389 msgid "" "Communications on project-only or restricted access channels must be kept " "private." msgstr "" "Общение в каналах, предназначенных только для проекта или с ограниченным " "доступом, должно оставаться конфиденциальным." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3360 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3392 msgid "" "Similarly to personal communications, certain internal communications " "channels, including FreeBSD Committer only mailing lists and restricted " "access IRC channels are considered private communications. Permission is " "required to publish material from these sources." msgstr "" "Аналогично личным сообщениям, некоторые внутренние каналы связи, включая " "почтовые рассылки только для коммиттеров FreeBSD и IRC-каналы с ограниченным " "доступом, считаются частной перепиской. Для публикации материалов из этих " "источников требуется разрешение." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3361 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3393 msgid "Core may approve publication." msgstr "Основная команда может одобрить публикацию." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3363 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3395 msgid "" "Where it is impractical to obtain permission due to the number of " "correspondents or where permission to publish is unreasonably withheld, Core " "may approve release of such private matters that merit more general " "publication." msgstr "" "В случаях, когда получение разрешения непрактично из-за количества " "корреспондентов или когда разрешение на публикацию необоснованно " "отклоняется, Основная команда может одобрить раскрытие таких частных " "вопросов, которые заслуживают более широкой публикации." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3365 +#: documentation/content/en/articles/committers-guide/_index.adoc:3397 #, no-wrap msgid "Support for Multiple Architectures" msgstr "Поддержка множественных архитектур" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3372 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3404 msgid "" "FreeBSD is a highly portable operating system intended to function on many " "different types of hardware architectures. Maintaining clean separation of " "Machine Dependent (MD) and Machine Independent (MI) code, as well as " "minimizing MD code, is an important part of our strategy to remain agile " "with regards to current hardware trends. Each new hardware architecture " "supported by FreeBSD adds substantially to the cost of code maintenance, " "toolchain support, and release engineering. It also dramatically increases " "the cost of effective testing of kernel changes. As such, there is strong " "motivation to differentiate between classes of support for various " "architectures while remaining strong in a few key architectures that are " "seen as the FreeBSD \"target audience\"." msgstr "" "FreeBSD — это высокопортативная операционная система, предназначенная для " "работы на множестве различных типов аппаратных архитектур. Поддержание " "четкого разделения между машинозависимым (MD) и машинонезависимым (MI) " "кодом, а также минимизация MD-кода являются важной частью нашей стратегии по " "сохранению гибкости в отношении текущих тенденций в аппаратном обеспечении. " "Каждая новая аппаратная архитектура, поддерживаемая FreeBSD, существенно " "увеличивает затраты на поддержку кода, инструментальных средств и управление " "выпусками. Это также значительно повышает стоимость эффективного " "тестирования изменений в ядре. Таким образом, существует серьезная мотивация " "для разграничения уровней поддержки различных архитектур, оставаясь при этом " -"сильными в нескольких ключевых архитектурах, которые рассматриваются как «" -"целевая аудитория» FreeBSD." +"сильными в нескольких ключевых архитектурах, которые рассматриваются как " +"«целевая аудитория» FreeBSD." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3373 +#: documentation/content/en/articles/committers-guide/_index.adoc:3405 #, no-wrap msgid "Statement of General Intent" msgstr "Заявление об общих намерениях" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3378 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3410 msgid "" "The FreeBSD Project targets \"production quality commercial off-the-shelf " "(COTS) workstation, server, and high-end embedded systems\". By retaining a " "focus on a narrow set of architectures of interest in these environments, " "the FreeBSD Project is able to maintain high levels of quality, stability, " "and performance, as well as minimize the load on various support teams on " "the project, such as the ports team, documentation team, security officer, " "and release engineering teams. Diversity in hardware support broadens the " "options for FreeBSD consumers by offering new features and usage " "opportunities, but these benefits must always be carefully considered in " "terms of the real-world maintenance cost associated with additional platform " "support." msgstr "" "Проект FreeBSD ориентирован на \"коммерческие готовые рабочие станции, " "серверы и высокопроизводительные встраиваемые системы производственного " "уровня\". Сохраняя фокус на узком наборе архитектур, актуальных для этих " "сред, проект FreeBSD способен поддерживать высокий уровень качества, " "стабильности и производительности, а также минимизировать нагрузку на " "различные команды поддержки проекта, такие как команда портов, команда " "документации, офицер безопасности и команды разработки релизов. Разнообразие " "в поддержке оборудования расширяет возможности потребителей FreeBSD, " "предлагая новые функции и варианты использования, однако эти преимущества " "всегда должны тщательно оцениваться с учётом реальных затрат на поддержку " "дополнительных платформ." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3385 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3417 msgid "" "The FreeBSD Project differentiates platform targets into four tiers. Each " "tier includes a list of guarantees consumers may rely on as well as " "obligations by the Project and developers to fulfill those guarantees. " "These lists define the minimum guarantees for each tier. The Project and " "developers may provide additional levels of support beyond the minimum " "guarantees for a given tier, but such additional support is not guaranteed. " "Each platform target is assigned to a specific tier for each stable branch. " "As a result, a platform target might be assigned to different tiers on " "concurrent stable branches." msgstr "" "Проект FreeBSD разделяет целевые платформы на четыре уровня. Каждый уровень " "включает список гарантий, на которые могут рассчитывать пользователи, а " "также обязательства проекта и разработчиков по выполнению этих гарантий. Эти " "списки определяют минимальные гарантии для каждого уровня. Проект и " "разработчики могут предоставлять дополнительные уровни поддержки, " "превышающие минимальные гарантии для данного уровня, но такая дополнительная " "поддержка не гарантируется. Каждая целевая платформа назначается на " "определённый уровень для каждой стабильной ветви. В результате, целевая " "платформа может быть назначена на разные уровни в параллельных стабильных " "ветках." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3386 +#: documentation/content/en/articles/committers-guide/_index.adoc:3418 #, no-wrap msgid "Platform Targets" msgstr "Целевые платформы" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3393 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3425 msgid "" "Support for a hardware platform consists of two components: kernel support " "and userland Application Binary Interfaces (ABIs). Kernel platform support " "includes things needed to run a FreeBSD kernel on a hardware platform such " "as machine-dependent virtual memory management and device drivers. A " "userland ABI specifies an interface for user processes to interact with a " "FreeBSD kernel and base system libraries. A userland ABI includes system " "call interfaces, the layout and semantics of public data structures, and the " "layout and semantics of arguments passed to subroutines. Some components of " "an ABI may be defined by specifications such as the layout of C++ exception " "objects or calling conventions for C functions." msgstr "" "Поддержка аппаратной платформы состоит из двух компонентов: поддержки ядра и " "пользовательских двоичных интерфейсов приложений (ABI). Поддержка платформы " "на уровне ядра включает в себя всё необходимое для запуска ядра FreeBSD на " "аппаратной платформе, например, зависящее от машины управление виртуальной " "памятью и драйверы устройств. Пользовательский ABI определяет интерфейс для " "взаимодействия пользовательских процессов с ядром FreeBSD и базовыми " "системными библиотеками. Пользовательский ABI включает интерфейсы системных " "вызовов, расположение и семантику публичных структур данных, а также " "расположение и семантику аргументов, передаваемых подпрограммам. Некоторые " "компоненты ABI могут быть определены спецификациями, такими как расположение " "объектов исключений C++ или соглашения о вызовах для функций C." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3395 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3427 msgid "" "A FreeBSD kernel also uses an ABI (sometimes referred to as the Kernel " "Binary Interface (KBI)) which includes the semantics and layouts of public " "data structures and the layout and semantics of arguments to public " "functions within the kernel itself." msgstr "" "Ядро FreeBSD также использует ABI (иногда называемый Kernel Binary Interface " "(KBI)), который включает семантику и расположение публичных структур данных, " "а также расположение и семантику аргументов публичных функций внутри самого " "ядра." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3400 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3432 msgid "" "A FreeBSD kernel may support multiple userland ABIs. For example, FreeBSD's " "amd64 kernel supports FreeBSD amd64 and i386 userland ABIs as well as Linux " "x86_64 and i386 userland ABIs. A FreeBSD kernel should support a \"native\" " "ABI as the default ABI. The native \"ABI\" generally shares certain " "properties with the kernel ABI such as the C calling convention, sizes of " "basic types, etc." msgstr "" "Ядро FreeBSD может поддерживать несколько пользовательских ABI. Например, " "ядро FreeBSD amd64 поддерживает пользовательские ABI FreeBSD amd64 и i386, а " "также пользовательские ABI Linux x86_64 и i386. Ядро FreeBSD должно " "поддерживать \"родной\" ABI в качестве ABI по умолчанию. \"Родной\" ABI, как " "правило, разделяет определённые свойства с ABI ядра, такие как соглашение о " "вызовах в C, размеры базовых типов и т.д." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3402 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3434 msgid "" "Tiers are defined for both kernels and userland ABIs. In the common case, a " "platform's kernel and FreeBSD ABIs are assigned to the same tier." msgstr "" "Уровни определены как для ядер, так и для пользовательских ABI. В общем " "случае ядро платформы и ABI FreeBSD назначаются на один и тот же уровень." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3403 +#: documentation/content/en/articles/committers-guide/_index.adoc:3435 #, no-wrap msgid "Tier 1: Fully-Supported Architectures" msgstr "Уровень 1: Полностью поддерживаемые архитектуры" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3408 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3440 msgid "" "Tier 1 platforms are the most mature FreeBSD platforms. They are supported " "by the security officer, release engineering, and Ports Management Team. " "Tier 1 architectures are expected to be Production Quality with respect to " "all aspects of the FreeBSD operating system, including installation and " "development environments." msgstr "" "Уровень 1 включает наиболее зрелые платформы FreeBSD. Они поддерживаются " "офицером безопасности, инженерами выпуска и командой управления портами. " "Ожидается, что архитектуры Уровня 1 соответствуют производственному качеству " "во всех аспектах операционной системы FreeBSD, включая среды установки и " "разработки." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3410 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3442 msgid "" "The FreeBSD Project provides the following guarantees to consumers of Tier 1 " "platforms:" msgstr "" "Проект FreeBSD предоставляет следующие гарантии пользователям платформ " "Уровня 1:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3412 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3444 msgid "" "Official FreeBSD release images will be provided by the release engineering " "team." msgstr "" "Официальные образы релизов FreeBSD будут предоставлены командой разработки " "релизов." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3413 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3445 msgid "" "Binary updates and source patches for Security Advisories and Errata Notices " "will be provided for supported releases." msgstr "" "Двоичные обновления и исправления исходного кода для Security Advisories и " "Errata Notices будут предоставляться для поддерживаемых выпусков." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3414 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3446 msgid "" "Source patches for Security Advisories will be provided for supported " "branches." msgstr "" "Исходные патчи для бюллетеней безопасности будут предоставлены для " "поддерживаемых веток." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3415 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3447 msgid "" "Binary updates and source patches for cross-platform Security Advisories " "will typically be provided at the time of the announcement." msgstr "" "Двоичные обновления и исправления исходного кода для кросс-платформенных " "выпусков Security Advisories обычно предоставляются во время объявления." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3416 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3448 msgid "" "Changes to userland ABIs will generally include compatibility shims to " "ensure correct operation of binaries compiled against any stable branch " "where the platform is Tier 1. These shims might not be enabled in the " "default install. If compatibility shims are not provided for an ABI change, " "the lack of shims will be clearly documented in the release notes." msgstr "" "Изменения в пользовательских ABI, как правило, включают прослойки " "совместимости (shim) для обеспечения корректной работы бинарных файлов, " "скомпилированных для любой стабильной ветки, где платформа относится к " "Уровню 1. Эти прослойки могут быть отключены в стандартной установке. Если " "прослойки совместимости не предоставляются для изменения ABI, их отсутствие " "будет явно указано в примечаниях к выпуску." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3417 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3449 msgid "" "Changes to certain portions of the kernel ABI will include compatibility " "shims to ensure correct operation of kernel modules compiled against the " "oldest supported release on the branch. Note that not all parts of the " "kernel ABI are protected." msgstr "" "Изменения в определённых частях ABI ядра будут включать прослойки " "совместимости для обеспечения корректной работы модулей ядра, " "скомпилированных для самой старой поддерживаемой версии в ветке. Обратите " "внимание, что не все части ABI ядра защищены." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3418 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3450 msgid "" "Official binary packages for third party software will be provided by the " "ports team. For embedded architectures, these packages may be cross-built " "from a different architecture." msgstr "" "Официальные бинарные пакеты для стороннего программного обеспечения будут " "предоставлены командой портов. Для встраиваемых архитектур эти пакеты могут " "быть кросс-собранными на архитектуре другого типа." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3419 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3451 msgid "" "Most relevant ports should either build or have the appropriate filters to " "prevent inappropriate ones from building." msgstr "" "Наиболее подходящие порты должны либо собираться, либо иметь соответствующие " "фильтры, чтобы предотвратить сборку неподходящих." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3420 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3452 msgid "" "New features which are not inherently platform-specific will be fully " "functional on all Tier 1 architectures." msgstr "" "Новые функции, которые не являются специфичными для платформы, будут " "полностью работоспособны на всех архитектурах Уровня 1." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3421 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3453 msgid "" "Features and compatibility shims used by binaries compiled against older " "stable branches may be removed in newer major versions. Such removals will " "be clearly documented in the release notes." msgstr "" "Функции и прослойки совместимости, используемые программами, " "скомпилированными для старых стабильных веток, могут быть удалены в новых " "основных версиях. Такие изменения будут четко документированы в примечаниях " "к выпуску." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3422 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3454 msgid "" "Tier 1 platforms should be fully documented. Basic operations will be " "documented in the FreeBSD Handbook." msgstr "" "Уровень 1 платформ должен быть полностью документирован. Основные операции " "будут описаны в Руководстве FreeBSD." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3423 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3455 msgid "Tier 1 platforms will be included in the source tree." msgstr "Уровень 1 платформ будет включен в дерево исходных кодов." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3424 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3456 msgid "" "Tier 1 platforms should be self-hosting either via the in-tree toolchain or " "an external toolchain. If an external toolchain is required, official binary " "packages for an external toolchain will be provided." msgstr "" "Платформы Уровня 1 должны быть самодостаточными, используя либо встроенный " "инструментарий, либо внешний инструментарий. Если требуется внешний " "инструментарий, будут предоставлены официальные бинарные пакеты для него." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3426 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3458 msgid "" "To maintain maturity of Tier 1 platforms, the FreeBSD Project will maintain " "the following resources to support development:" msgstr "" "Для обеспечения зрелости платформ Уровня 1 проект FreeBSD будет поддерживать " "следующие ресурсы для разработки:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3428 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3460 msgid "" "Build and test automation support either in the FreeBSD.org cluster or some " "other location easily available for all developers. Embedded platforms may " "substitute an emulator available in the FreeBSD.org cluster for actual " "hardware." msgstr "" -"Сборка и автоматизация тестирования поддерживаются либо в кластере " -"FreeBSD.org, либо в другом месте, легко доступном для всех разработчиков. " -"Для встраиваемых платформ можно использовать эмулятор, доступный в кластере " +"Сборка и автоматизация тестирования поддерживаются либо в кластере FreeBSD." +"org, либо в другом месте, легко доступном для всех разработчиков. Для " +"встраиваемых платформ можно использовать эмулятор, доступный в кластере " "FreeBSD.org, вместо реального оборудования." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3429 -#: documentation/content/en/articles/committers-guide/_index.adoc:3459 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3461 +#: documentation/content/en/articles/committers-guide/_index.adoc:3491 msgid "Inclusion in the `make universe` and `make tinderbox` targets." msgstr "Включение в цели `make universe` и `make tinderbox`." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3430 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3462 msgid "" "Dedicated hardware in one of the FreeBSD clusters for package building " "(either natively or via qemu-user)." msgstr "" -"Выделенное оборудование в одном из кластеров FreeBSD для сборки пакетов (" -"нативно или через qemu-user)." +"Выделенное оборудование в одном из кластеров FreeBSD для сборки пакетов " +"(нативно или через qemu-user)." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3432 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3464 msgid "" "Collectively, developers are required to provide the following to maintain " "the Tier 1 status of a platform:" msgstr "" "Совокупно, разработчики должны обеспечить следующее для поддержания статуса " "платформы Уровня 1:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3434 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3466 msgid "" "Changes to the source tree should not knowingly break the build of a Tier 1 " "platform." msgstr "" "Изменения в дереве исходного кода не должны заведомо нарушать сборку " "платформы Уровня 1." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3435 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3467 msgid "" "Tier 1 architectures must have a mature, healthy ecosystem of users and " "active developers." msgstr "" "Уровень 1 архитектур должен обладать зрелой, здоровой экосистемой " "пользователей и активных разработчиков." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3436 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3468 msgid "" "Developers should be able to build packages on commonly available, non-" "embedded Tier 1 systems. This can mean either native builds if non-embedded " "systems are commonly available for the platform in question, or it can mean " "cross-builds hosted on some other Tier 1 architecture." msgstr "" "Разработчики должны иметь возможность собирать пакеты на широко доступных, " "невстраиваемых системах Уровня 1. Это может означать как нативные сборки, " "если невстраиваемые системы широко доступны для рассматриваемой платформы, " "так и кросс-сборки, выполняемые на другой архитектуре Уровня 1." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3437 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3469 msgid "" "Changes cannot break the userland ABI. If an ABI change is required, ABI " "compatibility for existing binaries should be provided via use of symbol " "versioning or shared library version bumps." msgstr "" "Изменения не должны нарушать ABI пользовательского пространства. Если " "изменение ABI необходимо, совместимость ABI для существующих бинарных файлов " "должна обеспечиваться с помощью версионирования символов или увеличения " "версий разделяемых библиотек." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3438 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3470 msgid "" "Changes merged to stable branches cannot break the protected portions of the " "kernel ABI. If a kernel ABI change is required, the change should be " "modified to preserve functionality of existing kernel modules." msgstr "" "Изменения, которым сделано слияние в стабильные ветки, не должны нарушать " "защищенные части ABI ядра. Если требуется изменение ABI ядра, изменение " "должно быть модифицировано для сохранения функциональности существующих " "модулей ядра." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3439 +#: documentation/content/en/articles/committers-guide/_index.adoc:3471 #, no-wrap msgid "Tier 2: Developmental and Niche Architectures" msgstr "Уровень 2: Развивающиеся и нишевые архитектуры" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3443 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3475 msgid "" "Tier 2 platforms are functional, but less mature FreeBSD platforms. They " "are not supported by the security officer, release engineering, and Ports " "Management Team." msgstr "" "Уровень 2 включает в себя функциональные, но менее развитые платформы " "FreeBSD. Они не поддерживаются офицером безопасности, инженерами выпуска и " "командой управления портами." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3447 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3479 msgid "" "Tier 2 platforms may be Tier 1 platform candidates that are still under " "active development. Architectures reaching end of life may also be moved " "from Tier 1 status to Tier 2 status as the availability of resources to " "continue to maintain the system in a Production Quality state diminishes. " "Well-supported niche architectures may also be Tier 2." msgstr "" "Платформы Уровня 2 могут быть кандидатами в платформы Уровня 1, которые всё " "ещё находятся в активной разработке. Архитектуры, достигшие конца жизненного " "цикла, также могут быть переведены из статуса Уровня 1 на Уровень 2 по мере " "сокращения доступности ресурсов для поддержания системы в состоянии " "производственного качества. Хорошо поддерживаемые нишевые архитектуры также " "могут относиться к Уровню 2." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3449 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3481 msgid "" "The FreeBSD Project provides the following guarantees to consumers of Tier 2 " "platforms:" msgstr "" "Проект FreeBSD предоставляет следующие гарантии пользователям платформ " "Уровня 2:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3451 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3483 msgid "" "The ports infrastructure should include basic support for Tier 2 " "architectures sufficient to support building ports and packages. This " "includes support for basic packages such as ports-mgmt/pkg, but there is no " "guarantee that arbitrary ports will be buildable or functional." msgstr "" "Инфраструктура портов должна включать базовую поддержку архитектур Уровня 2, " "достаточную для сборки портов и пакетов. Это включает поддержку базовых " "пакетов, таких как ports-mgmt/pkg, но нет гарантии, что произвольные порты " "будут собираемыми или работоспособными." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3452 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3484 msgid "" "New features which are not inherently platform-specific should be feasible " "on all Tier 2 architectures if not implemented." msgstr "" "Новые функции, которые не являются специфичными для платформы, должны быть " "реализуемы на всех архитектурах уровня Уровень 2, если они не реализованы." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3453 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3485 msgid "Tier 2 platforms will be included in the source tree." msgstr "Уровень 2 платформ будет включен в дерево исходных кодов." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3454 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3486 msgid "" "Tier 2 platforms should be self-hosting either via the in-tree toolchain or " "an external toolchain. If an external toolchain is required, official binary " "packages for an external toolchain will be provided." msgstr "" "Платформы Уровня 2 должны быть самодостаточными, используя либо встроенный " "инструментарий, либо внешний инструментарий. Если требуется внешний " "инструментарий, будут предоставлены официальные бинарные пакеты для него." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3455 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3487 msgid "" "Tier 2 platforms should provide functional kernels and userlands even if an " "official release distribution is not provided." msgstr "" "Уровень 2 платформ должен обеспечивать функциональные ядра и " "пользовательские среды, даже если официальный дистрибутив не предоставляется." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3457 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3489 msgid "" "To maintain maturity of Tier 2 platforms, the FreeBSD Project will maintain " "the following resources to support development:" msgstr "" "Для поддержания зрелости платформ Уровня 2 проект FreeBSD будет поддерживать " "следующие ресурсы для разработки:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3461 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3493 msgid "" "Collectively, developers are required to provide the following to maintain " "the Tier 2 status of a platform:" msgstr "" "Совместно разработчики должны обеспечить следующее для поддержания статуса " "платформы Уровня 2:" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3463 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3495 msgid "" "Changes to the source tree should not knowingly break the build of a Tier 2 " "platform." msgstr "" "Изменения в дереве исходного кода не должны заведомо нарушать сборку " "платформы Уровня 2." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3464 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3496 msgid "" "Tier 2 architectures must have an active ecosystem of users and developers." msgstr "" "Уровень 2 архитектур должен иметь активную экосистему пользователей и " "разработчиков." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3465 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3497 msgid "" "While changes are permitted to break the userland ABI, the ABI should not be " "broken gratuitously. Significant userland ABI changes should be restricted " "to major versions." msgstr "" "Хотя изменения, нарушающие ABI пользовательского пространства, допустимы, не " "следует делать это без веской причины. Значительные изменения ABI " "пользовательского пространства должны ограничиваться основными версиями." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3466 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3498 msgid "" "New features that are not yet implemented on Tier 2 architectures should " "provide a means of disabling them on those architectures." msgstr "" "Новые функции, которые еще не реализованы в архитектурах Уровня 2, должны " "предоставлять возможность их отключения на этих архитектурах." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3467 +#: documentation/content/en/articles/committers-guide/_index.adoc:3499 #, no-wrap msgid "Tier 3: Experimental Architectures" msgstr "Уровень 3: Экспериментальные архитектуры" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3471 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3503 msgid "" "Tier 3 platforms have at least partial FreeBSD support. They are _not_ " "supported by the security officer, release engineering, and Ports Management " "Team." msgstr "" "Уровень 3 включает платформы с частичной поддержкой FreeBSD. Они _не_ " "поддерживаются офицером безопасности, инженерами выпуска релизов и командой " "управления портами." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3474 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3506 msgid "" "Tier 3 platforms are architectures in the early stages of development, for " "non-mainstream hardware platforms, or which are considered legacy systems " "unlikely to see broad future use. Initial support for Tier 3 platforms may " "exist in a separate repository rather than the main source repository." msgstr "" "Уровень 3 включает архитектуры на ранних стадиях разработки, предназначенные " "для неосновных аппаратных платформ или считающиеся устаревшими системами, " "которые вряд ли получат широкое применение в будущем. Первоначальная " "поддержка платформ Уровня 3 может находиться в отдельном репозитории, а не в " "основном репозитории исходного кода." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3477 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3509 msgid "" "The FreeBSD Project provides no guarantees to consumers of Tier 3 platforms " "and is not committed to maintaining resources to support development. Tier " "3 platforms may not always be buildable, nor are any kernel or userland ABIs " "considered stable." msgstr "" "Проект FreeBSD не предоставляет никаких гарантий пользователям платформ " "Уровня 3 и не обязуется выделять ресурсы для поддержки разработки. Платформы " "Уровня 3 могут не всегда собираться, и ни одно ABI ядра или " "пользовательского пространства не считается стабильным." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3478 +#: documentation/content/en/articles/committers-guide/_index.adoc:3510 #, no-wrap msgid "Unsupported Architectures" msgstr "Неподдерживаемые архитектуры" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3482 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3514 msgid "" "Other platforms are not supported in any form by the project. The project " "previously described these as Tier 4 systems." msgstr "" "Другие платформы не поддерживаются проектом в какой-либо форме. Ранее проект " "описывал их как системы Уровня 4." -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3485 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3517 msgid "" "After a platform transitions to unsupported, all support for the platform is " "removed from the source, ports and documentation trees. Note that ports " "support should remain as long as the platform is supported in a branch " "supported by ports." msgstr "" "После перехода платформы в статус неподдерживаемой, вся поддержка платформы " "удаляется из исходного кода, портов и документации. Обратите внимание, что " "поддержка в портах должна сохраняться до тех пор, пока платформа " "поддерживается в ветке, поддерживаемой портами." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3486 +#: documentation/content/en/articles/committers-guide/_index.adoc:3518 #, no-wrap msgid "Policy on Changing the Tier of an Architecture" msgstr "Политика изменения уровня архитектуры" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3490 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3522 msgid "" "Systems may only be moved from one tier to another by approval of the " "FreeBSD Core Team, which shall make that decision in collaboration with the " "Security Officer, Release Engineering, and ports management teams. For a " "platform to be promoted to a higher tier, any missing support guarantees " "must be satisfied before the promotion is completed." msgstr "" "Системы могут быть перемещены с одного уровня на другой только с одобрения " "Основной команды FreeBSD, которая принимает это решение совместно с Security " "Officer, Release Engineering и командами управления портами. Для перевода " "платформы на более высокий уровень все недостающие гарантии поддержки должны " "быть выполнены до завершения повышения." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3492 +#: documentation/content/en/articles/committers-guide/_index.adoc:3524 #, no-wrap msgid "Ports Specific FAQ" msgstr "Специфичные FAQ по портам" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3495 +#: documentation/content/en/articles/committers-guide/_index.adoc:3527 #, no-wrap msgid "Adding a New Port" msgstr "Добавление нового порта" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3498 +#: documentation/content/en/articles/committers-guide/_index.adoc:3530 #, no-wrap msgid "How do I add a new port?" msgstr "Как добавить новый порт?" -#. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3503 +#. type: Plain text +#: documentation/content/en/articles/committers-guide/_index.adoc:3535 msgid "" "Adding a port to the tree is relatively simple. Once the port is ready to be " "added, as explained later crossref:committers-guide[ports-qa-add-new-extra," "here], you need to add the port's directory entry in the category's [." "filename]#Makefile#. In this [.filename]#Makefile#, ports are listed in " "alphabetical order and added to the `SUBDIR` variable, like this:" msgstr "" "Добавление порта в дерево относительно просто. Как только порт готов к " "добавлению, как описано далее crossref:committers-guide[ports-qa-add-new-" "extra,здесь], необходимо добавить запись каталога порта в [." "filename]#Makefile# соответствующей категории. В этом [.filename]#Makefile# " "порты перечислены в алфавитном порядке и добавлены в переменную `SUBDIR`, " "например:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3507 +#: documentation/content/en/articles/committers-guide/_index.adoc:3539 #, no-wrap msgid "\tSUBDIR += newport\n" msgstr "\tSUBDIR += newport\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3510 +#: documentation/content/en/articles/committers-guide/_index.adoc:3542 msgid "" "Once the port and its category's Makefile are ready, the new port can be " "committed:" msgstr "" "После того как порт и Makefile его категории готовы, новый порт можно " "закоммитить:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3515 +#: documentation/content/en/articles/committers-guide/_index.adoc:3547 #, no-wrap msgid "" "% git add category/Makefile category/newport\n" "% git commit\n" "% git push\n" msgstr "" "% git add category/Makefile category/newport\n" "% git commit\n" "% git push\n" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3519 +#: documentation/content/en/articles/committers-guide/_index.adoc:3551 msgid "" "Don't forget to crossref:committers-guide[port-commit-message-formats,setup " "git hooks for the ports tree as explained here]; a specific hook has been " "developed to verify the category's [.filename]#Makefile#." msgstr "" "Не забудьте crossref:committers-guide[port-commit-message-formats,настроить " "git-хуки для дерева портов, как описано здесь]; специальный хук был " "разработан для проверки [.filename]#Makefile# каждой категории." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3522 +#: documentation/content/en/articles/committers-guide/_index.adoc:3554 #, no-wrap msgid "Any other things I need to know when I add a new port?" msgstr "Есть ли что-то еще, что мне нужно знать при добавлении нового порта?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3525 +#: documentation/content/en/articles/committers-guide/_index.adoc:3557 msgid "" "Check the port, preferably to make sure it compiles and packages correctly." msgstr "" "Проверьте порт, желательно убедиться, что он компилируется и собирается в " "пакеты правильно." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3528 +#: documentation/content/en/articles/committers-guide/_index.adoc:3560 msgid "" "The extref:{porters-handbook}testing[Porters Handbook's Testing Chapter] " "contains more detailed instructions. See the extref:{porters-handbook}" "testing[Portclippy / Portfmt, testing-portclippy] and the extref:{porters-" "handbook}testing[poudriere, testing-poudriere] sections." msgstr "" "В главе extref:{porters-handbook}testing[Руководства портировщика по " -"тестированию] содержатся более подробные инструкции. См. разделы extref" -":{porters-handbook}testing[Portclippy / Portfmt, testing-portclippy] и extref" -":{porters-handbook}testing[poudriere, testing-poudriere]." +"тестированию] содержатся более подробные инструкции. См. разделы extref:" +"{porters-handbook}testing[Portclippy / Portfmt, testing-portclippy] и extref:" +"{porters-handbook}testing[poudriere, testing-poudriere]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3530 +#: documentation/content/en/articles/committers-guide/_index.adoc:3562 msgid "" "You do not necessarily have to eliminate all warnings but make sure you have " "fixed the simple ones." msgstr "" "Вам не обязательно устранять все предупреждения, но убедитесь, что исправили " "простые." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3532 +#: documentation/content/en/articles/committers-guide/_index.adoc:3564 msgid "" "If the port came from a submitter who has not contributed to the Project " "before, add that person's name to the extref:{contributors}[Additional " "Contributors, contrib-additional] section of the FreeBSD Contributors List." msgstr "" "Если порт поступил от отправителя, который ранее не участвовал в Проекте, " "добавьте имя этого человека в раздел extref:{contributors}[Дополнительные " "участники, contrib-additional] списка участников FreeBSD." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3535 +#: documentation/content/en/articles/committers-guide/_index.adoc:3567 msgid "" "Close the PR if the port came in as a PR. To close a PR, change the state " "to `Issue Resolved` and the resolution as `Fixed`." msgstr "" "Закройте PR, если порт был отправлен как PR. Чтобы закрыть PR, измените " "состояние на `Issue Resolved` и установите решение как `Fixed`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3539 +#: documentation/content/en/articles/committers-guide/_index.adoc:3571 msgid "" "If for some reason using extref:{porters-handbook}testing[poudriere, testing-" "poudriere] to test the new port is not possible, the bare minimum of testing " "includes this sequence:" msgstr "" -"Если по какой-то причине использование extref:{porters-handbook}testing[" -"poudriere, testing-poudriere] для тестирования нового порта невозможно, " -"минимальный набор тестирования включает следующую последовательность:" +"Если по какой-то причине использование extref:{porters-handbook}" +"testing[poudriere, testing-poudriere] для тестирования нового порта " +"невозможно, минимальный набор тестирования включает следующую " +"последовательность:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3549 +#: documentation/content/en/articles/committers-guide/_index.adoc:3581 #, no-wrap msgid "" "# make install\n" "# make package\n" "# make deinstall\n" "# pkg add package you built above\n" "# make deinstall\n" "# make reinstall\n" "# make package\n" msgstr "" "# make install\n" "# make package\n" "# make deinstall\n" "# pkg add package you built above\n" "# make deinstall\n" "# make reinstall\n" "# make package\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3552 +#: documentation/content/en/articles/committers-guide/_index.adoc:3584 msgid "" "Note that poudriere is the reference for package building, it the port does " "not build in poudriere, it will be removed." msgstr "" "Обратите внимание, что poudriere является эталоном для сборки пакетов. Если " "порт не собирается в poudriere, он будет удалён." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3555 +#: documentation/content/en/articles/committers-guide/_index.adoc:3587 #, no-wrap msgid "Removing an Existing Port" msgstr "Удаление существующего порта" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3558 +#: documentation/content/en/articles/committers-guide/_index.adoc:3590 #, no-wrap msgid "How do I remove an existing port?" msgstr "Как удалить существующий порт?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3561 +#: documentation/content/en/articles/committers-guide/_index.adoc:3593 msgid "" "First, please read the section about repository copies. Before you remove " "the port, you have to verify there are no other ports depending on it." msgstr "" "Сначала прочитайте раздел о копиях репозиториев. Перед удалением порта " "необходимо убедиться, что от него не зависят другие порты." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3563 +#: documentation/content/en/articles/committers-guide/_index.adoc:3595 msgid "Make sure there is no dependency on the port in the ports collection:" msgstr "Убедитесь, что нет зависимостей от порта в коллекции портов:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3564 +#: documentation/content/en/articles/committers-guide/_index.adoc:3596 msgid "The port's PKGNAME appears in exactly one line in a recent INDEX file." msgstr "" "Имя пакета порта (PKGNAME) появляется ровно в одной строке в последнем файле " "INDEX." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3565 +#: documentation/content/en/articles/committers-guide/_index.adoc:3597 msgid "" "No other ports contains any reference to the port's directory or PKGNAME in " "their Makefiles" msgstr "" "Ни один другой порт не содержит ссылок на каталог порта или PKGNAME в своих " "Makefiles" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3569 +#: documentation/content/en/articles/committers-guide/_index.adoc:3601 msgid "" "When using Git, consider using man:git-grep[1], it is much faster than `grep " "-r`." msgstr "" "При использовании Git рассмотрите возможность использования man:git-grep[1], " "так как он значительно быстрее, чем `grep -r`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3572 +#: documentation/content/en/articles/committers-guide/_index.adoc:3604 msgid "Then, remove the port:" msgstr "Затем удалите порт:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3576 +#: documentation/content/en/articles/committers-guide/_index.adoc:3608 msgid "Remove the port's files and directory with `git rm`." msgstr "Удалите файлы и каталог порта с помощью `git rm`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3577 +#: documentation/content/en/articles/committers-guide/_index.adoc:3609 msgid "" "Remove the `SUBDIR` listing of the port in the parent directory [." "filename]#Makefile#." msgstr "" "Удалите указание `SUBDIR` для порта в [.filename]#Makefile# родительского " "каталога." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3578 -#: documentation/content/en/articles/committers-guide/_index.adoc:3593 +#: documentation/content/en/articles/committers-guide/_index.adoc:3610 +#: documentation/content/en/articles/committers-guide/_index.adoc:3625 msgid "Add an entry to [.filename]#ports/MOVED#." msgstr "Добавьте запись в [.filename]#ports/MOVED#." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3579 +#: documentation/content/en/articles/committers-guide/_index.adoc:3611 msgid "Remove the port from [.filename]#ports/LEGAL# if it is there." msgstr "Удалите порт из [.filename]#ports/LEGAL#, если он там присутствует." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3584 +#: documentation/content/en/articles/committers-guide/_index.adoc:3616 msgid "" "Alternatively, you can use the rmport script, from [.filename]#ports/Tools/" "scripts#. This script was written by {vd}. When sending questions about " "this script to the {freebsd-ports}, please also CC {crees}, the current " "maintainer." msgstr "" "Альтернативно, вы можете использовать скрипт rmport из [.filename]#ports/" "Tools/scripts#. Этот скрипт был написан {vd}. При отправке вопросов об этом " "скрипте в {freebsd-ports}, пожалуйста, также копируйте {crees}, текущего " "сопровождающего." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3586 +#: documentation/content/en/articles/committers-guide/_index.adoc:3618 #, no-wrap msgid "How do I move a port to a new location?" msgstr "Как переместить порт в новое место?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3591 +#: documentation/content/en/articles/committers-guide/_index.adoc:3623 msgid "" "Perform a thorough check of the ports collection for any dependencies on the " "old port location/name, and update them. Running `grep` on [." "filename]#INDEX# is not enough because some ports have dependencies enabled " "by compile-time options. A full man:git-grep[1] of the ports collection is " "recommended." msgstr "" "Выполните тщательную проверку коллекции портов на наличие зависимостей от " "старого расположения или имени порта и обновите их. Запуск `grep` по файлу [." "filename]#INDEX# недостаточен, поскольку некоторые порты имеют зависимости, " "включённые через параметры компиляции. Рекомендуется выполнить полный поиск " "с помощью man:git-grep[1] по коллекции портов." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3592 +#: documentation/content/en/articles/committers-guide/_index.adoc:3624 msgid "" "Remove the `SUBDIR` entry from the old category Makefile and add a `SUBDIR` " "entry to the new category Makefile." msgstr "" "Удалите запись `SUBDIR` из Makefile старой категории и добавьте запись " "`SUBDIR` в Makefile новой категории." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3594 +#: documentation/content/en/articles/committers-guide/_index.adoc:3626 msgid "" "Search for entries in xml files inside [.filename]#ports/security/vuxml# and " "adjust them accordingly. In particular, check for previous packages with the " "new name which version could include the new port." msgstr "" "Поищите записи в xml-файлах внутри [.filename]#ports/security/vuxml# и " "скорректируйте их соответствующим образом. В частности, проверьте предыдущие " "пакеты с новым именем, версия которых может включать новый порт." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3595 +#: documentation/content/en/articles/committers-guide/_index.adoc:3627 msgid "Move the port with `git mv`." msgstr "Переместите порт с помощью `git mv`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3596 -#: documentation/content/en/articles/committers-guide/_index.adoc:3607 +#: documentation/content/en/articles/committers-guide/_index.adoc:3628 +#: documentation/content/en/articles/committers-guide/_index.adoc:3639 msgid "Commit the changes." msgstr "Зафиксируйте изменения." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3599 +#: documentation/content/en/articles/committers-guide/_index.adoc:3631 #, no-wrap msgid "How do I copy a port to a new location?" msgstr "Как скопировать порт в новое место?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3604 +#: documentation/content/en/articles/committers-guide/_index.adoc:3636 msgid "Copy port with `cp -R old-cat/old-port new-cat/new-port`." msgstr "Скопируйте порт с помощью `cp -R old-cat/old-port new-cat/new-port`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3605 +#: documentation/content/en/articles/committers-guide/_index.adoc:3637 msgid "Add the new port to the [.filename]#new-cat/Makefile#." msgstr "Добавьте новый порт в файл [.filename]#new-cat/Makefile#." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3606 +#: documentation/content/en/articles/committers-guide/_index.adoc:3638 msgid "Change stuff in [.filename]#new-cat/new-port#." msgstr "Измените содержимое в [.filename]#new-cat/new-port#." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3610 +#: documentation/content/en/articles/committers-guide/_index.adoc:3642 #, no-wrap msgid "Ports Freeze" msgstr "Заморозка портов" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3613 +#: documentation/content/en/articles/committers-guide/_index.adoc:3645 #, no-wrap msgid "What is a “ports freeze”?" msgstr "Что такое «заморозка портов»?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3620 +#: documentation/content/en/articles/committers-guide/_index.adoc:3652 msgid "" "A “ports freeze” was a restricted state the ports tree was put in before a " "release. It was used to ensure a higher quality for the packages shipped " "with a release. It usually lasted a couple of weeks. During that time, " "build problems were fixed, and the release packages were built. This " "practice is no longer used, as the packages for the releases are built from " "the current stable, quarterly branch." msgstr "" "«Заморозка портов» (ports freeze) — это ограниченное состояние, в которое " "дерево портов переводилось перед выпуском релиза. Оно использовалось для " "обеспечения более высокого качества пакетов, поставляемых с релизом. Обычно " "это длилось несколько недель. В течение этого времени исправлялись проблемы " "со сборкой, а также строились пакеты для релиза. Эта практика больше не " "применяется, так как пакеты для релизов теперь собираются из текущей " "стабильной квартальной ветки." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3623 +#: documentation/content/en/articles/committers-guide/_index.adoc:3655 msgid "" "For more information on how to merge commits to the quarterly branch, see " "crossref:committers-guide[ports-qa-misc-request-mfh, What is the procedure " "to request authorization for merging a commit to the quarterly branch?]." msgstr "" "Для получения дополнительной информации о том, как делать слияние коммитов в " "квартальную ветку, см. crossref:committers-guide[ports-qa-misc-request-mfh, " "Какова процедура получения разрешения на слияние коммита с квартальной " "веткой?]." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3625 +#: documentation/content/en/articles/committers-guide/_index.adoc:3657 #, no-wrap msgid "Quarterly Branches" msgstr "Квартальные ветки" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3628 +#: documentation/content/en/articles/committers-guide/_index.adoc:3660 #, no-wrap msgid "What is the procedure to request authorization for merging a commit to the quarterly branch?" -msgstr "" -"Какова процедура получения разрешения на слияние коммита с квартальной " -"веткой?" +msgstr "Какова процедура получения разрешения на слияние коммита с квартальной веткой?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3631 +#: documentation/content/en/articles/committers-guide/_index.adoc:3663 msgid "" "As of November 30, 2020, there is no need to seek explicit approval to " "commit to the quarterly branch." msgstr "" "По состоянию на 30 ноября 2020 года явное одобрение для внесения изменений в " "квартальную ветку не требуется." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3633 +#: documentation/content/en/articles/committers-guide/_index.adoc:3665 #, no-wrap msgid "What is the procedure for merging commits to the quarterly branch?" msgstr "Какова процедура слияния коммитов в квартальную ветку?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3636 +#: documentation/content/en/articles/committers-guide/_index.adoc:3668 msgid "" "Merging commits to the quarterly branch (a process we call MFH for a " "historical reason) is very similar to MFC'ing a commit in the src " "repository, so basically:" msgstr "" "Слияние коммитов в квартальную ветку (процесс, который мы по историческим " "причинам называем MFH) очень похоже на MFC коммитов в репозитории src, " "поэтому в основном:" #. type: delimited block . 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3642 +#: documentation/content/en/articles/committers-guide/_index.adoc:3674 #, no-wrap msgid "" "% git checkout 2021Q2\n" "% git cherry-pick -x $HASH\n" "(verify everything is OK, for example by doing a build test)\n" "% git push\n" msgstr "" "% git checkout 2021Q2\n" "% git cherry-pick -x $HASH\n" "(verify everything is OK, for example by doing a build test)\n" "% git push\n" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3646 +#: documentation/content/en/articles/committers-guide/_index.adoc:3678 msgid "" "where `$HASH` is the hash of the commit you want to copy over to the " "quarterly branch. The `-x` parameter ensures the hash `$HASH` of the `main` " "branch is included in the new commit message of the quarterly branch." msgstr "" "где `$HASH` — это хэш коммита, который вы хотите скопировать в квартальную " "ветку. Параметр `-x` гарантирует, что хэш `$HASH` из ветки `main` будет " "включён в новое сообщение коммита в квартальной ветке." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3648 +#: documentation/content/en/articles/committers-guide/_index.adoc:3680 #, no-wrap msgid "Creating a New Category" msgstr "Создание новой категории" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3651 +#: documentation/content/en/articles/committers-guide/_index.adoc:3683 #, no-wrap msgid "What is the procedure for creating a new category?" msgstr "Какова процедура создания новой категории?" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3656 +#: documentation/content/en/articles/committers-guide/_index.adoc:3688 msgid "" -"Please see extref:{porters-handbook}[Proposing a New Category, proposing-" -"categories] in the Porter's Handbook. Once that procedure has been followed " -"and the PR has been assigned to the {portmgr}, it is their decision whether " -"or not to approve it. If they do, it is their responsibility to:" +"Please see extref:{porters-handbook}makefiles[Proposing a New Category, " +"proposing-categories] in the Porter's Handbook. Once that procedure has " +"been followed and the PR has been assigned to the {portmgr}, it is their " +"decision whether or not to approve it. If they do, it is their " +"responsibility to:" msgstr "" -"Пожалуйста, ознакомьтесь с extref:{porters-handbook}makefiles/[Предложение " +"Пожалуйста, ознакомьтесь с extref:{porters-handbook}makefiles[Предложение " "новой категории, proposing-categories] в Руководстве FreeBSD по созданию " "портов. После выполнения этой процедуры и назначения PR в группе — {portmgr}" ", решение об одобрении принимается ими. Если решение положительное, их " "обязанностью является:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3660 +#: documentation/content/en/articles/committers-guide/_index.adoc:3692 msgid "Perform any needed moves. (This only applies to physical categories.)" msgstr "" "Выполните все необходимые перемещения. (Это применимо только к физическим " "категориям.)" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3661 +#: documentation/content/en/articles/committers-guide/_index.adoc:3693 msgid "" "Update the `VALID_CATEGORIES` definition in [.filename]#ports/Mk/bsd.port." "mk#." msgstr "" -"Обновите определение `VALID_CATEGORIES` в файле [.filename]#ports/Mk/bsd.port" -".mk#." +"Обновите определение `VALID_CATEGORIES` в файле [.filename]#ports/Mk/bsd." +"port.mk#." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3662 +#: documentation/content/en/articles/committers-guide/_index.adoc:3694 msgid "Assign the PR back to you." msgstr "Назначить PR обратно на вас." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3665 +#: documentation/content/en/articles/committers-guide/_index.adoc:3697 #, no-wrap msgid "What do I need to do to implement a new physical category?" msgstr "Что мне нужно сделать для создания новой физической категории?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3670 +#: documentation/content/en/articles/committers-guide/_index.adoc:3702 msgid "" "Upgrade each moved port's [.filename]#Makefile#. Do not connect the new " "category to the build yet." msgstr "" "Обновите [.filename]#Makefile# каждого перемещенного порта. Пока не " "подключайте новую категорию к сборке." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3672 +#: documentation/content/en/articles/committers-guide/_index.adoc:3704 msgid "To do this, you will need to:" msgstr "Для этого вам потребуется:" #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:3676 +#: documentation/content/en/articles/committers-guide/_index.adoc:3708 msgid "" "Change the port's `CATEGORIES` (this was the point of the exercise, " "remember?) The new category is listed first. This will help to ensure that " "the PKGORIGIN is correct." msgstr "" "Измените `CATEGORIES` порта (это была цель упражнения, помните?). Новая " "категория указана первой. Это поможет убедиться, что PKGORIGIN указан " "правильно." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:3677 +#: documentation/content/en/articles/committers-guide/_index.adoc:3709 msgid "" "Run a `make describe`. Since the top-level `make index` that you will be " "running in a few steps is an iteration of `make describe` over the entire " "ports hierarchy, catching any errors here will save you having to re-run " "that step later on." msgstr "" "Выполните команду `make describe`. Поскольку команда `make index` верхнего " "уровня, которую вы запустите через несколько шагов, является итерацией `make " "describe` для всей иерархии портов, обнаружение ошибок на этом этапе " "сэкономит время, избавив от необходимости перезапускать этот шаг позже." #. type: delimited block = 6 -#: documentation/content/en/articles/committers-guide/_index.adoc:3678 +#: documentation/content/en/articles/committers-guide/_index.adoc:3710 msgid "" "If you want to be really thorough, now might be a good time to run man:" "portlint[1]." msgstr "" "Если вы хотите быть действительно тщательным, сейчас может быть подходящее " "время запустить man:portlint[1]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3681 +#: documentation/content/en/articles/committers-guide/_index.adoc:3713 msgid "" "Check that the ``PKGORIGIN``s are correct. The ports system uses each port's " "`CATEGORIES` entry to create its `PKGORIGIN`, which is used to connect " "installed packages to the port directory they were built from. If this entry " "is wrong, common port tools like man:pkg-version[8] and man:portupgrade[1] " "fail." msgstr "" "Проверьте, что значения ``PKGORIGIN`` указаны верно. Система портов " "использует запись `CATEGORIES` каждого порта для создания его `PKGORIGIN`, " "который служит для связи установленных пакетов с директорией порта, из " "которого они были собраны. Если эта запись неверна, такие распространённые " -"инструменты для работы с портами, как man:pkg-version[8] и man:portupgrade[1]" -", не будут работать." +"инструменты для работы с портами, как man:pkg-version[8] и man:" +"portupgrade[1], не будут работать." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3683 +#: documentation/content/en/articles/committers-guide/_index.adoc:3715 msgid "" "To do this, use the [.filename]#chkorigin.sh# tool: `env PORTSDIR=/path/to/" "ports sh -e /path/to/ports/Tools/scripts/chkorigin.sh`. This will check " "every port in the ports tree, even those not connected to the build, so you " "can run it directly after the move operation. Hint: do not forget to look at " "the ``PKGORIGIN``s of any slave ports of the ports you just moved!" msgstr "" "Для этого используйте инструмент [.filename]#chkorigin.sh#: `env PORTSDIR=/" "path/to/ports sh -e /path/to/ports/Tools/scripts/chkorigin.sh`. Это проверит " "каждый порт в дереве портов, даже те, которые не связаны со сборкой, поэтому " "вы можете запустить его сразу после операции перемещения. Подсказка: не " "забудьте проверить ``PKGORIGIN`` для всех подчинённых портов (slave ports) " "тех портов, которые вы только что переместили!" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3684 +#: documentation/content/en/articles/committers-guide/_index.adoc:3716 msgid "" "On your own local system, test the proposed changes: first, comment out the " "SUBDIR entries in the old ports' categories' [.filename]##Makefile##s; then " "enable building the new category in [.filename]#ports/Makefile#. Run make " "checksubdirs in the affected category directories to check the SUBDIR " "entries. Next, in the [.filename]#ports/# directory, run make index. This " "can take over 40 minutes on even modern systems; however, it is a necessary " "step to prevent problems for other people." msgstr "" "На вашей локальной системе протестируйте предлагаемые изменения: сначала " "закомментируйте записи SUBDIR в файлах [.filename]##Makefile## старых " "категорий портов; затем включите сборку новой категории в [.filename]#ports/" "Makefile#. Запустите `make checksubdirs` в затронутых каталогах категорий, " "чтобы проверить записи SUBDIR. Затем в каталоге [.filename]#ports/# " "выполните `make index`. Это может занять более 40 минут даже на современных " "системах; однако это необходимый шаг для предотвращения проблем у других " "пользователей." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3685 +#: documentation/content/en/articles/committers-guide/_index.adoc:3717 msgid "" "Once this is done, you can commit the updated [.filename]#ports/Makefile# to " "connect the new category to the build and also commit the [." "filename]#Makefile# changes for the old category or categories." msgstr "" -"После этого можно зафиксировать обновлённый файл [.filename]#ports/Makefile#" -", чтобы подключить новую категорию к сборке, а также сделать коммит " +"После этого можно зафиксировать обновлённый файл [.filename]#ports/" +"Makefile#, чтобы подключить новую категорию к сборке, а также сделать коммит " "изменениям в файле [.filename]#Makefile# для старой категории или категорий." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3686 +#: documentation/content/en/articles/committers-guide/_index.adoc:3718 msgid "Add appropriate entries to [.filename]#ports/MOVED#." msgstr "Добавьте соответствующие записи в [.filename]#ports/MOVED#." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3687 +#: documentation/content/en/articles/committers-guide/_index.adoc:3719 msgid "Update the documentation by modifying:" msgstr "Обновите документацию, изменив:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3688 -#: documentation/content/en/articles/committers-guide/_index.adoc:3697 +#: documentation/content/en/articles/committers-guide/_index.adoc:3720 +#: documentation/content/en/articles/committers-guide/_index.adoc:3729 msgid "" -"the extref:{porters-handbook}[list of categories, PORTING-CATEGORIES] in the " -"Porter's Handbook" +"the extref:{porters-handbook}makefiles[list of categories, porting-" +"categories] in the Porter's Handbook" msgstr "" "extref:{porters-handbook}makefiles/[список категорий, porting-categories] в " "Руководстве FreeBSD по созданию портов" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3690 +#: documentation/content/en/articles/committers-guide/_index.adoc:3722 msgid "" "Only once all the above have been done, and no one is any longer reporting " "problems with the new ports, should the old ports be deleted from their " "previous locations in the repository." msgstr "" "Только после того, как все вышеперечисленное будет выполнено и больше никто " "не сообщает о проблемах с новыми портами, старые порты следует удалить из их " "прежних мест в репозитории." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3692 +#: documentation/content/en/articles/committers-guide/_index.adoc:3724 #, no-wrap msgid "What do I need to do to implement a new virtual category?" msgstr "Что мне нужно сделать для создания новой виртуальной категории?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3695 +#: documentation/content/en/articles/committers-guide/_index.adoc:3727 msgid "" "This is much simpler than a physical category. Only a few modifications are " "needed:" msgstr "" "Это намного проще, чем физическая категория. Требуется всего несколько " "изменений:" #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3699 -#: documentation/content/en/articles/committers-guide/_index.adoc:3793 +#: documentation/content/en/articles/committers-guide/_index.adoc:3731 +#: documentation/content/en/articles/committers-guide/_index.adoc:3825 #, no-wrap msgid "Miscellaneous Questions" msgstr "Разные вопросы" #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3702 +#: documentation/content/en/articles/committers-guide/_index.adoc:3734 #, no-wrap msgid "Are there changes that can be committed without asking the maintainer for approval?" -msgstr "" -"Существуют ли изменения, которые можно зафиксировать без запроса одобрения у " -"сопровождающего?" +msgstr "Существуют ли изменения, которые можно зафиксировать без запроса одобрения у сопровождающего?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3705 +#: documentation/content/en/articles/committers-guide/_index.adoc:3737 msgid "Blanket approval for most ports applies to these types of fixes:" msgstr "" "Общее одобрение для большинства портов применяется к следующим типам " "исправлений:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3707 +#: documentation/content/en/articles/committers-guide/_index.adoc:3739 msgid "" "Most infrastructure changes to a port (that is, modernizing, but not " "changing the functionality). For example, the blanket covers converting to " "new `USES` macros, enabling verbose builds, and switching to new ports " "system syntaxes." msgstr "" "Большинство изменений инфраструктуры порта (то есть модернизация без " "изменения функциональности). Например, это включает переход на новые макросы " "`USES`, включение подробных сборок и переход на новые синтаксисы системы " "портов." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3708 +#: documentation/content/en/articles/committers-guide/_index.adoc:3740 msgid "Trivial and _tested_ build and runtime fixes." msgstr "Тривиальные и _проверенные_ исправления для сборки и выполнения." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3709 +#: documentation/content/en/articles/committers-guide/_index.adoc:3741 msgid "" "Documentations or metadata changes to ports, like [.filename]#pkg-descr# or " "`COMMENT`." msgstr "" "Документация или изменения метаданных для портов, такие как [.filename]#pkg-" "descr# или `COMMENT`." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3714 +#: documentation/content/en/articles/committers-guide/_index.adoc:3746 msgid "" "Exceptions to this are anything maintained by the {portmgr}, or the " "{security-officer}. No unauthorized commits may ever be made to ports " "maintained by those groups." msgstr "" "Исключениями являются любые компоненты, поддерживаемые {portmgr} или " "{security-officer}. Несанкционированные коммиты в порты, которые " "поддерживаются этими группами, недопустимы." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3717 +#: documentation/content/en/articles/committers-guide/_index.adoc:3749 #, no-wrap msgid "How do I know if my port is building correctly or not?" msgstr "Как узнать, мой порт собирается правильно или нет?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3721 +#: documentation/content/en/articles/committers-guide/_index.adoc:3753 msgid "" "The packages are built multiple times each week. If a port fails, the " "maintainer will receive an email from `pkg-fallout@FreeBSD.org`." msgstr "" "Пакеты собираются несколько раз в неделю. Если сборка порта завершается " "неудачно, сопровождающий получит письмо от `pkg-fallout@FreeBSD.org`." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3723 +#: documentation/content/en/articles/committers-guide/_index.adoc:3755 msgid "" "Reports for all the package builds (official, experimental, and non-" -"regression) are aggregated at link:pkg-status.FreeBSD.org[pkg-status.FreeBSD." -"org]." +"regression) are aggregated at link:https://pkg-status.FreeBSD.org[pkg-status." +"FreeBSD.org]." msgstr "" "Отчеты по всем сборкам пакетов (официальные, экспериментальные и без " -"регрессии) агрегируются на link:pkg-status.FreeBSD.org[pkg-status.FreeBSD." -"org]." +"регрессии) агрегируются на link:https://pkg-status.FreeBSD.org[pkg-status." +"FreeBSD.org]." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3725 +#: documentation/content/en/articles/committers-guide/_index.adoc:3757 #, no-wrap msgid "I added a new port. Do I need to add it to the [.filename]#INDEX#?" msgstr "Я добавил новый порт. Нужно ли добавлять его в [.filename]#INDEX#?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3728 +#: documentation/content/en/articles/committers-guide/_index.adoc:3760 msgid "" "No. The file can either be generated by running `make index`, or a pre-" "generated version can be downloaded with `make fetchindex`." msgstr "" "Нет. Файл может быть создан выполнением команды `make index`, или можно " "загрузить предварительно сгенерированную версию с помощью `make fetchindex`." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3730 +#: documentation/content/en/articles/committers-guide/_index.adoc:3762 #, no-wrap msgid "Are there any other files I am not allowed to touch?" msgstr "Есть ли другие файлы, которые мне нельзя изменять?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3734 +#: documentation/content/en/articles/committers-guide/_index.adoc:3766 msgid "" "Any file directly under [.filename]#ports/#, or any file under a " "subdirectory that starts with an uppercase letter ([.filename]#Mk/#, [." "filename]#Tools/#, etc.). In particular, the {portmgr} is very protective " "of [.filename]#ports/Mk/bsd.port*.mk# so do not commit changes to those " "files unless you want to face their wrath." msgstr "" "Любой файл непосредственно в [.filename]#ports/# или любой файл в " -"подкаталоге, название которого начинается с заглавной буквы ([.filename]#Mk/#" -", [.filename]#Tools/# и т.д.). В частности, {portmgr} очень ревностно " +"подкаталоге, название которого начинается с заглавной буквы ([.filename]#Mk/" +"#, [.filename]#Tools/# и т.д.). В частности, {portmgr} очень ревностно " "относится к [.filename]#ports/Mk/bsd.port*.mk#, поэтому не вносите изменения " "в эти файлы, если не хотите навлечь на себя их гнев." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3736 +#: documentation/content/en/articles/committers-guide/_index.adoc:3768 #, no-wrap msgid "What is the proper procedure for updating the checksum for a port distfile when the file changes without a version change?" -msgstr "" -"Как правильно обновить контрольную сумму для distfile порта, если файл " -"изменился без изменения версии?" +msgstr "Как правильно обновить контрольную сумму для distfile порта, если файл изменился без изменения версии?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3740 +#: documentation/content/en/articles/committers-guide/_index.adoc:3772 msgid "" "When the checksum for a distribution file is updated due to the author " "updating the file without changing the port revision, the commit message " "includes a summary of the relevant diffs between the original and new " "distfile to ensure that the distfile has not been corrupted or maliciously " "altered. If the current version of the port has been in the ports tree for " "a while, a copy of the old distfile will usually be available on the ftp " "servers; otherwise the author or maintainer should be contacted to find out " "why the distfile has changed." msgstr "" "Когда контрольная сумма файла дистрибутива обновляется из-за того, что автор " "обновил файл без изменения ревизии порта, сообщение коммита включает сводку " "соответствующих различий между оригинальным и новым файлом дистрибутива, " "чтобы убедиться, что файл дистрибутива не был повреждён или злонамеренно " "изменён. Если текущая версия порта находится в дереве портов уже некоторое " "время, копия старого файла дистрибутива обычно доступна на FTP-серверах; в " "противном случае следует связаться с автором или сопровождающим, чтобы " "выяснить, почему файл дистрибутива изменился." #. type: Title ==== -#: documentation/content/en/articles/committers-guide/_index.adoc:3742 +#: documentation/content/en/articles/committers-guide/_index.adoc:3774 #, no-wrap msgid "How can an experimental test build of the ports tree (exp-run) be requested?" -msgstr "" -"Как можно запросить экспериментальную тестовую сборку дерева портов (exp-" -"run)?" +msgstr "Как можно запросить экспериментальную тестовую сборку дерева портов (exp-run)?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3746 +#: documentation/content/en/articles/committers-guide/_index.adoc:3778 msgid "" "An exp-run must be completed before patches with a significant ports impact " "are committed. The patch can be against the ports tree or the base system." msgstr "" "Перед коммитом изменений, оказывающих значительное влияние на порты, " "необходимо выполнить тестовый прогон (exp-run). Исправление может относиться " "как к дереву портов, так и к базовой системе." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3748 +#: documentation/content/en/articles/committers-guide/_index.adoc:3780 msgid "" "Full package builds will be done with the patches provided by the submitter, " "and the submitter is required to fix detected problems _(fallout)_ before " "commit." msgstr "" "Полные сборки пакетов будут выполнены с патчами, предоставленными " "отправителем, и отправитель обязан исправить обнаруженные проблемы _(падения " "сборки и т.п.)_ перед коммитом." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3752 +#: documentation/content/en/articles/committers-guide/_index.adoc:3784 msgid "Go to the link:https://bugs.freebsd.org/submit[Bugzilla new PR page]." msgstr "" "Перейдите по ссылке link:https://bugs.freebsd.org/submit[Страница создания " "новой PR в Bugzilla]." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3753 +#: documentation/content/en/articles/committers-guide/_index.adoc:3785 msgid "Select the product your patch is about." msgstr "Выберите продукт, к которому относится ваш патч." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3754 +#: documentation/content/en/articles/committers-guide/_index.adoc:3786 msgid "Fill in the bug report as normal. Remember to attach the patch." msgstr "" "Заполните отчёт об ошибке как обычно. Не забудьте приложить исправление." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3755 +#: documentation/content/en/articles/committers-guide/_index.adoc:3787 msgid "" "If at the top it says “Show Advanced Fields” click on it. It will now say " "“Hide Advanced Fields”. Many new fields will be available. If it already " "says “Hide Advanced Fields”, no need to do anything." msgstr "" "Если вверху написано «Показать дополнительные поля (Show Advanced Fields)», " "нажмите на это. Теперь будет написано «Скрыть дополнительные поля (Hide " -"Advanced Fields)». Станут доступны многие новые поля. Если уже написано «" -"Скрыть дополнительные поля», ничего делать не нужно." +"Advanced Fields)». Станут доступны многие новые поля. Если уже написано " +"«Скрыть дополнительные поля», ничего делать не нужно." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3756 +#: documentation/content/en/articles/committers-guide/_index.adoc:3788 msgid "" "In the “Flags” section, set the “exp-run” one to `?`. As for all other " "fields, hovering the mouse over any field shows more details." msgstr "" "В разделе «Flags» установите флаг «exp-run» в значение `?`. Для всех " "остальных полей при наведении курсора на любое поле отображаются " "дополнительные сведения." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3757 +#: documentation/content/en/articles/committers-guide/_index.adoc:3789 msgid "Submit. Wait for the build to run." msgstr "Отправьте. Дождитесь завершения сборки." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3758 +#: documentation/content/en/articles/committers-guide/_index.adoc:3790 msgid "{portmgr} will reply with a possible fallout." msgstr "{portmgr} ответит с информацией возможных падениях." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3759 +#: documentation/content/en/articles/committers-guide/_index.adoc:3791 msgid "Depending on the fallout:" msgstr "В зависимости от последствий:" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3760 +#: documentation/content/en/articles/committers-guide/_index.adoc:3792 msgid "" "If there is no fallout, the procedure stops here, and the change can be " "committed, pending any other approval required." msgstr "" "Если последствий нет, процедура останавливается здесь, и изменение может " "быть закоммичено, ожидая любых других необходимых утверждений." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3761 +#: documentation/content/en/articles/committers-guide/_index.adoc:3793 msgid "" "If there is fallout, it _must_ be fixed, either by fixing the ports directly " "in the ports tree, or adding to the submitted patch." msgstr "" "Если возникнут проблемы, их _необходимо_ исправить, либо напрямую в дереве " "портов, либо добавив изменения в предоставленный патч." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3762 +#: documentation/content/en/articles/committers-guide/_index.adoc:3794 msgid "" "When this is done, go back to step 6 saying the fallout was fixed and wait " "for the exp-run to be run again. Repeat as long as there are broken ports." msgstr "" "После этого вернитесь к шагу 6, указав, что проблема устранена, и дождитесь " "повторного запуска exp-run. Повторяйте, пока остаются неисправные порты." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3765 +#: documentation/content/en/articles/committers-guide/_index.adoc:3797 #, no-wrap msgid "Issues Specific to Developers Who Are Not Committers" msgstr "Проблемы, характерные для разработчиков, не являющихся коммиттерами" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3770 +#: documentation/content/en/articles/committers-guide/_index.adoc:3802 msgid "" "A few people who have access to the FreeBSD machines do not have commit " "bits. Almost all of this document will apply to these developers as well " "(except things specific to commits and the mailing list memberships that go " "with them). In particular, we recommend that you read:" msgstr "" "Несколько людей, имеющих доступ к машинам FreeBSD, не обладают правами на " "коммиты. Почти все положения этого документа применимы и к таким " "разработчикам (за исключением аспектов, специфичных для коммитов и " "связанного с ними членства в рассылках). В частности, мы рекомендуем " "ознакомиться со следующим:" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3772 +#: documentation/content/en/articles/committers-guide/_index.adoc:3804 msgid "crossref:committers-guide[admin, Administrative Details]" msgstr "crossref:committers-guide[admin,Административные детали]" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3773 +#: documentation/content/en/articles/committers-guide/_index.adoc:3805 msgid "crossref:committers-guide[conventions-everyone, For Everyone]" msgstr "crossref:committers-guide[conventions-everyone, Для всех]" #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3777 +#: documentation/content/en/articles/committers-guide/_index.adoc:3809 msgid "" "Get your mentor to add you to the \"Additional Contributors\" ([." "filename]#doc/shared/contrib-additional.adoc#), if you are not already " "listed there." msgstr "" -"Попросите вашего наставника добавить вас в список \"Дополнительные " -"участники\" ([.filename]#doc/shared/contrib-additional.adoc#), если вас там " -"еще нет." +"Попросите вашего наставника добавить вас в список \"Дополнительные участники" +"\" ([.filename]#doc/shared/contrib-additional.adoc#), если вас там еще нет." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3779 +#: documentation/content/en/articles/committers-guide/_index.adoc:3811 msgid "crossref:committers-guide[developer.relations, Developer Relations]" msgstr "" "crossref:committers-guide[developer.relations, Отношения с разработчиками]" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3780 +#: documentation/content/en/articles/committers-guide/_index.adoc:3812 msgid "crossref:committers-guide[ssh.guide, SSH Quick-Start Guide]" msgstr "" "crossref:committers-guide[ssh.guide, Руководство по быстрому началу работы с " "SSH]" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3781 +#: documentation/content/en/articles/committers-guide/_index.adoc:3813 msgid "" "crossref:committers-guide[rules, The FreeBSD Committers' Big List of Rules]" msgstr "" "crossref:committers-guide[rules, Большой список правил коммиттеров FreeBSD]" #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3783 +#: documentation/content/en/articles/committers-guide/_index.adoc:3815 #, no-wrap msgid "Information About Google Analytics" msgstr "Информация о Google Analytics" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3786 +#: documentation/content/en/articles/committers-guide/_index.adoc:3818 msgid "" "As of December 12, 2012, Google Analytics was enabled on the FreeBSD Project " "website to collect anonymized usage statistics regarding usage of the site." msgstr "" "По состоянию на 12 декабря 2012 года на сайте проекта FreeBSD был включен " "Google Analytics для сбора анонимной статистики использования сайта." #. type: Plain text -#: documentation/content/en/articles/committers-guide/_index.adoc:3790 +#: documentation/content/en/articles/committers-guide/_index.adoc:3822 msgid "" "As of March 3, 2022, Google Analytics was removed from the FreeBSD Project." msgstr "" "По состоянию на 3 марта 2022 года Google Analytics был удалён из проекта " "FreeBSD." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3795 +#: documentation/content/en/articles/committers-guide/_index.adoc:3827 #, no-wrap msgid "How do I access people.FreeBSD.org to put up personal or project information?" -msgstr "" -"Как получить доступ к people.FreeBSD.org для размещения личной или проектной " -"информации?" +msgstr "Как получить доступ к people.FreeBSD.org для размещения личной или проектной информации?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3799 +#: documentation/content/en/articles/committers-guide/_index.adoc:3831 msgid "" "`people.FreeBSD.org` is the same as `freefall.FreeBSD.org`. Just create a [." "filename]#public_html# directory. Anything you place in that directory will " "automatically be visible under https://people.FreeBSD.org/[https://people." "FreeBSD.org/]." msgstr "" "`people.FreeBSD.org` — это то же самое, что и `freefall.FreeBSD.org`. Просто " "создайте каталог [.filename]#public_html#. Всё, что вы поместите в этот " "каталог, будет автоматически доступно по адресу https://people.FreeBSD.org/" "[https://people.FreeBSD.org/]." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3800 +#: documentation/content/en/articles/committers-guide/_index.adoc:3832 #, no-wrap msgid "Where are the mailing list archives stored?" msgstr "Где хранятся архивы списков рассылки?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3803 +#: documentation/content/en/articles/committers-guide/_index.adoc:3835 msgid "" "The mailing lists are archived under [.filename]#/local/mail# on `freefall." "FreeBSD.org`." msgstr "" "Списки рассылки архивируются в [.filename]#/local/mail# на `freefall.FreeBSD." "org`." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3804 +#: documentation/content/en/articles/committers-guide/_index.adoc:3836 #, no-wrap msgid "I would like to mentor a new committer. What process do I need to follow?" -msgstr "" -"Я хочу стать наставником нового коммиттера. Какой процесс мне нужно пройти?" +msgstr "Я хочу стать наставником нового коммиттера. Какой процесс мне нужно пройти?" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3807 +#: documentation/content/en/articles/committers-guide/_index.adoc:3839 msgid "" "See the https://www.freebsd.org/internal/new-account/[New Account Creation " "Procedure] document on the internal pages." msgstr "" "См. документ https://www.freebsd.org/internal/new-account/[Процедура " "создания новой учётной записи] на внутренних страницах." #. type: Title == -#: documentation/content/en/articles/committers-guide/_index.adoc:3809 +#: documentation/content/en/articles/committers-guide/_index.adoc:3841 #, no-wrap msgid "Benefits and Perks for FreeBSD Committers" msgstr "Преимущества и привилегии для коммиттеров FreeBSD" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3812 +#: documentation/content/en/articles/committers-guide/_index.adoc:3844 #, no-wrap msgid "Recognition" msgstr "Признание" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3816 +#: documentation/content/en/articles/committers-guide/_index.adoc:3848 msgid "" "Recognition as a competent software engineer is the longest lasting value. " "In addition, getting a chance to work with some of the best people that " "every engineer would dream of meeting is a great perk!" msgstr "" "Признание в качестве квалифицированного инженера-программиста — это самая " "долговечная ценность. Кроме того, возможность работать с одними из лучших " "специалистов, о встрече с которыми мечтает любой инженер, — это отличный " "бонус!" #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3818 +#: documentation/content/en/articles/committers-guide/_index.adoc:3850 #, no-wrap msgid "FreeBSD Mall" msgstr "FreeBSD Mall" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3821 +#: documentation/content/en/articles/committers-guide/_index.adoc:3853 msgid "" "FreeBSD committers can get a free 4-CD or DVD set at conferences from http://" "www.freebsdmall.com[FreeBSD Mall, Inc.]." msgstr "" "Коммиттеры FreeBSD могут бесплатно получить набор из 4 CD или DVD на " "конференциях через http://www.freebsdmall.com[FreeBSD Mall, Inc.]." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3823 +#: documentation/content/en/articles/committers-guide/_index.adoc:3855 #, no-wrap msgid "`Gandi.net`" msgstr "`Gandi.net`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3826 +#: documentation/content/en/articles/committers-guide/_index.adoc:3858 msgid "" "https://gandi.net[Gandi] provides website hosting, cloud computing, domain " "registration, and X.509 certificate services." msgstr "" "https://gandi.net[Gandi] предоставляет услуги хостинга веб-сайтов, облачных " "вычислений, регистрации доменов и сертификатов X.509." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3830 +#: documentation/content/en/articles/committers-guide/_index.adoc:3862 msgid "" "Gandi offers an E-rate discount to all FreeBSD developers. To streamline " "the process of getting the discount first set up a Gandi account, fill in " "the billing information and select the currency. Then send an mail to " "mailto:non-profit@gandi.net[non-profit@gandi.net] using your `@freebsd.org` " "mail address, and indicate your Gandi handle." msgstr "" "Gandi предоставляет скидку E-rate всем разработчикам FreeBSD. Чтобы " "упростить процесс получения скидки, сначала создайте учетную запись Gandi, " "заполните платежные данные и выберите валюту. Затем отправьте письмо по " "адресу mailto:non-profit@gandi.net[non-profit@gandi.net] с вашего адреса " "`@freebsd.org`, указав ваш идентификатор Gandi." #. type: Title === -#: documentation/content/en/articles/committers-guide/_index.adoc:3832 +#: documentation/content/en/articles/committers-guide/_index.adoc:3864 #, no-wrap msgid "`rsync.net`" msgstr "`rsync.net`" #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3835 +#: documentation/content/en/articles/committers-guide/_index.adoc:3867 msgid "" "https://rsync.net[rsync.net] provides cloud storage for offsite backup that " "is optimized for UNIX users. Their service runs entirely on FreeBSD and ZFS." msgstr "" "https://rsync.net[rsync.net] предоставляет облачное хранилище для резервного " "копирования вне офиса, оптимизированное для пользователей UNIX. Их сервис " "полностью работает на FreeBSD и ZFS." #. type: delimited block = 4 -#: documentation/content/en/articles/committers-guide/_index.adoc:3836 +#: documentation/content/en/articles/committers-guide/_index.adoc:3868 msgid "" "rsync.net offers a free-forever 500 GB account to FreeBSD developers. Simply " "sign up at https://www.rsync.net/freebsd.html[https://www.rsync.net/freebsd." "html] using your `@freebsd.org` address to receive this free account." msgstr "" "rsync.net предоставляет бесплатный аккаунт на 500 ГБ навсегда разработчикам " "FreeBSD. Просто зарегистрируйтесь по адресу https://www.rsync.net/freebsd." -"html[https://www.rsync.net/freebsd.html], используя ваш адрес `@freebsd.org`" -", чтобы получить этот бесплатный аккаунт." +"html[https://www.rsync.net/freebsd.html], используя ваш адрес `@freebsd." +"org`, чтобы получить этот бесплатный аккаунт." #~ msgid "https://ci.freebsd.org[Jenkins]" #~ msgstr "https://ci.freebsd.org[Jenkins]" #, no-wrap #~ msgid "[[mfc-with-git]]\n" #~ msgstr "[[mfc-with-git]]\n" #~ msgid "[source,shell]" #~ msgstr "[source,shell]" #, no-wrap #~ msgid "[source,shell]\n" #~ msgstr "[source,shell]\n" #~ msgid "[[vendor-import-git]]" #~ msgstr "[[vendor-import-git]]" #, no-wrap #~ msgid "[[git-push-upstream]]\n" #~ msgstr "[[git-push-upstream]]\n" #, no-wrap #~ msgid "[[git-push-upstream-alt]]\n" #~ msgstr "[[git-push-upstream-alt]]\n" #, no-wrap #~ msgid "[[git-faq]]\n" #~ msgstr "[[git-faq]]\n" #, no-wrap #~ msgid "[[github-pull-land]]\n" #~ msgstr "[[github-pull-land]]\n" #, no-wrap #~ msgid "[[vcs-history]]\n" #~ msgstr "[[vcs-history]]\n" #~ msgid "[[conventions]]" #~ msgstr "[[conventions]]" #~ msgid "[[conventions-committers]]" #~ msgstr "[[conventions-committers]]" #, no-wrap #~ msgid "" #~ "[[commit-steps]]\n" #~ "[.procedure]\n" #~ "====\n" #~ "*Steps for New Committers*\n" #~ msgstr "" #~ "[[commit-steps]]\n" #~ "[.procedure]\n" #~ "====\n" #~ "*Шаги для нового коммиттера*\n" #, no-wrap #~ msgid "[[conventions-everyone]]\n" #~ msgstr "[[conventions-everyone]]\n" #~ msgid "[[smtp-setup]]" #~ msgstr "[[smtp-setup]]" #, no-wrap #~ msgid "[[smtp-setup-local-mta]]\n" #~ msgstr "[[smtp-setup-local-mta]]\n" #~ msgid "[.programlisting]" #~ msgstr "[.programlisting]" #, no-wrap #~ msgid "[.programlisting]\n" #~ msgstr "[.programlisting]\n" #, no-wrap #~ msgid "" #~ "[[smtp-setup-local-opensmtpd]]\n" #~ ".Using OpenSMTPD\n" #~ "[example]\n" #~ "====\n" #~ msgstr "" #~ "[[smtp-setup-local-opensmtpd]]\n" #~ ".Использование OpenSMTPD\n" #~ "[example]\n" #~ "====\n" #, no-wrap #~ msgid "" #~ "====\n" #~ "[[smtp-setup-local-exim]]\n" #~ ".Using Exim\n" #~ "[example]\n" #~ "====\n" #~ msgstr "" #~ "====\n" #~ "[[smtp-setup-local-exim]]\n" #~ ".Использование Exim\n" #~ "[example]\n" #~ "====\n" #, no-wrap #~ msgid "====\n" #~ msgstr "====\n" #, no-wrap #~ msgid "[[mentors]]\n" #~ msgstr "[[mentors]]\n" #~ msgid "[[pre-commit-review]]" #~ msgstr "[[pre-commit-review]]" #, no-wrap #~ msgid "[[commit-log-message]]\n" #~ msgstr "[[commit-log-message]]\n" #, no-wrap #~ msgid "" #~ "[.informaltable]\n" #~ "[cols=\"20%,80%\", frame=\"none\"]" #~ msgstr "" #~ "[.informaltable]\n" #~ "[cols=\"20%,80%\", frame=\"none\"]" diff --git a/documentation/content/ru/articles/contributing/_index.adoc b/documentation/content/ru/articles/contributing/_index.adoc index 9197476f65..dea32b706e 100644 --- a/documentation/content/ru/articles/contributing/_index.adoc +++ b/documentation/content/ru/articles/contributing/_index.adoc @@ -1,477 +1,477 @@ --- authors: - author: 'Jordan Hubbard' - author: 'Sam Lawrance' - author: 'Mark Linimon' description: 'Как внести вклад в проект FreeBSD' tags: ["Contributing", "FreeBSD", "Non-Programmer Tasks", "Programmer Tasks"] title: 'Участие в проекте FreeBSD' trademarks: ["freebsd", "ieee", "general"] weight: 15 --- = Участие в проекте FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/contributing/ 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::[] pass:[] [.abstract-title] Аннотация В этой статье описаны различные способы, с помощью которых отдельный человек или организация могут внести вклад в проект FreeBSD. ''' toc::[] Итак, вы хотите внести свой вклад в FreeBSD? Это замечательно! FreeBSD _полагается_ на вклад своих пользователей для существования. Ваши усилия не только ценятся, они жизненно важны для дальнейшего развития FreeBSD. FreeBSD разрабатывает большое и постоянно растущее количество участников из разных стран, самого разного возраста и уровня технической экспертизы. Работы всегда больше, чем доступных людей, и любая помощь всегда приветствуется. В качестве волонтёра вы ограничены только тем, чем хотите заниматься. Однако мы просим вас учитывать ожидания других участников сообщества FreeBSD. Возможно, вам стоит принять это во внимание, прежде чем решить стать волонтёром. Проект FreeBSD отвечает за целостную операционную среду, а не только за ядро или несколько разрозненных утилит. Таким образом, наши списки [.filename]#TODO# охватывают очень широкий спектр задач: от документации, бета-тестирования и презентаций до установщика системы и высокоспециализированных видов разработки ядра. Люди с любым уровнем навыков, практически в любой области, почти наверняка могут помочь проекту. Коммерческие организации, занятые в сферах, связанных с FreeBSD, также приглашаются к сотрудничеству. Вам нужно специальное расширение, чтобы ваш продукт работал? Вы увидите, что мы отвечаем на ваши запросы, если они не слишком экстравагантны. Вы работаете над продуктом, добавляющим ценность системе? Пожалуйста, дайте нам знать! Возможно, мы сможем сотрудничать в каких-то аспектах. Свободное программное обеспечение бросает вызов многим устоявшимся представлениям о том, как разрабатывается, продаётся и поддерживается программное обеспечение, и мы призываем вас хотя бы взглянуть на него ещё раз. [[contrib-what]] == Что необходимо Следующий список задач и подпроектов представляет собой своего рода объединение различных списков [.filename]#TODO# и запросов пользователей. [[non-programmer-tasks]] === Текущие задачи для непрограммистов Многие люди, участвующие в FreeBSD, не являются программистами. Проект включает в себя авторов документации, веб-дизайнеров и специалистов поддержки. Всё, что нужно этим людям для участия, — это вложение времени и готовность учиться. . Периодически перечитывайте FAQ и Руководство. Если что-то объяснено недостаточно ясно, неоднозначно, устарело или неверно, дайте нам знать. Ещё лучше — пришлите нам исправление (AsciiDoc несложно изучить, но можно присылать и обычный текст). -. Помогите перевести документацию FreeBSD на ваш родной язык. Если документация уже существует на вашем языке, вы можете помочь перевести дополнительные документы или проверить, что переводы актуальны и корректны. Сначала ознакомьтесь с extref:{fdp-primer}[FAQ по переводам, translations] в Руководстве проекта документации FreeBSD. Вы не обязаны переводить каждую документацию FreeBSD — как волонтер, вы можете переводить столько, сколько пожелаете. Как только кто-то начинает переводить, к этому процессу почти всегда присоединяются другие. Если у вас есть время и силы перевести только часть документации, пожалуйста, переведите инструкции по установке. +. Помогите перевести документацию FreeBSD на ваш родной язык. Если документация уже существует на вашем языке, вы можете помочь перевести дополнительные документы или проверить, что переводы актуальны и корректны. Сначала ознакомьтесь с extref:{fdp-primer}translations[FAQ по переводам, translations] в Руководстве проекта документации FreeBSD. Вы не обязаны переводить каждую документацию FreeBSD — как волонтер, вы можете переводить столько, сколько пожелаете. Как только кто-то начинает переводить, к этому процессу почти всегда присоединяются другие. Если у вас есть время и силы перевести только часть документации, пожалуйста, переведите инструкции по установке. . Читайте {freebsd-questions} время от времени (или даже регулярно). Может быть очень приятно делиться своими знаниями и помогать людям решать их проблемы; иногда вы даже можете узнать что-то новое для себя! Эти форумы также могут быть источником идей для улучшений. [[ongoing-programmer-tasks]] === Текущие задачи программистов Большинство перечисленных здесь задач может потребовать значительных временных затрат, глубоких знаний о ядре FreeBSD или того и другого. Однако, есть также множество полезных задач, подходящих для "хакеров выходного дня". . Если вы используете FreeBSD-CURRENT и имеете хорошее подключение к интернету, существует машина `current.FreeBSD.org`, которая ежедневно собирает полный релиз — время от времени пробуйте установить последний релиз с неё и сообщайте о любых сбоях в процессе. . Прочитайте {freebsd-bugs}. Возможно, там есть проблема, по которой вы можете конструктивно высказаться, или патчи, которые вы можете протестировать. Или вы даже можете попытаться исправить одну из проблем самостоятельно. . Если вам известны исправления ошибок, которые были успешно применены в -CURRENT, но не были перенесены в -STABLE в течение разумного срока (обычно пары недель), отправьте коммиттеру вежливое напоминание. . Переместите стороннее программное обеспечение в [.filename]#src/contrib# в дереве исходных кодов. . Убедитесь, что код в [.filename]#src/contrib# актуален. . Соберите дерево исходников (или только его часть) с включенными дополнительными предупреждениями и устраните эти предупреждения. Список предупреждений при сборке также можно найти в нашем https://ci.freebsd.org[CI], выбрав сборку и отметив "LLVM/Clang Warnings". . Исправление предупреждений для портов, которые используют устаревшие функции, такие как `gets()` или включают [.filename]#malloc.h#. . Если вы внесли свой вклад в какие-либо порты и вам пришлось внести изменения, специфичные для FreeBSD, отправьте свои исправления оригинальным авторам (это облегчит вашу жизнь, когда они выпустят следующую версию). . Получите копии официальных стандартов, таких как POSIX(R). Сравните поведение FreeBSD с требованиями стандарта. Если поведение отличается, особенно в сложных или малоизученных аспектах спецификации, отправьте PR об этом. Если вы можете, предложите исправление и включите патч в PR. Если вы считаете, что стандарт ошибочен, обратитесь в орган по стандартизации с просьбой рассмотреть этот вопрос. . Предложите дополнительные задачи для этого списка! === Пройдитесь по базе данных PR https://bugs.FreeBSD.org/search/[Список PR FreeBSD] отображает все текущие активные отчёты о проблемах и запросы на улучшение, отправленные пользователями FreeBSD. База данных PR включает как задачи для программистов, так и для непрограммистов. Просмотрите открытые PR и посмотрите, есть ли среди них что-то, что вас заинтересует. Некоторые из них могут быть очень простыми задачами, которым просто нужен свежий взгляд, чтобы проверить и подтвердить, что исправление в PR является хорошим. Другие могут быть гораздо сложнее или даже не содержать исправления вовсе. Начните с PR, которые никому не назначены. Если PR назначен кому-то другому, но вам кажется, что вы можете с ним справиться, напишите этому человеку на почту и спросите, можно ли вам над ним поработать — возможно, у него уже есть готовый патч для тестирования или дополнительные идеи, которые можно обсудить. === Текущие задачи портов Коллекция портов — это постоянный процесс. Мы стремимся предоставить нашим пользователям удобный, современный и качественный репозиторий стороннего программного обеспечения. Нам нужны люди, готовые пожертвовать своим временем и усилиями, чтобы помочь нам достичь этой цели. Вовлечься может любой, и способов для этого множество. Участие в разработке портов — отличный способ "отдать долг" проекту. Будь то поиск постоянной роли или интересный вызов на дождливый день — мы будем рады вашей помощи! Есть несколько простых способов помочь поддерживать дерево портов в актуальном состоянии и в хорошем рабочем порядке: * Найдите интересное или полезное программное обеспечение и extref:{porters-handbook}[создайте порт] для него. * Существует множество портов, у которых нет сопровождающего. Станьте сопровождающим и crossref:contributing[adopt-port, Возьмите на сопровождение неподдерживаемый порт]. * Если вы создали или адаптировали порт, обратите внимание на раздел crossref:contributing[maintain-port, Задача для сопровождающих портов]. * Если вы ищете быстрый вызов, вы можете crossref:contributing[fix-broken, Найти и исправить сломанный порт]. === Выберите один из пунктов со страницы Идеи https://wiki.freebsd.org/IdeasPage[Список проектов и идей FreeBSD для волонтёров] также доступен для тех, кто хочет внести свой вклад в проект FreeBSD. Список регулярно обновляется и содержит пункты как для программистов, так и для не-программистов, с информацией о каждом проекте. [[contrib-how]] == Как внести свой вклад Вклады в систему обычно относятся к одной или нескольким из следующих 5 категорий: [[contrib-general]] === Отчеты об ошибках и общие комментарии -Идея или предложение, представляющие _общий_ технический интерес, должны быть отправлены на {freebsd-hackers}. Аналогично, люди, заинтересованные в подобных вещах (и готовые терпеть _высокий_ объем почты!), могут подписаться на {freebsd-hackers}. Дополнительную информацию об этом и других списках рассылки см. в extref:{handbook}[The FreeBSD Handbook, eresources-mail]. +Идея или предложение, представляющие _общий_ технический интерес, должны быть отправлены на {freebsd-hackers}. Аналогично, люди, заинтересованные в подобных вещах (и готовые терпеть _высокий_ объем почты!), могут подписаться на {freebsd-hackers}. Дополнительную информацию об этом и других списках рассылки см. в extref:{handbook}eresources[The FreeBSD Handbook, eresources-mail]. Если вы отправляете простой патч в репозиторий src, рассмотрите возможность отправить его в зеркало проекта на GitHub как https://github.com/freebsd/freebsd-src/pulls[запрос на включение]. Подходящие отправки должны: * Готово или почти готово для включения. Коммиттер должен быть в состоянии применить этот патч с менее чем 10 минутами дополнительной работы. * Он проходит все задания GitHub CI. * Вы можете быстро реагировать на обратную связь. * Он затрагивает менее 10 файлов, а изменения составляют менее 200 строк. Изменения большего размера могут быть допустимы, или вас могут попросить отправить несколько запросов на включение более удобного размера. * Каждое логическое изменение — это отдельный коммит в рамках pull request. Сообщения коммитов для каждого изменения должны соответствовать extref:{committers-guide}#commit-log-message[руководству по оформлению логов коммитов]. * Все коммиты содержат ваше имя и действительный адрес электронной почты, которые вы хотите видеть в репозитории FreeBSD в качестве автора. Поддельные адреса github.com использовать нельзя. * Объем pull request не должен меняться в процессе проверки. Если в ходе проверки предложены изменения, расширяющие объем, создайте отдельный pull request. * Исправляющие коммиты должны быть объединены (squash) с коммитом, который они исправляют. Каждый коммит в вашей ветке должен быть пригоден для репозитория FreeBSD. * Коммиты должны включать одну или несколько строк `Signed-off-by:` с полным именем и адресом электронной почты, подтверждающими https://developercertificate.org/[Сертификат происхождения разработчика]. При обновлении запроса на включение изменений, пожалуйста, выполняйте перебазирование с принудительной отправкой (forced push), а не слиянием через коммит (merge commit). Более сложные изменения могут быть отправлены как запросы на включение (pull request), но они могут быть отклонены и закрыты, если они слишком большие, слишком громоздкие, становятся неактивными, требуют дополнительного обсуждения в сообществе или нуждаются в значительной доработке. Пожалуйста, избегайте создания больших, широкомасштабных патчей для очистки: они слишком велики и не обладают необходимой фокусировкой для качественного рецензирования. Патчи, отправленные не по адресу, могут быть перенаправлены в более подходящий форум для их доработки. Запросы на включение изменений, отправленные в репозиторий портов, могут быть обработаны или проигнорированы, в зависимости от настроения разработчиков. На данный момент, вам будет проще, если вы будете следовать процессу отправки портов crossref:contributing[ports-contributing, Вклад в порты]. Команда документации также принимает pull requests через GitHub, но пока не установила для них никакой политики. Если вы обнаружили ошибку или хотите отправить конкретное изменение, пожалуйста, сообщите об этом, используя https://bugs.FreeBSD.org/submit/[форму отправки отчёта об ошибках]. Постарайтесь заполнить каждое поле отчёта. Если патчи не превышают 65 КБ, включите их непосредственно в отчёт. Если патч подходит для применения к исходному дереву, укажите `[PATCH]` в кратком описании отчёта. При включении патчей _не_ используйте копирование и вставку, так как это превращает табуляции в пробелы и делает их непригодными. Если патчи значительно превышают 20 КБ, рассмотрите возможность их сжатия (например, с помощью man:gzip[1] или man:bzip2[1]) перед загрузкой. После подачи отчета вы должны получить подтверждение вместе с номером для отслеживания. Сохраните этот номер, чтобы вы могли сообщить нам дополнительные сведения о проблеме. См. также extref:{problem-reports}[эту статью] о том, как писать хорошие отчёты о проблемах. === Изменения в документации Изменения в документации контролируются {freebsd-doc}. Пожалуйста, ознакомьтесь с руководством extref:{fdp-primer}[Проект документации FreeBSD: введение для новых участников] для получения полных инструкций. Отправляйте исправления и изменения (даже небольшие правки приветствуются!) тем же способом, что и другие отчёты об ошибках. === Изменения в существующем исходном коде -Добавление или изменение существующего исходного кода — это несколько более сложная задача, которая во многом зависит от того, насколько сильно вы отстали от текущего состояния разработки FreeBSD. Существует специальная постоянно обновляемая версия FreeBSD, известная как "FreeBSD-CURRENT", которая доступна различными способами для удобства разработчиков, активно работающих над системой. Подробнее о получении и использовании FreeBSD-CURRENT можно узнать в extref:{handbook}[Руководстве FreeBSD, current-stable]. +Добавление или изменение существующего исходного кода — это несколько более сложная задача, которая во многом зависит от того, насколько сильно вы отстали от текущего состояния разработки FreeBSD. Существует специальная постоянно обновляемая версия FreeBSD, известная как "FreeBSD-CURRENT", которая доступна различными способами для удобства разработчиков, активно работающих над системой. Подробнее о получении и использовании FreeBSD-CURRENT можно узнать в extref:{handbook}cutting-edge[Руководстве FreeBSD, current-stable]. Работа с устаревшими исходниками, к сожалению, означает, что ваши изменения иногда могут быть слишком устаревшими или слишком расходящимися для лёгкого повторного включения в FreeBSD. Шансы на это можно несколько уменьшить, подписавшись на списки рассылки {freebsd-announce} и {freebsd-current}, где обсуждается текущее состояние системы. Предполагая, что вам удалось получить достаточно актуальные исходные коды для внесения изменений, следующий шаг — создать набор различий (diff) для отправки сопровождающим FreeBSD. Это делается с помощью команды man:diff[1]. Предпочтительным форматом man:diff[1] для отправки исправлений является унифицированный формат вывода, создаваемый командой `diff -u`. [source, shell] .... % diff -u oldfile newfile .... или [source, shell] .... % diff -u -r -N olddir newdir .... сгенерирует набор унифицированных diff-файлов для указанного исходного файла или иерархии каталогов. См. man:diff[1] для получения дополнительной информации. После того как у вас есть набор изменений (которые вы можете проверить с помощью команды man:patch[1]), вам следует отправить их для включения в FreeBSD в виде отчета об ошибке. _Не отправляйте_ изменения просто на {freebsd-hackers}, иначе они могут потеряться! Мы очень ценим ваши предложения (это добровольный проект!); поскольку мы заняты, мы не всегда можем обработать их сразу, но они останутся в базе данных PR, пока мы не дойдем до них. Укажите, что это предложение изменений, добавив `[PATCH]` в заголовок отчета. Если вы считаете это уместным (например, вы добавили, удалили или переименовали файлы), упакуйте свои изменения в файл `tar`. Если ваше изменение носит потенциально чувствительный характер, например, если вы не уверены в вопросах авторского права, регулирующих его дальнейшее распространение, то вам следует отправить его напрямую по адресу {core-email}, а не подавать как отчёт об ошибке. Письмо на {core-email} достигает гораздо меньшей группы людей, которые выполняют большую часть повседневной работы над FreeBSD. Обратите внимание, что эта группа также _очень занята_, поэтому вам следует писать им только в случае действительной необходимости. Пожалуйста, обратитесь к man:intro[9] и man:style[9] для получения информации о стиле написания кода. Мы будем признательны, если вы хотя бы ознакомитесь с этой информацией перед отправкой кода. === Новый код или основные пакеты с добавленной стоимостью В случае значительного вклада в виде большого объёма работы или добавления важной новой функции в FreeBSD, почти всегда необходимо либо отправить изменения в виде tar-файлов, либо загрузить их на веб- или FTP-сайт для доступа других людей. Если у вас нет доступа к веб- или FTP-сайту, запросите на соответствующем списке рассылки FreeBSD, чтобы кто-то разместил изменения для вас. При работе с большими объемами кода неизбежно возникает деликатная тема авторских прав. FreeBSD предпочитает свободные лицензии, такие как BSD или ISC. Коплефтные лицензии, например GPLv2, иногда допускаются. Полный список можно найти на странице link:https://www.FreeBSD.org/internal/software-license/[политики лицензирования основной команды]. === Деньги или Оборудование Мы всегда рады пожертвованиям для поддержки проекта FreeBSD, и в добровольческих усилиях, подобных нашим, даже небольшая помощь может иметь большое значение! Пожертвования оборудования также очень важны для расширения списка поддерживаемых периферийных устройств, поскольку у нас обычно нет средств на их приобретение. [[donations]] ==== Пожертвование средств -https://www.freebsdfoundation.org[FreeBSD Foundation] — это некоммерческий, освобожденный от налогов фонд, созданный для поддержки целей проекта FreeBSD. Как организация 501(c)3, Фонд, как правило, освобожден от федерального подоходного налога США, а также от подоходного налога штата Колорадо. Пожертвования освобожденным от налогов организациям часто вычитаются из налогооблагаемого федерального дохода. +https://www.freebsdfoundation.org[Фонд FreeBSD (FreeBSD Foundation)] — это некоммерческий, освобожденный от налогов фонд, созданный для поддержки целей проекта FreeBSD. Как организация 501(c)3, Фонд, как правило, освобожден от федерального подоходного налога США, а также от подоходного налога штата Колорадо. Пожертвования освобожденным от налогов организациям часто вычитаются из налогооблагаемого федерального дохода. Пожертвования можно отправить в виде чека по адресу: [.address] **** The FreeBSD Foundation + 3980 Broadway Street + STE #103-107 + Boulder CO 80304 + USA **** Фонд FreeBSD также принимает https://www.freebsdfoundation.org/donate/[онлайн-пожертвования] через различные варианты оплаты. Дополнительная информация о Фонде FreeBSD доступна по ссылке https://people.FreeBSD.org/~jdp/foundation/announcement.html[Фонд FreeBSD — введение]. Чтобы связаться с Фондом по электронной почте, напишите на mailto:info@FreeBSDFoundation.org[info@FreeBSDFoundation.org]. ==== Пожертвование оборудования Проект FreeBSD с благодарностью принимает пожертвования в виде оборудования, которое может быть полезно для проекта. Если вы хотите пожертвовать оборудование, пожалуйста, свяжитесь с link:https://www.FreeBSD.org/donations/[Офисом по связям с пожертвованиями]. [[ports-contributing]] == Вклад в порты [[adopt-port]] === Принятие сопровождения неподдерживаемого порта ==== Выбор неподдерживаемого порта Принятие на себя сопровождения необслуживаемых портов — это отличный способ принять участие. Необслуживаемые порты обновляются и исправляются только тогда, когда кто-то добровольно берется за работу над ними. Существует большое количество необслуживаемых портов. Хорошей идеей будет начать с порта, который вы используете регулярно. Неподдерживаемые порты имеют параметр `MAINTAINER`, установленный в `ports@FreeBSD.org`. Многие неподдерживаемые порты могут иметь ожидающие обновления, это можно увидеть на https://portscout.freebsd.org/ports@freebsd.org.html[сканере дистрибутивных файлов портов FreeBSD]. На https://portsfallout.com/fallout?port=&maintainer=ports%40FreeBSD.org[PortsFallout] можно увидеть список неподдерживаемых портов с ошибками. Некоторые порты влияют на большое количество других из-за зависимостей и вторичных связей между портами. Обычно мы хотим, чтобы у людей был некоторый опыт, прежде чем они начнут сопровождать такие порты. Вы можете узнать, есть ли у порта зависимости или вторичные порты, посмотрев в основной индекс портов под названием [.filename]#INDEX#. (Имя файла может различаться в зависимости от версии FreeBSD; например, [.filename]#INDEX-13#.) Некоторые порты имеют условные зависимости, которые не включены в стандартную сборку [.filename]#INDEX#. Мы ожидаем, что вы сможете распознать такие порты, просмотрев [.filename]#Makefile# других портов. ==== Как принять сопровождение порта Убедитесь, что вы понимаете раздел crossref:contributing[maintain-port, Задача для сопровождающих портов]. Также прочитайте extref:{porters-handbook}[Руководство FreeBSD по созданию портов]. _Пожалуйста, не берите на себя больше, чем вам комфортно выполнять._ Вы можете запросить статус сопровождающего для любого неподдерживаемого порта, как только пожелаете. Просто установите `MAINTAINER` на ваш собственный адрес электронной почты и отправьте PR (Problem Report) с этим изменением. Если порт имеет ошибки сборки или нуждается в обновлении, вы можете включить другие изменения в тот же PR. Это поможет, поскольку многие коммиттеры менее склонны назначать сопровождающего тому, у кого нет известной истории работы с FreeBSD. Отправка PR, исправляющих ошибки сборки или обновляющих порты, — лучший способ её установить. Подайте ваш PR в категорию `Порты и пакеты`. Коммиттер проверит ваш PR, закоммитит изменения и в конце закрыт PR. Иногда этот процесс может занять некоторое время (коммиттеры тоже волонтеры :). [[maintain-port]] === Задача для сопровождающих портов В этом разделе вы узнаете, зачем нужно поддерживать порты, а также ознакомитесь с обязанностями сопровождающего портов. [[why-maintenance]] ==== Почему порты требуют обслуживания Создание порта — это разовая задача. Обеспечение актуальности порта, его сборки и работы требует постоянных усилий по поддержке. Поддерживающие (maintainers) — это люди, которые посвящают часть своего времени достижению этих целей. Основная причина, по которой порты требуют обслуживания, — это предоставление новейших и лучших сторонних программных решений сообществу FreeBSD. Дополнительная задача — обеспечение работоспособности отдельных портов в рамках коллекции Ports по мере её развития. Как сопровождающему, вам потребуется управлять следующими задачами: * *Новые версии программного обеспечения и обновления.* Новые версии и обновления существующего портированного программного обеспечения появляются постоянно, и их необходимо включать в Коллекцию портов, чтобы обеспечить актуальное ПО. * *Изменения в зависимостях.* Если в зависимостях вашего порта были внесены значительные изменения, возможно, его потребуется обновить, чтобы он продолжал работать корректно. * *Изменения, затрагивающие зависимые порты.* Если другие порты зависят от порта, который вы поддерживаете, изменения в вашем порте могут потребовать согласования с другими сопровождающими. * *Взаимодействие с другими пользователями, сопровождающими и разработчиками.* Часть обязанностей сопровождающего включает в себя поддержку. От вас не ожидают предоставления общей поддержки (но мы приветствуем это, если вы решите её оказывать). Ваша задача — быть точкой координации по вопросам, связанным с вашими портами, специфичным для FreeBSD. * *Поиск ошибок.* Порт может быть подвержен ошибкам, специфичным для FreeBSD. Вам потребуется исследовать, находить и исправлять эти ошибки при их поступлении. Ещё лучше тщательно тестировать порт для выявления проблем до их попадания в Коллекцию портов. * *Изменения в инфраструктуре и политике портов.* Иногда обновляются системы, используемые для сборки портов и пакетов, или появляются новые рекомендации, влияющие на инфраструктуру. Вам следует учитывать эти изменения, если ваши порты затронуты и требуют обновления. * *Изменения в базовой системе.* FreeBSD находится в постоянной разработке. Изменения в программном обеспечении, библиотеках, ядре или даже изменения политики могут вызвать каскадные требования к изменениям в портах. ==== Обязанности сопровождающего ===== Поддерживайте свои порты в актуальном состоянии В этом разделе описаны шаги, которые необходимо выполнить, чтобы поддерживать ваши порты в актуальном состоянии. Это общий обзор. Дополнительная информация об обновлении порта доступна в extref:{porters-handbook}[Руководстве FreeBSD по созданию портов]. [.procedure] ==== . Следите за обновлениями + Отслеживайте у вышестоящего поставщика появление новых версий, обновлений и исправлений безопасности для программного обеспечения. Для этого полезны списки рассылки объявлений или новостные веб-страницы. Иногда пользователи могут связаться с вами и спросить, когда ваш порт будет обновлен. Если вы заняты другими делами или по какой-либо причине просто не можете обновить его в данный момент, спросите, могут ли они помочь вам, предоставив обновление. + Вы также можете получать автоматические письма от `FreeBSD Ports Version Check`, уведомляющие о доступности новой версии дистрибутивного файла вашего порта. В сообщении будет предоставлена дополнительная информация об этой системе (включая инструкции по остановке будущих писем). . Вносите изменения + Когда они станут доступны, включите изменения в порт. Вам нужно уметь создавать патч между оригинальным портом и вашим обновлённым портом. . Проверяйте и тестируйте + Тщательно проверьте и протестируйте свои изменения: ** Соберите, установите и протестируйте ваш порт на максимально возможном количестве платформ и архитектур. Часто бывает, что порт работает в одной ветке или на одной платформе, но не работает в другой. ** Убедитесь, что зависимости вашего порта полные. Рекомендуемый способ сделать это — установить собственный tinderbox для портов. Дополнительную информацию см. в crossref:contributing[resources, Ресурсы для сопровождающих и участников разработки портов]. ** Проверьте, что список упаковки актуален. Это включает добавление новых файлов и каталогов и удаление неиспользуемых записей. ** Проверьте ваш порт, используя man:portlint[1] в качестве помощника. См. crossref:contributing[resources, Ресурсы для сопровождающих и участников портов] для важной информации об использовании portlint. ** Подумайте, могут ли изменения в вашем порту привести к проблемам в других портах. Если это так, согласуйте изменения с их сопровождающими. Это особенно важно, если ваше обновление изменяет версию разделяемой библиотеки; в этом случае, как минимум, зависимые порты должны получить увеличение `PORTREVISION`, чтобы автоматизированные инструменты, такие как package:ports-mgmt/poudriere[], могли их обновить. . Представляйте изменения + Отправьте ваше обновление, создав PR с описанием изменений и патчем, содержащим различия между исходным портом и обновлённым. Обратитесь к статье extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD] для получения информации о том, как правильно оформить PR. + [NOTE] ====== -Пожалуйста, не отправляйте архив man:shar[1] всего порта; вместо этого используйте man:git-format-patch[1] или man:diff[1] `-ruN`. Таким образом, коммиттеры смогут гораздо проще увидеть, какие именно изменения были внесены. Раздел extref:{porters-handbook}[Обновление, port-upgrading] в Руководстве FreeBSD по созданию портов содержит дополнительную информацию. +Пожалуйста, не отправляйте архив man:shar[1] всего порта; вместо этого используйте man:git-format-patch[1] или man:diff[1] `-ruN`. Таким образом, коммиттеры смогут гораздо проще увидеть, какие именно изменения были внесены. Раздел extref:{porters-handbook}upgrading[Обновление, port-upgrading] в Руководстве FreeBSD по созданию портов содержит дополнительную информацию. ====== . Ждите + На каком-то этапе коммиттер рассмотрит ваш PR. Это может занять минуты, а может и одну-две недели — так что проявите терпение. Если это займет больше времени, обратитесь за помощью в почтовые рассылки ({freebsd-ports}), IRC: #bsdports на EFNet или #freebsd-ports на Libera, например. . Предоставляйте обратную связь + Если участник проекта обнаружит проблему в ваших изменениях, он, скорее всего, вернёт их вам на доработку. Быстрый ответ поможет ускорить принятие вашего PR, а также упростит поддержание последовательности обсуждения при попытке разрешить возникшие проблемы. . И наконец + Ваши изменения будут зафиксированы, и ваш порт будет обновлен. Затем PR будет закрыт коммиттером. Вот и все! ==== ===== Убедитесь, что ваши порты продолжают собираться корректно Этот раздел посвящён обнаружению и исправлению проблем, которые мешают правильной сборке портов. FreeBSD гарантирует работоспособность Коллекции портов только в ветках `-STABLE`. Теоретически можно обойтись использованием последних выпусков каждой стабильной ветки (поскольку ABI не должны меняться), но если есть возможность использовать саму ветку, это ещё лучше. Поскольку большинство установок FreeBSD работают на PC-совместимых машинах (так называемая архитектура `i386`), мы ожидаем, что порт будет работать на этой архитектуре. Мы предпочитаем, чтобы порты также работали на архитектуре `amd64` в нативном режиме. Совершенно допустимо попросить о помощи, если у вас нет одной из таких машин. [NOTE] ==== Обычные режимы сбоя для машин не на архитектуре `x86` связаны с предположениями оригинальных программистов, например, что указатели являются `int`-ами, или что используется относительно старый и менее строгий компилятор gcc. Все чаще авторы приложений перерабатывают свой код, чтобы устранить эти предположения — но если автор не занимается активной поддержкой своего кода, вам, возможно, придется сделать это самостоятельно. ==== Вот задачи, которые необходимо выполнить, чтобы убедиться, что ваш порт может быть собран: [.procedure] ==== . Следите за ошибками сборки + Проверьте свою почту на наличие писем от `pkg-fallout@FreeBSD.org` и http://portscout.FreeBSD.org[сканера distfiles], чтобы узнать, не устарели ли какие-либо порты, которые не собираются. . Собрать информацию + Как только вы обнаружили проблему, соберите информацию, которая поможет её исправить. Ошибки сборки, о которых сообщает `pkg-fallout`, сопровождаются журналами, показывающими, где произошёл сбой. Если о проблеме сообщил пользователь, попросите его предоставить данные, которые могут помочь в диагностике, например: ** Логи сборки ** Команды и параметры, используемые для сборки порта (включая параметры, установленные в [.filename]#/etc/make.conf#) ** Список пакетов, установленных в системе, как показано в man:pkg-info[8] ** Версия FreeBSD, которую они используют, как показано в man:uname[1] `-a` ** Когда их коллекция портов была последний раз обновлена ** Когда их дерево портов и файл [.filename]#INDEX# были последний раз обновлены . Изучить и найти решение + К сожалению, не существует прямого процесса, которому можно следовать для этого. Однако помните: если вы застряли, попросите помощи! Коллекция портов {freebsd-ports} — хорошее место для начала, и разработчики вышестоящих проектов часто очень отзывчивы. . Представляйте изменения + Как и при обновлении порта, теперь вам следует внести изменения, проверить и протестировать их, отправить изменения в PR и, если требуется, предоставить обратную связь. . Отправляйте исправления авторам вышестоящих проектов + В некоторых случаях потребуется внести изменения в порт, чтобы он заработал на FreeBSD. Некоторые (но не все) разработчики исходного проекта примут такие изменения в свой код для следующего выпуска. Если это произойдет, это может помочь их пользователям и на других BSD-системах, а также, возможно, сэкономит дублирующие усилия. В качестве жеста вежливости, пожалуйста, рассмотрите возможность отправки соответствующих исправлений авторам. ==== ===== Изучать отчеты об ошибках и PR, связанные с вашим портом Этот раздел посвящён поиску и исправлению ошибок. Ошибки, специфичные для FreeBSD, обычно вызваны предположениями о среде сборки и выполнения, которые не применимы к FreeBSD. Вероятность столкнуться с такой проблемой меньше, но она может быть более тонкой и сложной для диагностики. Вот задачи, которые необходимо выполнить, чтобы ваш порт продолжал работать должным образом: [.procedure] ==== . Отвечать на отчёты об ошибках + Ошибки могут быть сообщены вам по электронной почте через https://bugs.FreeBSD.org/search/[базу данных отчетов о проблемах]. Также пользователи могут сообщать об ошибках напрямую вам. + Вы должны отвечать на PR и другие сообщения в течение 14 дней, но постарайтесь не затягивать так долго. Старайтесь отвечать как можно скорее, даже если это просто сообщение о том, что вам нужно ещё немного времени, прежде чем вы сможете заняться PR. + Если вы не ответили в течение 14 дней, любой коммиттер может выполнить коммит из PR, на который вы не ответили, используя `maintainer-timeout`. . Собрать информацию + Если человек, сообщивший об ошибке, также не предоставил исправление, вам необходимо собрать информацию, которая позволит вам создать исправление. + Если ошибка воспроизводима, вы можете собрать большую часть необходимой информации самостоятельно. Если нет, попросите человека, сообщившего об ошибке, собрать информацию для вас, например: ** Подробное описание их действий, ожидаемого поведения программы и фактического поведения ** Копии входных данных, использованных для выявления ошибки ** Информация о среде сборки и выполнения — например, список установленных пакетов и вывод команды man:env[1] ** Файлы дампов ядра ** Стеки вызовов функций . Устраните некорректные отчеты + Некоторые отчеты об ошибках могут быть некорректными. Например, пользователь мог просто неправильно использовать программу; или установленные пакеты могут быть устаревшими и требовать обновления. Иногда сообщаемая ошибка не специфична для FreeBSD. В этом случае следует сообщить об ошибке разработчикам вышестоящего проекта. Если ошибка находится в пределах ваших возможностей для исправления, вы также можете исправить порт, чтобы исправление было применено до следующего релиза вышестоящего проекта. . Найдите решение + Как и с ошибками сборки, вам потребуется найти решение проблемы. И снова, не забывайте спросить, если застряли! . Представить или утвердить изменения + Как и при обновлении порта, теперь вам следует внести изменения, проверить и протестировать их, а затем отправить изменения в PR (или отправить дополнение, если PR для данной проблемы уже существует). Если другой пользователь отправил изменения в PR, вы также можете отправить дополнение, указав, одобряете ли вы эти изменения или нет. ==== ===== Предоставление поддержки Часть обязанностей сопровождающего заключается в предоставлении поддержки — не для программного обеспечения в целом, а для порта и любых особенностей и проблем, специфичных для FreeBSD. Пользователи могут обращаться к вам с вопросами, предложениями, проблемами и патчами. В большинстве случаев их обращение будет касаться именно FreeBSD. Время от времени вам может понадобиться проявить дипломатические навыки и вежливо направить пользователей, ищущих общую поддержку, к соответствующим ресурсам. Реже вы столкнётесь с людьми, спрашивающими, почему `RPMS` не обновлены или как запустить программное обеспечение под Foo Linux. Воспользуйтесь возможностью сообщить им, что ваш порт актуален (если это так, конечно!), и предложите попробовать FreeBSD. Иногда пользователи и разработчики решают, что вы занятой человек, чьё время ценно, и выполняют часть работы за вас. Например, они могут: * отправить PR или прислать свои патчи для обновления вашего порта, * исследовать и, возможно, предоставить исправление для PR, или * иначе отправить изменения в ваш порт. В этих случаях ваша основная обязанность — своевременно отвечать. Напоминаем, что срок ожидания ответа от сопровождающего составляет 14 дней. По истечении этого периода изменения могут быть зафиксированы без одобрения. Они потрудились сделать это за вас; пожалуйста, постарайтесь хотя бы оперативно ответить. Затем как можно скорее проверьте, одобрите, измените или обсудите их изменения с ними. Если вы сможете дать им почувствовать, что их вклад ценится (а так и должно быть), у вас будет больше шансов убедить их сделать для вас больше в будущем :-). [[fix-broken]] === Поиск и исправление сломанного порта Есть несколько хороших мест, где можно найти порт, требующий внимания. Вы можете использовать https://bugs.freebsd.org/search[веб-интерфейс] базы данных отчетов о проблемах для поиска и просмотра нерешенных PR. Большинство PR для портов — это обновления, но с небольшим поиском и беглым просмотром описаний вы сможете найти что-то интересное для работы. https://portsfallout.com/[PortsFallout] отображает проблемы с портами, собранные при сборке пакетов FreeBSD. Допустимо отправлять изменения и для поддерживаемого порта, но не забудьте уточнить у сопровождающего, не работает ли он уже над этой проблемой. Как только вы обнаружили ошибку или проблему, соберите информацию, изучите её и исправьте! Если уже существует PR, продолжите работу с ним. В противном случае создайте новый PR. Ваши изменения будут проверены и, если всё в порядке, приняты. [[mortal-coil]] === Как прекратить сопровождение По мере изменения ваших интересов и обязательств вы можете обнаружить, что у вас больше нет времени продолжать некоторые (или все) ваши вклады в порты. Это нормально! Пожалуйста, сообщите нам, если вы больше не используете порт или у вас нет времени или интереса продолжать быть его сопровождающим. Таким образом, мы сможем позволить другим людям попытаться решить существующие проблемы с портом, не дожидаясь вашего ответа. Помните, FreeBSD — это добровольный проект, поэтому если сопровождение порта больше не приносит удовольствия, вероятно, пришло время позволить кому-то другому заняться этим! В любом случае, команда управления портами (`portmgr`) оставляет за собой право сбросить ваше право сопровождения, если вы не поддерживали свой порт в течение некоторого времени. (В настоящее время этот срок установлен в 3 месяца.) Под этим подразумевается, что есть нерешенные проблемы или ожидающие обновления, над которыми не велась работа в течение этого времени. [[resources]] === Ресурсы для сопровождающих и участников портов extref:{porters-handbook}[Руководство FreeBSD по созданию портов] — это ваш путеводитель по системе портов. Держите его под рукой! Статья extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD] описывает, как лучше всего сформулировать и отправить PR. В 2005 году было подано более одиннадцати тысяч PR для портов! Следование этой статье значительно поможет нам сократить время, необходимое для обработки ваших PR. https://bugs.freebsd.org/bugzilla/query.cgi[База данных отчетов о проблемах]. Сканер дистрибутивных файлов портов FreeBSD (portscout) http://portscout.FreeBSD.org[FreeBSD Ports distfile scanner (portscout)] может показать вам порты, для которых дистрибутивные файлы недоступны для загрузки. Вы можете проверить свои собственные порты или использовать его для поиска портов, которым требуется обновление `MASTER_SITES`. package:ports-mgmt/poudriere[] — это наиболее тщательный способ проверить порт на протяжении всего цикла установки, упаковки и удаления. Документация находится в https://github.com/freebsd/poudriere[репозитории poudriere на GitHub] man:portlint[1] — это приложение, которое можно использовать для проверки соответствия вашего порта многим важным стилистическим и функциональным рекомендациям. portlint — это простое эвристическое приложение, поэтому его следует использовать __только в качестве ориентира__. Если portlint предлагает изменения, которые кажутся необоснованными, обратитесь к extref:{porters-handbook}[Руководству портировщика] или попросите совета. {freebsd-ports} предназначен для общих обсуждений, связанных с портами. Это хорошее место для поиска помощи. Вы можете link:https://lists.freebsd.org/[subscribe, читать и искать в архивах списка]. Также может быть полезно ознакомиться с архивами {freebsd-ports-bugs} и {svn-ports-head}. https://portsfallout.com/[PortsFallout] — это место для помощи в поиске по https://lists.freebsd.org/archives/freebsd-pkg-fallout/[архиву FreeBSD package-fallout]. [[ideas-contributing]] == Начало работы в других областях Ищете что-то интересное для начала работы, что не упоминается в этой статье? Проект FreeBSD имеет несколько страниц на Wiki, содержащих области, в которых новые участники могут найти идеи о том, как начать. https://wiki.freebsd.org/JuniorJobs[Страница Junior Jobs] содержит список проектов, которые могут быть интересны тем, кто только начинает работать с FreeBSD и хочет попробовать свои силы в интересных задачах. https://wiki.freebsd.org/IdeasPage[Страница идей] содержит различные «приятные» или «интересные» вещи для работы в Проекте. diff --git a/documentation/content/ru/articles/contributing/_index.po b/documentation/content/ru/articles/contributing/_index.po index cbc6e46b2f..b46b9bb0d4 100644 --- a/documentation/content/ru/articles/contributing/_index.po +++ b/documentation/content/ru/articles/contributing/_index.po @@ -1,2202 +1,2188 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2024-12-29 08:30-0500\n" -"PO-Revision-Date: 2025-10-30 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-09 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/contributing/_index.adoc:1 #, no-wrap msgid "How to contribute to the FreeBSD Project" msgstr "Как внести вклад в проект FreeBSD" #. type: Title = #: documentation/content/en/articles/contributing/_index.adoc:1 #: documentation/content/en/articles/contributing/_index.adoc:13 #, no-wrap msgid "Contributing to FreeBSD" msgstr "Участие в проекте FreeBSD" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:45 msgid "pass:[]" msgstr "pass:[]" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:48 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:50 msgid "" "This article describes the different ways in which an individual or " "organization may contribute to the FreeBSD Project." msgstr "" "В этой статье описаны различные способы, с помощью которых отдельный человек " "или организация могут внести вклад в проект FreeBSD." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:52 msgid "'''" msgstr "'''" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:59 msgid "" "So you want to contribute to FreeBSD? That is great! FreeBSD _relies_ on the " "contributions of its user base to survive. Your contributions are not only " "appreciated, they are vital to FreeBSD's continued growth." msgstr "" "Итак, вы хотите внести свой вклад в FreeBSD? Это замечательно! FreeBSD " "_полагается_ на вклад своих пользователей для существования. Ваши усилия не " "только ценятся, они жизненно важны для дальнейшего развития FreeBSD." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:62 msgid "" "A large and growing number of international contributors, of greatly varying " "ages and areas of technical expertise, develop FreeBSD. There is always " "more work to be done than there are people available to do it, and more help " "is always appreciated." msgstr "" "FreeBSD разрабатывает большое и постоянно растущее количество участников из " "разных стран, самого разного возраста и уровня технической экспертизы. " "Работы всегда больше, чем доступных людей, и любая помощь всегда " "приветствуется." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:66 msgid "" "As a volunteer, what you do is limited only by what you want to do. " "However, we do ask that you are aware of what other members of the FreeBSD " "community will expect of you. You may want to take this into account before " "deciding to volunteer." msgstr "" "В качестве волонтёра вы ограничены только тем, чем хотите заниматься. Однако " "мы просим вас учитывать ожидания других участников сообщества FreeBSD. " "Возможно, вам стоит принять это во внимание, прежде чем решить стать " "волонтёром." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:70 msgid "" "The FreeBSD project is responsible for an entire operating system " "environment, rather than just a kernel or a few scattered utilities. As " "such, our [.filename]#TODO# lists span a very wide range of tasks: from " "documentation, beta testing and presentation, to the system installer and " "highly specialized types of kernel development. People of any skill level, " "in almost any area, can almost certainly help the project." msgstr "" "Проект FreeBSD отвечает за целостную операционную среду, а не только за ядро " "или несколько разрозненных утилит. Таким образом, наши списки [." "filename]#TODO# охватывают очень широкий спектр задач: от документации, бета-" "тестирования и презентаций до установщика системы и высокоспециализированных " "видов разработки ядра. Люди с любым уровнем навыков, практически в любой " "области, почти наверняка могут помочь проекту." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:78 msgid "" "Commercial entities engaged in FreeBSD-related enterprises are also " "encouraged to contact us. Do you need a special extension to make your " "product work? You will find us receptive to your requests, given that they " "are not too outlandish. Are you working on a value-added product? Please " "let us know! We may be able to work cooperatively on some aspect of it. The " "free software world is challenging many existing assumptions about how " "software is developed, sold, and maintained, and we urge you to at least " "give it a second look." msgstr "" "Коммерческие организации, занятые в сферах, связанных с FreeBSD, также " "приглашаются к сотрудничеству. Вам нужно специальное расширение, чтобы ваш " "продукт работал? Вы увидите, что мы отвечаем на ваши запросы, если они не " "слишком экстравагантны. Вы работаете над продуктом, добавляющим ценность " "системе? Пожалуйста, дайте нам знать! Возможно, мы сможем сотрудничать в " "каких-то аспектах. Свободное программное обеспечение бросает вызов многим " "устоявшимся представлениям о том, как разрабатывается, продаётся и " "поддерживается программное обеспечение, и мы призываем вас хотя бы взглянуть " "на него ещё раз." #. type: Title == #: documentation/content/en/articles/contributing/_index.adoc:80 #, no-wrap msgid "What Is Needed" msgstr "Что необходимо" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:83 msgid "" "The following list of tasks and sub-projects represents something of an " "amalgam of various [.filename]#TODO# lists and user requests." msgstr "" "Следующий список задач и подпроектов представляет собой своего рода " "объединение различных списков [.filename]#TODO# и запросов пользователей." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:85 #, no-wrap msgid "Ongoing Non-Programmer Tasks" msgstr "Текущие задачи для непрограммистов" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:90 msgid "" "Many people who are involved in FreeBSD are not programmers. The Project " "includes documentation writers, Web designers, and support people. All that " "these people need to contribute is an investment of time and a willingness " "to learn." msgstr "" "Многие люди, участвующие в FreeBSD, не являются программистами. Проект " "включает в себя авторов документации, веб-дизайнеров и специалистов " "поддержки. Всё, что нужно этим людям для участия, — это вложение времени и " "готовность учиться." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:94 msgid "" "Read through the FAQ and Handbook periodically. If anything is poorly " "explained, ambiguous, out of date or incorrect, let us know. Even better, " "send us a fix (AsciiDoc is not difficult to learn, but there is no objection " "to plain text submissions)." msgstr "" "Периодически перечитывайте FAQ и Руководство. Если что-то объяснено " "недостаточно ясно, неоднозначно, устарело или неверно, дайте нам знать. Ещё " "лучше — пришлите нам исправление (AsciiDoc несложно изучить, но можно " "присылать и обычный текст)." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:100 msgid "" "Help translate FreeBSD documentation into your native language. If " "documentation already exists for your language, you can help translate " "additional documents or verify that the translations are up-to-date and " -"correct. First take a look at the extref:{fdp-primer}[Translations FAQ, " -"translations] in the FreeBSD Documentation Project Primer. You are not " -"committing yourself to translating every single FreeBSD document by doing " -"this - as a volunteer, you can do as much or as little translation as you " -"desire. Once someone begins translating, others almost always join the " -"effort. If you only have the time or energy to translate one part of the " -"documentation, please translate the installation instructions." +"correct. First take a look at the extref:{fdp-primer}" +"translations[Translations FAQ, translations] in the FreeBSD Documentation " +"Project Primer. You are not committing yourself to translating every single " +"FreeBSD document by doing this - as a volunteer, you can do as much or as " +"little translation as you desire. Once someone begins translating, others " +"almost always join the effort. If you only have the time or energy to " +"translate one part of the documentation, please translate the installation " +"instructions." msgstr "" "Помогите перевести документацию FreeBSD на ваш родной язык. Если " "документация уже существует на вашем языке, вы можете помочь перевести " "дополнительные документы или проверить, что переводы актуальны и корректны. " -"Сначала ознакомьтесь с extref:{fdp-primer}[FAQ по переводам, translations] в " -"Руководстве проекта документации FreeBSD. Вы не обязаны переводить каждую " -"документацию FreeBSD — как волонтер, вы можете переводить столько, сколько " -"пожелаете. Как только кто-то начинает переводить, к этому процессу почти " -"всегда присоединяются другие. Если у вас есть время и силы перевести только " -"часть документации, пожалуйста, переведите инструкции по установке." +"Сначала ознакомьтесь с extref:{fdp-primer}translations[FAQ по переводам, " +"translations] в Руководстве проекта документации FreeBSD. Вы не обязаны " +"переводить каждую документацию FreeBSD — как волонтер, вы можете переводить " +"столько, сколько пожелаете. Как только кто-то начинает переводить, к этому " +"процессу почти всегда присоединяются другие. Если у вас есть время и силы " +"перевести только часть документации, пожалуйста, переведите инструкции по " +"установке." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:103 msgid "" "Read the {freebsd-questions} occasionally (or even regularly). It can be " "very satisfying to share your expertise and help people solve their " "problems; sometimes you may even learn something new yourself! These forums " "can also be a source of ideas for things to improve upon." msgstr "" "Читайте {freebsd-questions} время от времени (или даже регулярно). Может " "быть очень приятно делиться своими знаниями и помогать людям решать их " "проблемы; иногда вы даже можете узнать что-то новое для себя! Эти форумы " "также могут быть источником идей для улучшений." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:105 #, no-wrap msgid "Ongoing Programmer Tasks" msgstr "Текущие задачи программистов" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:109 msgid "" "Most of the tasks listed here may require a considerable investment of time, " "an in-depth knowledge of the FreeBSD kernel, or both. However, there are " "also many useful tasks which are suitable for \"weekend hackers\"." msgstr "" "Большинство перечисленных здесь задач может потребовать значительных " "временных затрат, глубоких знаний о ядре FreeBSD или того и другого. Однако, " -"есть также множество полезных задач, подходящих для \"хакеров выходного дня\"" -"." +"есть также множество полезных задач, подходящих для \"хакеров выходного дня" +"\"." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:111 msgid "" "If you run FreeBSD-CURRENT and have a good Internet connection, there is a " "machine `current.FreeBSD.org` which builds a full release once a day-every " "now and again, try to install the latest release from it and report any " "failures in the process." msgstr "" "Если вы используете FreeBSD-CURRENT и имеете хорошее подключение к " "интернету, существует машина `current.FreeBSD.org`, которая ежедневно " "собирает полный релиз — время от времени пробуйте установить последний релиз " "с неё и сообщайте о любых сбоях в процессе." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:114 msgid "" "Read the {freebsd-bugs}. There may be a problem you can comment " "constructively on or with patches you can test. Or you could even try to " "fix one of the problems yourself." msgstr "" "Прочитайте {freebsd-bugs}. Возможно, там есть проблема, по которой вы можете " "конструктивно высказаться, или патчи, которые вы можете протестировать. Или " "вы даже можете попытаться исправить одну из проблем самостоятельно." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:115 msgid "" "If you know of any bug fixes which have been successfully applied to -" "CURRENT but have not been merged into -STABLE after a decent interval " "(normally a couple of weeks), send the committer a polite reminder." msgstr "" "Если вам известны исправления ошибок, которые были успешно применены в -" "CURRENT, но не были перенесены в -STABLE в течение разумного срока (обычно " "пары недель), отправьте коммиттеру вежливое напоминание." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:116 msgid "" "Move contributed software to [.filename]#src/contrib# in the source tree." msgstr "" "Переместите стороннее программное обеспечение в [.filename]#src/contrib# в " "дереве исходных кодов." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:117 msgid "Make sure code in [.filename]#src/contrib# is up to date." msgstr "Убедитесь, что код в [.filename]#src/contrib# актуален." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:119 msgid "" "Build the source tree (or just part of it) with extra warnings enabled and " "clean up the warnings. A list of build warnings can also be found from our " "https://ci.freebsd.org[CI] by selecting a build and checking \"LLVM/Clang " "Warnings\"." msgstr "" "Соберите дерево исходников (или только его часть) с включенными " "дополнительными предупреждениями и устраните эти предупреждения. Список " "предупреждений при сборке также можно найти в нашем https://ci.freebsd." "org[CI], выбрав сборку и отметив \"LLVM/Clang Warnings\"." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:120 msgid "" "Fix warnings for ports which do deprecated things like using `gets()` or " "including [.filename]#malloc.h#." msgstr "" "Исправление предупреждений для портов, которые используют устаревшие " "функции, такие как `gets()` или включают [.filename]#malloc.h#." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:121 msgid "" "If you have contributed any ports and you had to make FreeBSD-specific " "changes, send your patches back to the original authors (this will make your " "life easier when they bring out the next version)." msgstr "" "Если вы внесли свой вклад в какие-либо порты и вам пришлось внести " "изменения, специфичные для FreeBSD, отправьте свои исправления оригинальным " "авторам (это облегчит вашу жизнь, когда они выпустят следующую версию)." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:126 msgid "" "Get copies of formal standards like POSIX(R). Compare FreeBSD's behavior to " "that required by the standard. If the behavior differs, particularly in " "subtle or obscure corners of the specification, send in a PR about it. If " "you are able, figure out how to fix it and include a patch in the PR. If " "you think the standard is wrong, ask the standards body to consider the " "question." msgstr "" "Получите копии официальных стандартов, таких как POSIX(R). Сравните " "поведение FreeBSD с требованиями стандарта. Если поведение отличается, " "особенно в сложных или малоизученных аспектах спецификации, отправьте PR об " "этом. Если вы можете, предложите исправление и включите патч в PR. Если вы " "считаете, что стандарт ошибочен, обратитесь в орган по стандартизации с " "просьбой рассмотреть этот вопрос." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:127 msgid "Suggest further tasks for this list!" msgstr "Предложите дополнительные задачи для этого списка!" #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:128 #, no-wrap msgid "Work through the PR Database" msgstr "Пройдитесь по базе данных PR" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:135 msgid "" "The https://bugs.FreeBSD.org/search/[FreeBSD PR list] shows all the current " "active problem reports and requests for enhancement that have been submitted " "by FreeBSD users. The PR database includes both programmer and non-" "programmer tasks. Look through the open PRs, and see if anything there " "takes your interest. Some of these might be very simple tasks that just " "need an extra pair of eyes to look over them and confirm that the fix in the " "PR is a good one. Others might be much more complex, or might not even have " "a fix included at all." msgstr "" "https://bugs.FreeBSD.org/search/[Список PR FreeBSD] отображает все текущие " "активные отчёты о проблемах и запросы на улучшение, отправленные " "пользователями FreeBSD. База данных PR включает как задачи для " "программистов, так и для непрограммистов. Просмотрите открытые PR и " "посмотрите, есть ли среди них что-то, что вас заинтересует. Некоторые из них " "могут быть очень простыми задачами, которым просто нужен свежий взгляд, " "чтобы проверить и подтвердить, что исправление в PR является хорошим. Другие " "могут быть гораздо сложнее или даже не содержать исправления вовсе." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:138 msgid "" "Start with the PRs that have not been assigned to anyone else. If a PR is " "assigned to someone else, but it looks like something you can handle, email " "the person it is assigned to and ask if you can work on it-they might " "already have a patch ready to be tested, or further ideas that you can " "discuss with them." msgstr "" "Начните с PR, которые никому не назначены. Если PR назначен кому-то другому, " "но вам кажется, что вы можете с ним справиться, напишите этому человеку на " "почту и спросите, можно ли вам над ним поработать — возможно, у него уже " "есть готовый патч для тестирования или дополнительные идеи, которые можно " "обсудить." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:139 #, no-wrap msgid "Ongoing Ports Tasks" msgstr "Текущие задачи портов" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:144 msgid "" "The Ports Collection is a perpetual work in progress. We want to provide " "our users with an easy to use, up to date, high quality repository of third " "party software. We need people to donate some of their time and effort to " "help us achieve this goal." msgstr "" "Коллекция портов — это постоянный процесс. Мы стремимся предоставить нашим " "пользователям удобный, современный и качественный репозиторий стороннего " "программного обеспечения. Нам нужны люди, готовые пожертвовать своим " "временем и усилиями, чтобы помочь нам достичь этой цели." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:148 msgid "" "Anyone can get involved, and there are lots of different ways to do so. " "Contributing to ports is an excellent way to help \"give back\" something to " "the project. Whether you are looking for an ongoing role, or a fun " "challenge for a rainy day, we would love to have your help!" msgstr "" "Вовлечься может любой, и способов для этого множество. Участие в разработке " "портов — отличный способ \"отдать долг\" проекту. Будь то поиск постоянной " "роли или интересный вызов на дождливый день — мы будем рады вашей помощи!" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:150 msgid "" "There are a number of easy ways you can contribute to keeping the ports tree " "up to date and in good working order:" msgstr "" "Есть несколько простых способов помочь поддерживать дерево портов в " "актуальном состоянии и в хорошем рабочем порядке:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:152 msgid "" "Find some cool or useful software and extref:{porters-handbook}[create a " "port] for it." msgstr "" "Найдите интересное или полезное программное обеспечение и extref:{porters-" "handbook}[создайте порт] для него." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:154 msgid "" "There are a large number of ports that have no maintainer. Become a " "maintainer and crossref:contributing[adopt-port, Adopting an unmaintained " "port]." msgstr "" "Существует множество портов, у которых нет сопровождающего. Станьте " "сопровождающим и crossref:contributing[adopt-port, Возьмите на сопровождение " "неподдерживаемый порт]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:155 msgid "" "If you have created or adopted a port, be aware of crossref:" "contributing[maintain-port, The challenge for port maintainers]." msgstr "" -"Если вы создали или адаптировали порт, обратите внимание на раздел " -"crossref:contributing[maintain-port, Задача для сопровождающих портов]." +"Если вы создали или адаптировали порт, обратите внимание на раздел crossref:" +"contributing[maintain-port, Задача для сопровождающих портов]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:156 msgid "" "When you are looking for a quick challenge you could crossref:" "contributing[fix-broken, Finding and fixing a broken port]." msgstr "" "Если вы ищете быстрый вызов, вы можете crossref:contributing[fix-broken, " "Найти и исправить сломанный порт]." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:157 #, no-wrap msgid "Pick one of the items from the Ideas page" msgstr "Выберите один из пунктов со страницы Идеи" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:161 msgid "" "The https://wiki.freebsd.org/IdeasPage[FreeBSD list of projects and ideas " "for volunteers] is also available for people willing to contribute to the " "FreeBSD project. The list is being regularly updated and contains items for " "both programmers and non-programmers with information about each project." msgstr "" "https://wiki.freebsd.org/IdeasPage[Список проектов и идей FreeBSD для " "волонтёров] также доступен для тех, кто хочет внести свой вклад в проект " "FreeBSD. Список регулярно обновляется и содержит пункты как для " "программистов, так и для не-программистов, с информацией о каждом проекте." #. type: Title == #: documentation/content/en/articles/contributing/_index.adoc:163 #, no-wrap msgid "How to Contribute" msgstr "Как внести свой вклад" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:166 msgid "" "Contributions to the system generally fall into one or more of the following " "5 categories:" msgstr "" "Вклады в систему обычно относятся к одной или нескольким из следующих 5 " "категорий:" #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:168 #, no-wrap msgid "Bug Reports and General Commentary" msgstr "Отчеты об ошибках и общие комментарии" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:173 msgid "" "An idea or suggestion of _general_ technical interest should be mailed to " "the {freebsd-hackers}. Likewise, people with an interest in such things " "(and a tolerance for a _high_ volume of mail!) may subscribe to the {freebsd-" -"hackers}. See extref:{handbook}[The FreeBSD Handbook, eresources-mail] for " -"more information about this and other mailing lists." +"hackers}. See extref:{handbook}eresources[The FreeBSD Handbook, eresources-" +"mail] for more information about this and other mailing lists." msgstr "" "Идея или предложение, представляющие _общий_ технический интерес, должны " "быть отправлены на {freebsd-hackers}. Аналогично, люди, заинтересованные в " "подобных вещах (и готовые терпеть _высокий_ объем почты!), могут подписаться " "на {freebsd-hackers}. Дополнительную информацию об этом и других списках " -"рассылки см. в extref:{handbook}[The FreeBSD Handbook, eresources-mail]." +"рассылки см. в extref:{handbook}eresources[The FreeBSD Handbook, eresources-" +"mail]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:176 msgid "" "If you are submitting a simple patch to the src repo, please consider " "submitting it to the project's GitHub mirror as https://github.com/freebsd/" "freebsd-src/pulls[a pull request]. Suitable submissions should:" msgstr "" "Если вы отправляете простой патч в репозиторий src, рассмотрите возможность " "отправить его в зеркало проекта на GitHub как https://github.com/freebsd/" "freebsd-src/pulls[запрос на включение]. Подходящие отправки должны:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:179 msgid "" "It is ready or nearly ready to be committed. A committer should be able to " "land this patch with less than 10 minutes of additional work." msgstr "" "Готово или почти готово для включения. Коммиттер должен быть в состоянии " "применить этот патч с менее чем 10 минутами дополнительной работы." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:180 msgid "It passes all the GitHub CI jobs." msgstr "Он проходит все задания GitHub CI." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:181 msgid "You can respond to feedback quickly." msgstr "Вы можете быстро реагировать на обратную связь." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:183 msgid "" "It touches fewer than about 10 files and the changes are less than about 200 " "lines. Changes larger than this may be OK, or you may be asked to submit " "multiple pull requests of a more manageable size." msgstr "" "Он затрагивает менее 10 файлов, а изменения составляют менее 200 строк. " "Изменения большего размера могут быть допустимы, или вас могут попросить " "отправить несколько запросов на включение более удобного размера." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:185 msgid "" "Each logical change is a separate commit within the pull request. Commit " "messages for each change should follow extref:{committers-guide}#commit-log-" "message[commit log guide]." msgstr "" "Каждое логическое изменение — это отдельный коммит в рамках pull request. " -"Сообщения коммитов для каждого изменения должны соответствовать extref" -":{committers-guide}#commit-log-message[руководству по оформлению логов " +"Сообщения коммитов для каждого изменения должны соответствовать extref:" +"{committers-guide}#commit-log-message[руководству по оформлению логов " "коммитов]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:187 msgid "" "All commits have your name and valid email address as you'd like to see them " "in the FreeBSD repository as the author. Fake github.com addresses cannot " "be used." msgstr "" "Все коммиты содержат ваше имя и действительный адрес электронной почты, " "которые вы хотите видеть в репозитории FreeBSD в качестве автора. Поддельные " "адреса github.com использовать нельзя." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:189 msgid "" "The scope of the pull request should not change during review. If the " "review suggests changes that expand the scope, please create an independent " "pull request." msgstr "" "Объем pull request не должен меняться в процессе проверки. Если в ходе " "проверки предложены изменения, расширяющие объем, создайте отдельный pull " "request." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:191 msgid "" "Fixup commits should be squashed with the commit they are fixing. Each " "commit in your branch should be suitable for FreeBSD's repository." msgstr "" "Исправляющие коммиты должны быть объединены (squash) с коммитом, который они " "исправляют. Каждый коммит в вашей ветке должен быть пригоден для репозитория " "FreeBSD." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:192 msgid "" "Commits should include one or more `Signed-off-by:` lines with full name and " "email address certifying https://developercertificate.org/[Developer " "Certificate of Origin]." msgstr "" "Коммиты должны включать одну или несколько строк `Signed-off-by:` с полным " -"именем и адресом электронной почты, подтверждающими " -"https://developercertificate.org/[Сертификат происхождения разработчика]." +"именем и адресом электронной почты, подтверждающими https://" +"developercertificate.org/[Сертификат происхождения разработчика]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:197 msgid "" "When updating pull request, please rebase with a forced push rather than a " "merge commit. More complex changes may be submitted as pull requests, but " "they may be closed if they are too large, too unwieldy, become inactive, " "need further discussion in the community, or need extensive revision. " "Please avoid creating large, wide-ranging cleanup patches: they are too " "large and lack the focus needed for a good review. Misdirected patches may " "be redirected to a more appropriate forum for the patch to be resolved." msgstr "" "При обновлении запроса на включение изменений, пожалуйста, выполняйте " "перебазирование с принудительной отправкой (forced push), а не слиянием " "через коммит (merge commit). Более сложные изменения могут быть отправлены " "как запросы на включение (pull request), но они могут быть отклонены и " "закрыты, если они слишком большие, слишком громоздкие, становятся " "неактивными, требуют дополнительного обсуждения в сообществе или нуждаются в " "значительной доработке. Пожалуйста, избегайте создания больших, " "широкомасштабных патчей для очистки: они слишком велики и не обладают " "необходимой фокусировкой для качественного рецензирования. Патчи, " "отправленные не по адресу, могут быть перенаправлены в более подходящий " "форум для их доработки." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:201 msgid "" "Pull requests submitted to the ports repository may or may not see action, " "based on the whims of developers. For now, you will have a better " "experience if you follow the ports submission process crossref:" "contributing[ports-contributing, Contributing to ports]." msgstr "" "Запросы на включение изменений, отправленные в репозиторий портов, могут " "быть обработаны или проигнорированы, в зависимости от настроения " "разработчиков. На данный момент, вам будет проще, если вы будете следовать " "процессу отправки портов crossref:contributing[ports-contributing, Вклад в " "порты]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:203 msgid "" "The docs team also accepts pull requests via GitHub, but has not established " "any policy for them yet." msgstr "" "Команда документации также принимает pull requests через GitHub, но пока не " "установила для них никакой политики." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:210 msgid "" "If you find a bug or are submitting a specific change, please report it " "using the https://bugs.FreeBSD.org/submit/[bug submission form]. Try to " "fill-in each field of the bug report. Unless they exceed 65KB, include any " "patches directly in the report. If the patch is suitable to be applied to " "the source tree put `[PATCH]` in the synopsis of the report. When including " "patches, _do not_ use cut-and-paste because cut-and-paste turns tabs into " "spaces and makes them unusable. When patches are a lot larger than 20KB, " "consider compressing them (for example with man:gzip[1] or man:bzip2[1]) " "prior to uploading them." msgstr "" "Если вы обнаружили ошибку или хотите отправить конкретное изменение, " -"пожалуйста, сообщите об этом, используя https://bugs.FreeBSD.org/submit/[" -"форму отправки отчёта об ошибках]. Постарайтесь заполнить каждое поле " +"пожалуйста, сообщите об этом, используя https://bugs.FreeBSD.org/submit/" +"[форму отправки отчёта об ошибках]. Постарайтесь заполнить каждое поле " "отчёта. Если патчи не превышают 65 КБ, включите их непосредственно в отчёт. " "Если патч подходит для применения к исходному дереву, укажите `[PATCH]` в " "кратком описании отчёта. При включении патчей _не_ используйте копирование и " "вставку, так как это превращает табуляции в пробелы и делает их " "непригодными. Если патчи значительно превышают 20 КБ, рассмотрите " "возможность их сжатия (например, с помощью man:gzip[1] или man:bzip2[1]) " "перед загрузкой." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:213 msgid "" "After filing a report, you should receive confirmation along with a tracking " "number. Keep this tracking number so that you can update us with details " "about the problem." msgstr "" "После подачи отчета вы должны получить подтверждение вместе с номером для " "отслеживания. Сохраните этот номер, чтобы вы могли сообщить нам " "дополнительные сведения о проблеме." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:215 msgid "" "See also extref:{problem-reports}[this article] on how to write good problem " "reports." msgstr "" "См. также extref:{problem-reports}[эту статью] о том, как писать хорошие " "отчёты о проблемах." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:216 #, no-wrap msgid "Changes to the Documentation" msgstr "Изменения в документации" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:221 msgid "" "Changes to the documentation are overseen by the {freebsd-doc}. Please look " "at the extref:{fdp-primer}[FreeBSD Documentation Project Primer] for " "complete instructions. Send submissions and changes (even small ones are " "welcome!) using the same method as any other bug report." msgstr "" "Изменения в документации контролируются {freebsd-doc}. Пожалуйста, " "ознакомьтесь с руководством extref:{fdp-primer}[Проект документации FreeBSD: " "введение для новых участников] для получения полных инструкций. Отправляйте " "исправления и изменения (даже небольшие правки приветствуются!) тем же " "способом, что и другие отчёты об ошибках." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:222 #, no-wrap msgid "Changes to Existing Source Code" msgstr "Изменения в существующем исходном коде" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:227 msgid "" "An addition or change to the existing source code is a somewhat trickier " "affair and depends a lot on how far out of date you are with the current " "state of FreeBSD development. There is a special on-going release of " "FreeBSD known as \"FreeBSD-CURRENT\" which is made available in a variety of " "ways for the convenience of developers working actively on the system. See " -"extref:{handbook}[The FreeBSD Handbook, current-stable] for more information " -"about getting and using FreeBSD-CURRENT." +"extref:{handbook}cutting-edge[The FreeBSD Handbook, current-stable] for more " +"information about getting and using FreeBSD-CURRENT." msgstr "" "Добавление или изменение существующего исходного кода — это несколько более " "сложная задача, которая во многом зависит от того, насколько сильно вы " "отстали от текущего состояния разработки FreeBSD. Существует специальная " "постоянно обновляемая версия FreeBSD, известная как \"FreeBSD-CURRENT\", " "которая доступна различными способами для удобства разработчиков, активно " "работающих над системой. Подробнее о получении и использовании FreeBSD-" -"CURRENT можно узнать в extref:{handbook}[Руководстве FreeBSD, current-" -"stable]." +"CURRENT можно узнать в extref:{handbook}cutting-edge[Руководстве FreeBSD, " +"current-stable]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:230 msgid "" "Working from older sources unfortunately means that your changes may " "sometimes be too obsolete or too divergent for easy re-integration into " "FreeBSD. Chances of this can be minimized somewhat by subscribing to the " "{freebsd-announce} and the {freebsd-current} lists, where discussions on the " "current state of the system take place." msgstr "" "Работа с устаревшими исходниками, к сожалению, означает, что ваши изменения " "иногда могут быть слишком устаревшими или слишком расходящимися для лёгкого " "повторного включения в FreeBSD. Шансы на это можно несколько уменьшить, " "подписавшись на списки рассылки {freebsd-announce} и {freebsd-current}, где " "обсуждается текущее состояние системы." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:233 msgid "" "Assuming that you can manage to secure fairly up-to-date sources to base " "your changes on, the next step is to produce a set of diffs to send to the " "FreeBSD maintainers. This is done with the man:diff[1] command." msgstr "" "Предполагая, что вам удалось получить достаточно актуальные исходные коды " "для внесения изменений, следующий шаг — создать набор различий (diff) для " "отправки сопровождающим FreeBSD. Это делается с помощью команды man:diff[1]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:235 msgid "" "The preferred man:diff[1] format for submitting patches is the unified " "output format generated by `diff -u`." msgstr "" "Предпочтительным форматом man:diff[1] для отправки исправлений является " "унифицированный формат вывода, создаваемый командой `diff -u`." #. type: delimited block . 4 #: documentation/content/en/articles/contributing/_index.adoc:239 #, no-wrap msgid "% diff -u oldfile newfile\n" msgstr "% diff -u oldfile newfile\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:242 msgid "or" msgstr "или" #. type: delimited block . 4 #: documentation/content/en/articles/contributing/_index.adoc:246 #, no-wrap msgid "% diff -u -r -N olddir newdir\n" msgstr "% diff -u -r -N olddir newdir\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:249 msgid "" "would generate a set of unified diffs for the given source file or directory " "hierarchy." msgstr "" "сгенерирует набор унифицированных diff-файлов для указанного исходного файла " "или иерархии каталогов." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:251 msgid "See man:diff[1] for more information." msgstr "См. man:diff[1] для получения дополнительной информации." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:255 msgid "" "Once you have a set of diffs (which you may test with the man:patch[1] " "command), you should submit them for inclusion with FreeBSD as a bug " "report. _Do not_ just send the diffs to the {freebsd-hackers} or they will " "get lost! We greatly appreciate your submission (this is a volunteer " "project!); because we are busy, we may not be able to address it " "immediately, but it will remain in the PR database until we do. Indicate " "your submission by including `[PATCH]` in the synopsis of the report." msgstr "" "После того как у вас есть набор изменений (которые вы можете проверить с " "помощью команды man:patch[1]), вам следует отправить их для включения в " "FreeBSD в виде отчета об ошибке. _Не отправляйте_ изменения просто на " "{freebsd-hackers}, иначе они могут потеряться! Мы очень ценим ваши " "предложения (это добровольный проект!); поскольку мы заняты, мы не всегда " "можем обработать их сразу, но они останутся в базе данных PR, пока мы не " "дойдем до них. Укажите, что это предложение изменений, добавив `[PATCH]` в " "заголовок отчета." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:257 msgid "" "If you feel it appropriate (for example you have added, deleted, or renamed " "files), bundle your changes into a `tar` file." msgstr "" "Если вы считаете это уместным (например, вы добавили, удалили или " "переименовали файлы), упакуйте свои изменения в файл `tar`." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:261 msgid "" "If your change is of a potentially sensitive nature, such as if you are " "unsure of copyright issues governing its further distribution then you " "should send it to {core-email} directly rather than submitting as a bug " "report. The {core-email} reaches a much smaller group of people who do much " "of the day-to-day work on FreeBSD. Note that this group is also _very busy_ " "and so you should only send mail to them where it is truly necessary." msgstr "" "Если ваше изменение носит потенциально чувствительный характер, например, " "если вы не уверены в вопросах авторского права, регулирующих его дальнейшее " -"распространение, то вам следует отправить его напрямую по адресу {core-email}" -", а не подавать как отчёт об ошибке. Письмо на {core-email} достигает " +"распространение, то вам следует отправить его напрямую по адресу {core-" +"email}, а не подавать как отчёт об ошибке. Письмо на {core-email} достигает " "гораздо меньшей группы людей, которые выполняют большую часть повседневной " "работы над FreeBSD. Обратите внимание, что эта группа также _очень занята_, " "поэтому вам следует писать им только в случае действительной необходимости." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:264 msgid "" "Please refer to man:intro[9] and man:style[9] for some information on coding " "style. We would appreciate it if you were at least aware of this " "information before submitting code." msgstr "" "Пожалуйста, обратитесь к man:intro[9] и man:style[9] для получения " "информации о стиле написания кода. Мы будем признательны, если вы хотя бы " "ознакомитесь с этой информацией перед отправкой кода." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:265 #, no-wrap msgid "New Code or Major Value-Added Packages" msgstr "Новый код или основные пакеты с добавленной стоимостью" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:269 msgid "" "In the case of a significant contribution of a large body work, or the " "addition of an important new feature to FreeBSD, it becomes almost always " "necessary to either send changes as tar files or upload them to a web or FTP " "site for other people to access. If you do not have access to a web or FTP " "site, ask on an appropriate FreeBSD mailing list for someone to host the " "changes for you." msgstr "" "В случае значительного вклада в виде большого объёма работы или добавления " "важной новой функции в FreeBSD, почти всегда необходимо либо отправить " "изменения в виде tar-файлов, либо загрузить их на веб- или FTP-сайт для " "доступа других людей. Если у вас нет доступа к веб- или FTP-сайту, запросите " "на соответствующем списке рассылки FreeBSD, чтобы кто-то разместил изменения " "для вас." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:274 msgid "" "When working with large amounts of code, the touchy subject of copyrights " "also invariably comes up. FreeBSD prefers free software licenses such as " "BSD or ISC. Copyleft licenses such as GPLv2 are sometimes permitted. The " "complete listing can be found on the link:https://www.FreeBSD.org/internal/" "software-license/[core team licensing policy] page." msgstr "" "При работе с большими объемами кода неизбежно возникает деликатная тема " "авторских прав. FreeBSD предпочитает свободные лицензии, такие как BSD или " "ISC. Коплефтные лицензии, например GPLv2, иногда допускаются. Полный список " -"можно найти на странице link:https://www.FreeBSD.org/internal/" -"software-license/[политики лицензирования основной команды]." +"можно найти на странице link:https://www.FreeBSD.org/internal/software-" +"license/[политики лицензирования основной команды]." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:275 #, no-wrap msgid "Money or Hardware" msgstr "Деньги или Оборудование" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:279 msgid "" "We are always very happy to accept donations to further the cause of the " "FreeBSD Project and, in a volunteer effort like ours, a little can go a long " "way! Donations of hardware are also very important to expanding our list of " "supported peripherals since we generally lack the funds to buy such items " "ourselves." msgstr "" "Мы всегда рады пожертвованиям для поддержки проекта FreeBSD, и в " "добровольческих усилиях, подобных нашим, даже небольшая помощь может иметь " "большое значение! Пожертвования оборудования также очень важны для " "расширения списка поддерживаемых периферийных устройств, поскольку у нас " "обычно нет средств на их приобретение." #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:281 #, no-wrap msgid "Donating Funds" msgstr "Пожертвование средств" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:286 msgid "" "The https://www.freebsdfoundation.org[FreeBSD Foundation] is a non-profit, " "tax-exempt foundation established to further the goals of the FreeBSD " "Project. As a 501(c)3 entity, the Foundation is generally exempt from US " "federal income tax as well as Colorado State income tax. Donations to a tax-" "exempt entity are often deductible from taxable federal income." msgstr "" -"https://www.freebsdfoundation.org[FreeBSD Foundation] — это некоммерческий, " -"освобожденный от налогов фонд, созданный для поддержки целей проекта " -"FreeBSD. Как организация 501(c)3, Фонд, как правило, освобожден от " +"https://www.freebsdfoundation.org[Фонд FreeBSD (FreeBSD Foundation)] — это " +"некоммерческий, освобожденный от налогов фонд, созданный для поддержки целей " +"проекта FreeBSD. Как организация 501(c)3, Фонд, как правило, освобожден от " "федерального подоходного налога США, а также от подоходного налога штата " "Колорадо. Пожертвования освобожденным от налогов организациям часто " "вычитаются из налогооблагаемого федерального дохода." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:288 msgid "Donations may be sent in check form to:" msgstr "Пожертвования можно отправить в виде чека по адресу:" #. type: delimited block * 4 #: documentation/content/en/articles/contributing/_index.adoc:296 #, no-wrap msgid "" "The FreeBSD Foundation\n" "3980 Broadway Street\n" "STE #103-107\n" "Boulder CO 80304\n" "USA" msgstr "" "The FreeBSD Foundation\n" "3980 Broadway Street\n" "STE #103-107\n" "Boulder CO 80304\n" "USA" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:299 msgid "" "The FreeBSD Foundation is also able to accept https://www.freebsdfoundation." "org/donate/[online donations] through various payment options." msgstr "" "Фонд FreeBSD также принимает https://www.freebsdfoundation.org/donate/" "[онлайн-пожертвования] через различные варианты оплаты." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:302 msgid "" "More information about the FreeBSD Foundation can be found in https://people." "FreeBSD.org/~jdp/foundation/announcement.html[The FreeBSD Foundation -- an " "Introduction]. To contact the Foundation by email, write to mailto:" "info@FreeBSDFoundation.org[info@FreeBSDFoundation.org]." msgstr "" "Дополнительная информация о Фонде FreeBSD доступна по ссылке https://people." "FreeBSD.org/~jdp/foundation/announcement.html[Фонд FreeBSD — введение]. " -"Чтобы связаться с Фондом по электронной почте, напишите на " -"mailto:info@FreeBSDFoundation.org[info@FreeBSDFoundation.org]." +"Чтобы связаться с Фондом по электронной почте, напишите на mailto:" +"info@FreeBSDFoundation.org[info@FreeBSDFoundation.org]." #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:303 #, no-wrap msgid "Donating Hardware" msgstr "Пожертвование оборудования" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:307 msgid "" "The FreeBSD Project happily accepts donations of hardware that it can find " "good use for. If you are interested in donating hardware, please contact " "the link:https://www.FreeBSD.org/donations/[Donations Liaison Office]." msgstr "" "Проект FreeBSD с благодарностью принимает пожертвования в виде оборудования, " "которое может быть полезно для проекта. Если вы хотите пожертвовать " "оборудование, пожалуйста, свяжитесь с link:https://www.FreeBSD.org/donations/" "[Офисом по связям с пожертвованиями]." #. type: Title == #: documentation/content/en/articles/contributing/_index.adoc:309 #, no-wrap msgid "Contributing to ports" msgstr "Вклад в порты" #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:312 #, no-wrap msgid "Adopting an unmaintained port" msgstr "Принятие сопровождения неподдерживаемого порта" #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:314 #, no-wrap msgid "Choosing an unmaintained port" msgstr "Выбор неподдерживаемого порта" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:320 msgid "" "Taking over maintainership of ports that are unmaintained is a great way to " "get involved. Unmaintained ports are only updated and fixed when somebody " "volunteers to work on them. There are a large number of unmaintained " "ports. It is a good idea to start with adopting a port that you use " "regularly." msgstr "" "Принятие на себя сопровождения необслуживаемых портов — это отличный способ " "принять участие. Необслуживаемые порты обновляются и исправляются только " "тогда, когда кто-то добровольно берется за работу над ними. Существует " "большое количество необслуживаемых портов. Хорошей идеей будет начать с " "порта, который вы используете регулярно." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:323 msgid "" "Unmaintained ports have their `MAINTAINER` set to `ports@FreeBSD.org`. Many " "unmaintained ports can have pending updates, this can be seen at the https://" "portscout.freebsd.org/ports@freebsd.org.html[FreeBSD Ports distfile scanner]." msgstr "" "Неподдерживаемые порты имеют параметр `MAINTAINER`, установленный в " "`ports@FreeBSD.org`. Многие неподдерживаемые порты могут иметь ожидающие " "обновления, это можно увидеть на https://portscout.freebsd.org/ports@freebsd." "org.html[сканере дистрибутивных файлов портов FreeBSD]." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:325 msgid "" "On https://portsfallout.com/fallout?port=&maintainer=ports%40FreeBSD." "org[PortsFallout] can be seen a list of unmaintained ports with errors." msgstr "" "На https://portsfallout.com/fallout?port=&maintainer=ports%40FreeBSD." "org[PortsFallout] можно увидеть список неподдерживаемых портов с ошибками." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:328 msgid "" "Some ports affect a large number of others due to dependencies and secondary " "port relationships. Generally, we want people to have some experience " "before they maintain such ports." msgstr "" "Некоторые порты влияют на большое количество других из-за зависимостей и " "вторичных связей между портами. Обычно мы хотим, чтобы у людей был некоторый " "опыт, прежде чем они начнут сопровождать такие порты." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:332 msgid "" "You can find out whether or not a port has dependencies or secondary ports " "by looking at a primary index of ports called [.filename]#INDEX#. (The name " "of the file varies by release of FreeBSD; for instance, [." "filename]#INDEX-13#.) Some ports have conditional dependencies that are not " "included in a default [.filename]#INDEX# build. We expect you to be able to " "recognize such ports by looking through other ports' [.filename]#Makefile#'s." msgstr "" "Вы можете узнать, есть ли у порта зависимости или вторичные порты, посмотрев " "в основной индекс портов под названием [.filename]#INDEX#. (Имя файла может " "различаться в зависимости от версии FreeBSD; например, [." "filename]#INDEX-13#.) Некоторые порты имеют условные зависимости, которые не " "включены в стандартную сборку [.filename]#INDEX#. Мы ожидаем, что вы сможете " "распознать такие порты, просмотрев [.filename]#Makefile# других портов." #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:333 #, no-wrap msgid "How to adopt the port" msgstr "Как принять сопровождение порта" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:338 msgid "" "First make sure you understand your crossref:contributing[maintain-port, The " "challenge for port maintainers]. Also read the extref:{porters-handbook}" "[Porter's Handbook]. _Please do not commit yourself to more than you feel " "you can comfortably handle._" msgstr "" "Убедитесь, что вы понимаете раздел crossref:contributing[maintain-port, " -"Задача для сопровождающих портов]. Также прочитайте extref:{porters-" -"handbook}[Руководство FreeBSD по созданию портов]. _Пожалуйста, не берите на " -"себя больше, чем вам комфортно выполнять._" +"Задача для сопровождающих портов]. Также прочитайте extref:{porters-handbook}" +"[Руководство FreeBSD по созданию портов]. _Пожалуйста, не берите на себя " +"больше, чем вам комфортно выполнять._" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:344 msgid "" "You may request maintainership of any unmaintained port as soon as you " "wish. Simply set `MAINTAINER` to your own email address and send a PR " "(Problem Report) with the change. If the port has build errors or needs " "updating, you may wish to include any other changes in the same PR. This " "will help because many committers are less willing to assign maintainership " "to someone who does not have a known track record with FreeBSD. Submitting " "PRs that fix build errors or update ports are the best ways to establish one." msgstr "" "Вы можете запросить статус сопровождающего для любого неподдерживаемого " "порта, как только пожелаете. Просто установите `MAINTAINER` на ваш " "собственный адрес электронной почты и отправьте PR (Problem Report) с этим " "изменением. Если порт имеет ошибки сборки или нуждается в обновлении, вы " "можете включить другие изменения в тот же PR. Это поможет, поскольку многие " "коммиттеры менее склонны назначать сопровождающего тому, у кого нет " "известной истории работы с FreeBSD. Отправка PR, исправляющих ошибки сборки " "или обновляющих порты, — лучший способ её установить." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:348 msgid "" "File your PR with Product `Ports & Packages`. A committer will examine your " "PR, commit the changes, and finally close the PR. Sometimes this process " "can take a little while (committers are volunteers, too :)." msgstr "" "Подайте ваш PR в категорию `Порты и пакеты`. Коммиттер проверит ваш PR, " "закоммитит изменения и в конце закрыт PR. Иногда этот процесс может занять " "некоторое время (коммиттеры тоже волонтеры :)." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:350 #, no-wrap msgid "The challenge for port maintainers" msgstr "Задача для сопровождающих портов" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:353 msgid "" "This section will give you an idea of why ports need to be maintained and " "outline the responsibilities of a port maintainer." msgstr "" "В этом разделе вы узнаете, зачем нужно поддерживать порты, а также " "ознакомитесь с обязанностями сопровождающего портов." #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:355 #, no-wrap msgid "Why ports require maintenance" msgstr "Почему порты требуют обслуживания" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:360 msgid "" "Creating a port is a once-off task. Ensuring that a port is up to date and " "continues to build and run requires an ongoing maintenance effort. " "Maintainers are the people who dedicate some of their time to meeting these " "goals." msgstr "" "Создание порта — это разовая задача. Обеспечение актуальности порта, его " "сборки и работы требует постоянных усилий по поддержке. Поддерживающие " "(maintainers) — это люди, которые посвящают часть своего времени достижению " "этих целей." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:363 msgid "" "The foremost reason ports need maintenance is to bring the latest and " "greatest in third party software to the FreeBSD community. An additional " "challenge is to keep individual ports working within the Ports Collection " "framework as it evolves." msgstr "" "Основная причина, по которой порты требуют обслуживания, — это " "предоставление новейших и лучших сторонних программных решений сообществу " "FreeBSD. Дополнительная задача — обеспечение работоспособности отдельных " "портов в рамках коллекции Ports по мере её развития." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:365 msgid "As a maintainer, you will need to manage the following challenges:" msgstr "Как сопровождающему, вам потребуется управлять следующими задачами:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:367 #, no-wrap msgid "*New software versions and updates.* New versions and updates of existing ported software become available all the time, and these need to be incorporated into the Ports Collection to provide up-to-date software.\n" -msgstr "" -"*Новые версии программного обеспечения и обновления.* Новые версии и " -"обновления существующего портированного программного обеспечения появляются " -"постоянно, и их необходимо включать в Коллекцию портов, чтобы обеспечить " -"актуальное ПО.\n" +msgstr "*Новые версии программного обеспечения и обновления.* Новые версии и обновления существующего портированного программного обеспечения появляются постоянно, и их необходимо включать в Коллекцию портов, чтобы обеспечить актуальное ПО.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:369 #, no-wrap msgid "*Changes to dependencies.* If significant changes are made to the dependencies of your port, it may need to be updated so that it will continue to work correctly.\n" -msgstr "" -"*Изменения в зависимостях.* Если в зависимостях вашего порта были внесены " -"значительные изменения, возможно, его потребуется обновить, чтобы он " -"продолжал работать корректно.\n" +msgstr "*Изменения в зависимостях.* Если в зависимостях вашего порта были внесены значительные изменения, возможно, его потребуется обновить, чтобы он продолжал работать корректно.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:371 #, no-wrap msgid "*Changes affecting dependent ports.* If other ports depend on a port that you maintain, changes to your port may require coordination with other maintainers.\n" -msgstr "" -"*Изменения, затрагивающие зависимые порты.* Если другие порты зависят от " -"порта, который вы поддерживаете, изменения в вашем порте могут потребовать " -"согласования с другими сопровождающими.\n" +msgstr "*Изменения, затрагивающие зависимые порты.* Если другие порты зависят от порта, который вы поддерживаете, изменения в вашем порте могут потребовать согласования с другими сопровождающими.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:374 #, no-wrap msgid "" "*Interaction with other users, maintainers and developers.* Part of being a maintainer is taking on a support role.\n" "You are not expected to provide general support (but we welcome it if you choose to do so). What you should provide is a point of coordination for FreeBSD-specific issues regarding your ports.\n" msgstr "" -"*Взаимодействие с другими пользователями, сопровождающими и разработчиками.* " -"Часть обязанностей сопровождающего включает в себя поддержку.\n" -"От вас не ожидают предоставления общей поддержки (но мы приветствуем это, " -"если вы решите её оказывать). Ваша задача — быть точкой координации по " -"вопросам, связанным с вашими портами, специфичным для FreeBSD.\n" +"*Взаимодействие с другими пользователями, сопровождающими и разработчиками.* Часть обязанностей сопровождающего включает в себя поддержку.\n" +"От вас не ожидают предоставления общей поддержки (но мы приветствуем это, если вы решите её оказывать). Ваша задача — быть точкой координации по вопросам, связанным с вашими портами, специфичным для FreeBSD.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:378 #, no-wrap msgid "" "*Bug hunting.* A port may be affected by bugs which are specific to FreeBSD.\n" "You will need to investigate, find, and fix these bugs when they are reported.\n" "Thoroughly testing a port to identify problems before they make their way into the Ports Collection is even better.\n" msgstr "" "*Поиск ошибок.* Порт может быть подвержен ошибкам, специфичным для FreeBSD.\n" -"Вам потребуется исследовать, находить и исправлять эти ошибки при их " -"поступлении.\n" -"Ещё лучше тщательно тестировать порт для выявления проблем до их попадания в " -"Коллекцию портов.\n" +"Вам потребуется исследовать, находить и исправлять эти ошибки при их поступлении.\n" +"Ещё лучше тщательно тестировать порт для выявления проблем до их попадания в Коллекцию портов.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:381 #, no-wrap msgid "" "*Changes to ports infrastructure and policy.* Occasionally the systems that are used to build ports and packages are updated or a new recommendation affecting the infrastructure is made.\n" "You should be aware of these changes in case your ports are affected and require updating.\n" msgstr "" -"*Изменения в инфраструктуре и политике портов.* Иногда обновляются системы, " -"используемые для сборки портов и пакетов, или появляются новые рекомендации, " -"влияющие на инфраструктуру.\n" -"Вам следует учитывать эти изменения, если ваши порты затронуты и требуют " -"обновления.\n" +"*Изменения в инфраструктуре и политике портов.* Иногда обновляются системы, используемые для сборки портов и пакетов, или появляются новые рекомендации, влияющие на инфраструктуру.\n" +"Вам следует учитывать эти изменения, если ваши порты затронуты и требуют обновления.\n" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:384 #, no-wrap msgid "" "*Changes to the base system.* FreeBSD is under constant development.\n" "Changes to software, libraries, the kernel or even policy changes can cause flow-on change requirements to ports.\n" msgstr "" "*Изменения в базовой системе.* FreeBSD находится в постоянной разработке.\n" -"Изменения в программном обеспечении, библиотеках, ядре или даже изменения " -"политики могут вызвать каскадные требования к изменениям в портах.\n" +"Изменения в программном обеспечении, библиотеках, ядре или даже изменения политики могут вызвать каскадные требования к изменениям в портах.\n" #. type: Title ==== #: documentation/content/en/articles/contributing/_index.adoc:385 #, no-wrap msgid "Maintainer responsibilities" msgstr "Обязанности сопровождающего" #. type: Title ===== #: documentation/content/en/articles/contributing/_index.adoc:387 #, no-wrap msgid "Keep your ports up to date" msgstr "Поддерживайте свои порты в актуальном состоянии" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:390 msgid "" "This section outlines the process to follow to keep your ports up to date." msgstr "" "В этом разделе описаны шаги, которые необходимо выполнить, чтобы " "поддерживать ваши порты в актуальном состоянии." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:393 msgid "" "This is an overview. More information about upgrading a port is available " "in the extref:{porters-handbook}[Porter's Handbook]." msgstr "" "Это общий обзор. Дополнительная информация об обновлении порта доступна в " "extref:{porters-handbook}[Руководстве FreeBSD по созданию портов]." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:397 msgid "Watch for updates" msgstr "Следите за обновлениями" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:402 msgid "" "Monitor the upstream vendor for new versions, updates and security fixes for " "the software. Announcement mailing lists or news web pages are useful for " "doing this. Sometimes users will contact you and ask when your port will be " "updated. If you are busy with other things or for any reason just cannot " "update it at the moment, ask if they will help you by submitting an update." msgstr "" "Отслеживайте у вышестоящего поставщика появление новых версий, обновлений и " "исправлений безопасности для программного обеспечения. Для этого полезны " "списки рассылки объявлений или новостные веб-страницы. Иногда пользователи " "могут связаться с вами и спросить, когда ваш порт будет обновлен. Если вы " "заняты другими делами или по какой-либо причине просто не можете обновить " "его в данный момент, спросите, могут ли они помочь вам, предоставив " "обновление." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:405 msgid "" "You may also receive automated email from the `FreeBSD Ports Version Check` " "informing you that a newer version of your port's distfile is available. " "More information about that system (including how to stop future emails) " "will be provided in the message." msgstr "" "Вы также можете получать автоматические письма от `FreeBSD Ports Version " "Check`, уведомляющие о доступности новой версии дистрибутивного файла вашего " "порта. В сообщении будет предоставлена дополнительная информация об этой " "системе (включая инструкции по остановке будущих писем)." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:406 msgid "Incorporate changes" msgstr "Вносите изменения" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:409 msgid "" "When they become available, incorporate the changes into the port. You need " "to be able to generate a patch between the original port and your updated " "port." msgstr "" "Когда они станут доступны, включите изменения в порт. Вам нужно уметь " "создавать патч между оригинальным портом и вашим обновлённым портом." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:410 msgid "Review and test" msgstr "Проверяйте и тестируйте" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:412 msgid "Thoroughly review and test your changes:" msgstr "Тщательно проверьте и протестируйте свои изменения:" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:415 msgid "" "Build, install and test your port on as many platforms and architectures as " "you can. It is common for a port to work on one branch or platform and fail " "on another." msgstr "" "Соберите, установите и протестируйте ваш порт на максимально возможном " "количестве платформ и архитектур. Часто бывает, что порт работает в одной " "ветке или на одной платформе, но не работает в другой." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:418 msgid "" "Make sure your port's dependencies are complete. The recommended way of " "doing this is by installing your own ports tinderbox. See crossref:" "contributing[resources, Resources for ports maintainers and contributors] " "for more information." msgstr "" "Убедитесь, что зависимости вашего порта полные. Рекомендуемый способ сделать " "это — установить собственный tinderbox для портов. Дополнительную информацию " "см. в crossref:contributing[resources, Ресурсы для сопровождающих и " "участников разработки портов]." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:420 msgid "" "Check that the packing list is up to date. This involves adding in any new " "files and directories and removing unused entries." msgstr "" "Проверьте, что список упаковки актуален. Это включает добавление новых " "файлов и каталогов и удаление неиспользуемых записей." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:422 msgid "" "Verify your port using man:portlint[1] as a guide. See crossref:" "contributing[resources, Resources for ports maintainers and contributors] " "for important information about using portlint." msgstr "" "Проверьте ваш порт, используя man:portlint[1] в качестве помощника. См. " "crossref:contributing[resources, Ресурсы для сопровождающих и участников " "портов] для важной информации об использовании portlint." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:425 msgid "" "Consider whether changes to your port might cause any other ports to break. " "If this is the case, coordinate the changes with the maintainers of those " "ports. This is especially important if your update changes the shared " "library version; in this case, at the very least, the dependent ports will " "need to get a `PORTREVISION` bump so that they will automatically be " "upgraded by automated tools such as package:ports-mgmt/poudriere[]." msgstr "" "Подумайте, могут ли изменения в вашем порту привести к проблемам в других " "портах. Если это так, согласуйте изменения с их сопровождающими. Это " "особенно важно, если ваше обновление изменяет версию разделяемой библиотеки; " "в этом случае, как минимум, зависимые порты должны получить увеличение " -"`PORTREVISION`, чтобы автоматизированные инструменты, такие как package" -":ports-mgmt/poudriere[], могли их обновить." +"`PORTREVISION`, чтобы автоматизированные инструменты, такие как package:" +"ports-mgmt/poudriere[], могли их обновить." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:427 #: documentation/content/en/articles/contributing/_index.adoc:496 msgid "Submit changes" msgstr "Представляйте изменения" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:430 msgid "" "Send your update by submitting a PR with an explanation of the changes and a " "patch containing the differences between the original port and the updated " "one. Please refer to extref:{problem-reports}[Writing FreeBSD Problem " "Reports] for information on how to write a really good PR." msgstr "" "Отправьте ваше обновление, создав PR с описанием изменений и патчем, " "содержащим различия между исходным портом и обновлённым. Обратитесь к статье " "extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD] для " "получения информации о том, как правильно оформить PR." #. type: delimited block = 6 #: documentation/content/en/articles/contributing/_index.adoc:436 msgid "" "Please do not submit a man:shar[1] archive of the entire port; instead, use " "man:git-format-patch[1] or man:diff[1] `-ruN`. In this way, committers can " "much more easily see exactly what changes are being made. The Porter's " -"Handbook section on extref:{porters-handbook}[Upgrading, port-upgrading] has " -"more information." +"Handbook section on extref:{porters-handbook}upgrading[Upgrading, port-" +"upgrading] has more information." msgstr "" "Пожалуйста, не отправляйте архив man:shar[1] всего порта; вместо этого " "используйте man:git-format-patch[1] или man:diff[1] `-ruN`. Таким образом, " "коммиттеры смогут гораздо проще увидеть, какие именно изменения были " -"внесены. Раздел extref:{porters-handbook}[Обновление, port-upgrading] в " -"Руководстве FreeBSD по созданию портов содержит дополнительную информацию." +"внесены. Раздел extref:{porters-handbook}upgrading[Обновление, port-" +"upgrading] в Руководстве FreeBSD по созданию портов содержит дополнительную " +"информацию." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:438 msgid "Wait" msgstr "Ждите" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:442 msgid "" "At some stage a committer will deal with your PR. It may take minutes, or " "it may take one or two weeks - so please be patient. If it takes any " "longer, please seek for help on mailing lists ({freebsd-ports}), IRC: " "#bsdports on EFNet or #freebsd-ports on Libera for example." msgstr "" "На каком-то этапе коммиттер рассмотрит ваш PR. Это может занять минуты, а " "может и одну-две недели — так что проявите терпение. Если это займет больше " -"времени, обратитесь за помощью в почтовые рассылки ({freebsd-ports}), IRC: #" -"bsdports на EFNet или #freebsd-ports на Libera, например." +"времени, обратитесь за помощью в почтовые рассылки ({freebsd-ports}), IRC: " +"#bsdports на EFNet или #freebsd-ports на Libera, например." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:443 msgid "Give feedback" msgstr "Предоставляйте обратную связь" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:446 msgid "" "If a committer finds a problem with your changes, they will most likely " "refer it back to you. A prompt response will help get your PR committed " "faster, and is better for maintaining a thread of conversation when trying " "to resolve any problems." msgstr "" "Если участник проекта обнаружит проблему в ваших изменениях, он, скорее " "всего, вернёт их вам на доработку. Быстрый ответ поможет ускорить принятие " "вашего PR, а также упростит поддержание последовательности обсуждения при " "попытке разрешить возникшие проблемы." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:447 msgid "And Finally" msgstr "И наконец" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:451 msgid "" "Your changes will be committed and your port will have been updated. The PR " "will then be closed by the committer. That is it!" msgstr "" "Ваши изменения будут зафиксированы, и ваш порт будет обновлен. Затем PR " "будет закрыт коммиттером. Вот и все!" #. type: Title ===== #: documentation/content/en/articles/contributing/_index.adoc:453 #, no-wrap msgid "Ensure your ports continue to build correctly" msgstr "Убедитесь, что ваши порты продолжают собираться корректно" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:456 msgid "" "This section is about discovering and fixing problems that stop your ports " "from building correctly." msgstr "" "Этот раздел посвящён обнаружению и исправлению проблем, которые мешают " "правильной сборке портов." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:459 msgid "" "FreeBSD only guarantees that the Ports Collection works on the `-STABLE` " "branches. In theory, you should be able to get by with running the latest " "release of each stable branch (since the ABIs are not supposed to change) " "but if you can run the branch, that is even better." msgstr "" -"FreeBSD гарантирует работоспособность Коллекции портов только в ветках " -"`-STABLE`. Теоретически можно обойтись использованием последних выпусков " +"FreeBSD гарантирует работоспособность Коллекции портов только в ветках `-" +"STABLE`. Теоретически можно обойтись использованием последних выпусков " "каждой стабильной ветки (поскольку ABI не должны меняться), но если есть " "возможность использовать саму ветку, это ещё лучше." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:463 msgid "" "Since the majority of FreeBSD installations run on PC-compatible machines " "(what is termed the `i386` architecture), we expect you to keep the port " "working on that architecture. We prefer that ports also work on the `amd64` " "architecture running native. It is completely fair to ask for help if you " "do not have one of these machines." msgstr "" -"Поскольку большинство установок FreeBSD работают на PC-совместимых машинах (" -"так называемая архитектура `i386`), мы ожидаем, что порт будет работать на " +"Поскольку большинство установок FreeBSD работают на PC-совместимых машинах " +"(так называемая архитектура `i386`), мы ожидаем, что порт будет работать на " "этой архитектуре. Мы предпочитаем, чтобы порты также работали на архитектуре " "`amd64` в нативном режиме. Совершенно допустимо попросить о помощи, если у " "вас нет одной из таких машин." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:468 msgid "" "The usual failure modes for non-`x86` machines are that the original " "programmers assumed that, for instance, pointers are `int`-s, or that a " "relatively lax older gcc compiler was being used. More and more, " "application authors are reworking their code to remove these assumptions - " "but if the author is not actively maintaining their code, you may need to do " "this yourself." msgstr "" "Обычные режимы сбоя для машин не на архитектуре `x86` связаны с " "предположениями оригинальных программистов, например, что указатели являются " "`int`-ами, или что используется относительно старый и менее строгий " "компилятор gcc. Все чаще авторы приложений перерабатывают свой код, чтобы " "устранить эти предположения — но если автор не занимается активной " "поддержкой своего кода, вам, возможно, придется сделать это самостоятельно." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:471 msgid "" "These are the tasks you need to perform to ensure your port is able to be " "built:" msgstr "" "Вот задачи, которые необходимо выполнить, чтобы убедиться, что ваш порт " "может быть собран:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:475 msgid "Watch for build failures" msgstr "Следите за ошибками сборки" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:477 msgid "" "Check your mail for mail from `pkg-fallout@FreeBSD.org` and the http://" "portscout.FreeBSD.org[distfiles scanner] to see if any of the port which are " "failing to build are out of date." msgstr "" -"Проверьте свою почту на наличие писем от `pkg-fallout@FreeBSD.org` и " -"http://portscout.FreeBSD.org[сканера distfiles], чтобы узнать, не устарели " -"ли какие-либо порты, которые не собираются." +"Проверьте свою почту на наличие писем от `pkg-fallout@FreeBSD.org` и http://" +"portscout.FreeBSD.org[сканера distfiles], чтобы узнать, не устарели ли какие-" +"либо порты, которые не собираются." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:478 #: documentation/content/en/articles/contributing/_index.adoc:527 msgid "Collect information" msgstr "Собрать информацию" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:482 msgid "" "Once you are aware of a problem, collect information to help you fix it. " "Build errors reported by `pkg-fallout` are accompanied by logs which will " "show you where the build failed. If the failure was reported to you by a " "user, ask them to send you information which may help in diagnosing the " "problem, such as:" msgstr "" "Как только вы обнаружили проблему, соберите информацию, которая поможет её " "исправить. Ошибки сборки, о которых сообщает `pkg-fallout`, сопровождаются " "журналами, показывающими, где произошёл сбой. Если о проблеме сообщил " "пользователь, попросите его предоставить данные, которые могут помочь в " "диагностике, например:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:484 msgid "Build logs" msgstr "Логи сборки" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:485 msgid "" "The commands and options used to build the port (including options set in [." "filename]#/etc/make.conf#)" msgstr "" "Команды и параметры, используемые для сборки порта (включая параметры, " "установленные в [.filename]#/etc/make.conf#)" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:486 msgid "" "A list of packages installed on their system as shown by man:pkg-info[8]" -msgstr "Список пакетов, установленных в системе, как показано в man:pkg-info[8]" +msgstr "" +"Список пакетов, установленных в системе, как показано в man:pkg-info[8]" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:487 msgid "The version of FreeBSD they are running as shown by man:uname[1] `-a`" msgstr "" "Версия FreeBSD, которую они используют, как показано в man:uname[1] `-a`" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:488 msgid "When their ports collection was last updated" msgstr "Когда их коллекция портов была последний раз обновлена" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:489 msgid "When their ports tree and [.filename]#INDEX# was last updated" msgstr "" "Когда их дерево портов и файл [.filename]#INDEX# были последний раз обновлены" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:491 msgid "Investigate and find a solution" msgstr "Изучить и найти решение" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:495 msgid "" "Unfortunately there is no straightforward process to follow to do this. " "Remember, though: if you are stuck, ask for help! The {freebsd-ports} is a " "good place to start, and the upstream developers are often very helpful." msgstr "" "К сожалению, не существует прямого процесса, которому можно следовать для " "этого. Однако помните: если вы застряли, попросите помощи! Коллекция портов " "{freebsd-ports} — хорошее место для начала, и разработчики вышестоящих " "проектов часто очень отзывчивы." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:498 msgid "" "Just as with updating a port, you should now incorporate changes, review and " "test, submit your changes in a PR, and provide feedback if required." msgstr "" "Как и при обновлении порта, теперь вам следует внести изменения, проверить и " "протестировать их, отправить изменения в PR и, если требуется, предоставить " "обратную связь." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:499 msgid "Send patches to upstream authors" msgstr "Отправляйте исправления авторам вышестоящих проектов" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:504 msgid "" "In some cases, you will have to make patches to the port to make it run on " "FreeBSD. Some (but not all) upstream authors will accept such patches back " "into their code for the next release. If so, this may even help their users " "on other BSD-based systems as well and perhaps save duplicated effort. " "Please consider sending any applicable patches to the authors as a courtesy." msgstr "" "В некоторых случаях потребуется внести изменения в порт, чтобы он заработал " "на FreeBSD. Некоторые (но не все) разработчики исходного проекта примут " "такие изменения в свой код для следующего выпуска. Если это произойдет, это " "может помочь их пользователям и на других BSD-системах, а также, возможно, " "сэкономит дублирующие усилия. В качестве жеста вежливости, пожалуйста, " "рассмотрите возможность отправки соответствующих исправлений авторам." #. type: Title ===== #: documentation/content/en/articles/contributing/_index.adoc:506 #, no-wrap msgid "Investigate bug reports and PRs related to your port" msgstr "Изучать отчеты об ошибках и PR, связанные с вашим портом" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:509 msgid "This section is about discovering and fixing bugs." msgstr "Этот раздел посвящён поиску и исправлению ошибок." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:512 msgid "" "FreeBSD-specific bugs are generally caused by assumptions about the build " "and runtime environments that do not apply to FreeBSD. You are less likely " "to encounter a problem of this type, but it can be more subtle and difficult " "to diagnose." msgstr "" "Ошибки, специфичные для FreeBSD, обычно вызваны предположениями о среде " "сборки и выполнения, которые не применимы к FreeBSD. Вероятность столкнуться " "с такой проблемой меньше, но она может быть более тонкой и сложной для " "диагностики." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:514 msgid "" "These are the tasks you need to perform to ensure your port continues to " "work as intended:" msgstr "" "Вот задачи, которые необходимо выполнить, чтобы ваш порт продолжал работать " "должным образом:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:518 msgid "Respond to bug reports" msgstr "Отвечать на отчёты об ошибках" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:521 msgid "" "Bugs may be reported to you through email via the https://bugs.FreeBSD.org/" "search/[Problem Report database]. Bugs may also be reported directly to you " "by users." msgstr "" "Ошибки могут быть сообщены вам по электронной почте через https://bugs." "FreeBSD.org/search/[базу данных отчетов о проблемах]. Также пользователи " "могут сообщать об ошибках напрямую вам." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:524 msgid "" "You should respond to PRs and other reports within 14 days, but please try " "not to take that long. Try to respond as soon as possible, even if it is " "just to say you need some more time before you can work on the PR." msgstr "" "Вы должны отвечать на PR и другие сообщения в течение 14 дней, но " "постарайтесь не затягивать так долго. Старайтесь отвечать как можно скорее, " "даже если это просто сообщение о том, что вам нужно ещё немного времени, " "прежде чем вы сможете заняться PR." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:526 msgid "" "If you have not responded after 14 days, any committer may commit from a PR " "that you have not responded to via a `maintainer-timeout`." msgstr "" "Если вы не ответили в течение 14 дней, любой коммиттер может выполнить " "коммит из PR, на который вы не ответили, используя `maintainer-timeout`." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:529 msgid "" "If the person reporting the bug has not also provided a fix, you need to " "collect the information that will allow you to generate one." msgstr "" "Если человек, сообщивший об ошибке, также не предоставил исправление, вам " "необходимо собрать информацию, которая позволит вам создать исправление." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:532 msgid "" "If the bug is reproducible, you can collect most of the required information " "yourself. If not, ask the person who reported the bug to collect the " "information for you, such as:" msgstr "" "Если ошибка воспроизводима, вы можете собрать большую часть необходимой " "информации самостоятельно. Если нет, попросите человека, сообщившего об " "ошибке, собрать информацию для вас, например:" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:534 msgid "" "A detailed description of their actions, expected program behavior and " "actual behavior" msgstr "" "Подробное описание их действий, ожидаемого поведения программы и " "фактического поведения" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:535 msgid "Copies of input data used to trigger the bug" msgstr "Копии входных данных, использованных для выявления ошибки" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:536 msgid "" "Information about their build and execution environment - for example, a " "list of installed packages and the output of man:env[1]" msgstr "" "Информация о среде сборки и выполнения — например, список установленных " "пакетов и вывод команды man:env[1]" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:537 msgid "Core dumps" msgstr "Файлы дампов ядра" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:538 msgid "Stack traces" msgstr "Стеки вызовов функций" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:540 msgid "Eliminate incorrect reports" msgstr "Устраните некорректные отчеты" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:546 msgid "" "Some bug reports may be incorrect. For example, the user may have simply " "misused the program; or their installed packages may be out of date and " "require updating. Sometimes a reported bug is not specific to FreeBSD. In " "this case report the bug to the upstream developers. If the bug is within " "your capabilities to fix, you can also patch the port so that the fix is " "applied before the next upstream release." msgstr "" "Некоторые отчеты об ошибках могут быть некорректными. Например, пользователь " "мог просто неправильно использовать программу; или установленные пакеты " "могут быть устаревшими и требовать обновления. Иногда сообщаемая ошибка не " "специфична для FreeBSD. В этом случае следует сообщить об ошибке " "разработчикам вышестоящего проекта. Если ошибка находится в пределах ваших " "возможностей для исправления, вы также можете исправить порт, чтобы " "исправление было применено до следующего релиза вышестоящего проекта." #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:547 msgid "Find a solution" msgstr "Найдите решение" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:550 msgid "" "As with build errors, you will need to sort out a fix to the problem. " "Again, remember to ask if you are stuck!" msgstr "" "Как и с ошибками сборки, вам потребуется найти решение проблемы. И снова, не " "забывайте спросить, если застряли!" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:551 msgid "Submit or approve changes" msgstr "Представить или утвердить изменения" #. type: Plain text #: documentation/content/en/articles/contributing/_index.adoc:554 msgid "" "Just as with updating a port, you should now incorporate changes, review and " "test, and submit your changes in a PR (or send a follow-up if a PR already " "exists for the problem). If another user has submitted changes in the PR, " "you can also send a follow-up saying whether or not you approve the changes." msgstr "" "Как и при обновлении порта, теперь вам следует внести изменения, проверить и " "протестировать их, а затем отправить изменения в PR (или отправить " "дополнение, если PR для данной проблемы уже существует). Если другой " "пользователь отправил изменения в PR, вы также можете отправить дополнение, " "указав, одобряете ли вы эти изменения или нет." #. type: Title ===== #: documentation/content/en/articles/contributing/_index.adoc:556 #, no-wrap msgid "Providing support" msgstr "Предоставление поддержки" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:561 msgid "" "Part of being a maintainer is providing support - not for the software in " "general - but for the port and any FreeBSD-specific quirks and problems. " "Users may contact you with questions, suggestions, problems and patches. " "Most of the time their correspondence will be specific to FreeBSD." msgstr "" "Часть обязанностей сопровождающего заключается в предоставлении поддержки — " "не для программного обеспечения в целом, а для порта и любых особенностей и " "проблем, специфичных для FreeBSD. Пользователи могут обращаться к вам с " "вопросами, предложениями, проблемами и патчами. В большинстве случаев их " "обращение будет касаться именно FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:565 msgid "" "Occasionally you may have to invoke your skills in diplomacy, and kindly " "point users seeking general support to the appropriate resources. Less " "frequently you will encounter a person asking why the `RPMS` are not up to " "date or how can they get the software to run under Foo Linux. Take the " "opportunity to tell them that your port is up to date (if it is, of " "course!), and suggest that they try FreeBSD." msgstr "" "Время от времени вам может понадобиться проявить дипломатические навыки и " "вежливо направить пользователей, ищущих общую поддержку, к соответствующим " "ресурсам. Реже вы столкнётесь с людьми, спрашивающими, почему `RPMS` не " "обновлены или как запустить программное обеспечение под Foo Linux. " "Воспользуйтесь возможностью сообщить им, что ваш порт актуален (если это " "так, конечно!), и предложите попробовать FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:568 msgid "" "Sometimes users and developers will decide that you are a busy person whose " "time is valuable and do some of the work for you. For example, they might:" msgstr "" "Иногда пользователи и разработчики решают, что вы занятой человек, чьё время " "ценно, и выполняют часть работы за вас. Например, они могут:" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:570 msgid "submit a PR or send you patches to update your port," msgstr "отправить PR или прислать свои патчи для обновления вашего порта," #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:571 msgid "investigate and perhaps provide a fix to a PR, or" msgstr "исследовать и, возможно, предоставить исправление для PR, или" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:572 msgid "otherwise submit changes to your port." msgstr "иначе отправить изменения в ваш порт." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:578 msgid "" "In these cases your main obligation is to respond in a timely manner. " "Again, the timeout for non-responsive maintainers is 14 days. After this " "period changes may be committed unapproved. They have taken the trouble to " "do this for you; so please try to at least respond promptly. Then review, " "approve, modify or discuss their changes with them as soon as possible." msgstr "" "В этих случаях ваша основная обязанность — своевременно отвечать. " "Напоминаем, что срок ожидания ответа от сопровождающего составляет 14 дней. " "По истечении этого периода изменения могут быть зафиксированы без одобрения. " "Они потрудились сделать это за вас; пожалуйста, постарайтесь хотя бы " "оперативно ответить. Затем как можно скорее проверьте, одобрите, измените " "или обсудите их изменения с ними." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:580 msgid "" "If you can make them feel that their contribution is appreciated (and it " "should be) you will have a better chance persuading them to do more things " "for you in the future :-)." msgstr "" "Если вы сможете дать им почувствовать, что их вклад ценится (а так и должно " -"быть), у вас будет больше шансов убедить их сделать для вас больше в будущем " -":-)." +"быть), у вас будет больше шансов убедить их сделать для вас больше в " +"будущем :-)." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:582 #, no-wrap msgid "Finding and fixing a broken port" msgstr "Поиск и исправление сломанного порта" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:585 msgid "" "There are some really good places to find a port that needs some attention." msgstr "Есть несколько хороших мест, где можно найти порт, требующий внимания." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:588 msgid "" "You can use the https://bugs.freebsd.org/search[web interface] to the " "Problem Report database to search through and view unresolved PRs. The " "majority of ports PRs are updates, but with a little searching and skimming " "over synopses you should be able to find something interesting to work on." msgstr "" "Вы можете использовать https://bugs.freebsd.org/search[веб-интерфейс] базы " "данных отчетов о проблемах для поиска и просмотра нерешенных PR. Большинство " "PR для портов — это обновления, но с небольшим поиском и беглым просмотром " "описаний вы сможете найти что-то интересное для работы." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:590 msgid "" "https://portsfallout.com/[PortsFallout] shows port issues gathered from the " "FreeBSD package building." msgstr "" "https://portsfallout.com/[PortsFallout] отображает проблемы с портами, " "собранные при сборке пакетов FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:592 msgid "" "It is OK to send changes for a maintained port as well, but remember to ask " "the maintainer in case they are already working on the problem." msgstr "" "Допустимо отправлять изменения и для поддерживаемого порта, но не забудьте " "уточнить у сопровождающего, не работает ли он уже над этой проблемой." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:597 msgid "" "Once you have found a bug or problem, collect information, investigate and " "fix! If there is an existing PR, follow up to that. Otherwise create a new " "PR. Your changes will be reviewed and, if everything checks out, committed." msgstr "" "Как только вы обнаружили ошибку или проблему, соберите информацию, изучите " "её и исправьте! Если уже существует PR, продолжите работу с ним. В противном " "случае создайте новый PR. Ваши изменения будут проверены и, если всё в " "порядке, приняты." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:599 #, no-wrap msgid "When to call it quits" msgstr "Как прекратить сопровождение" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:606 msgid "" "As your interests and commitments change, you may find that you no longer " "have time to continue some (or all) of your ports contributions. That is " "fine! Please let us know if you are no longer using a port or have otherwise " "lost time or interest in being a maintainer. In this way we can go ahead " "and allow other people to try to work on existing problems with the port " "without waiting for your response. Remember, FreeBSD is a volunteer " "project, so if maintaining a port is no fun any more, it is probably time to " "let someone else do it!" msgstr "" "По мере изменения ваших интересов и обязательств вы можете обнаружить, что у " "вас больше нет времени продолжать некоторые (или все) ваши вклады в порты. " "Это нормально! Пожалуйста, сообщите нам, если вы больше не используете порт " "или у вас нет времени или интереса продолжать быть его сопровождающим. Таким " "образом, мы сможем позволить другим людям попытаться решить существующие " "проблемы с портом, не дожидаясь вашего ответа. Помните, FreeBSD — это " "добровольный проект, поэтому если сопровождение порта больше не приносит " "удовольствия, вероятно, пришло время позволить кому-то другому заняться этим!" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:610 msgid "" "In any case, the Ports Management Team (`portmgr`) reserves the right to " "reset your maintainership if you have not actively maintained your port in " "some time. (Currently, this is set to 3 months.) By this, we mean that " "there are unresolved problems or pending updates that have not been worked " "on during that time." msgstr "" "В любом случае, команда управления портами (`portmgr`) оставляет за собой " "право сбросить ваше право сопровождения, если вы не поддерживали свой порт в " "течение некоторого времени. (В настоящее время этот срок установлен в 3 " "месяца.) Под этим подразумевается, что есть нерешенные проблемы или " "ожидающие обновления, над которыми не велась работа в течение этого времени." #. type: Title === #: documentation/content/en/articles/contributing/_index.adoc:612 #, no-wrap msgid "Resources for ports maintainers and contributors" msgstr "Ресурсы для сопровождающих и участников портов" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:616 msgid "" "The extref:{porters-handbook}[Porter's Handbook] is your hitchhiker's guide " "to the ports system. Keep it handy!" msgstr "" "extref:{porters-handbook}[Руководство FreeBSD по созданию портов] — это ваш " "путеводитель по системе портов. Держите его под рукой!" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:620 msgid "" "extref:{problem-reports}[Writing FreeBSD Problem Reports] describes how to " "best formulate and submit a PR. In 2005 more than eleven thousand ports PRs " "were submitted! Following this article will greatly assist us in reducing " "the time needed to handle your PRs." msgstr "" "Статья extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD] " "описывает, как лучше всего сформулировать и отправить PR. В 2005 году было " "подано более одиннадцати тысяч PR для портов! Следование этой статье " "значительно поможет нам сократить время, необходимое для обработки ваших PR." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:622 msgid "" "The https://bugs.freebsd.org/bugzilla/query.cgi[Problem Report database]." msgstr "" "https://bugs.freebsd.org/bugzilla/query.cgi[База данных отчетов о проблемах]." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:625 msgid "" "The http://portscout.FreeBSD.org[FreeBSD Ports distfile scanner (portscout)] " "can show you ports for which the distfiles are not fetchable. You can check " "on your own ports or use it to find ports that need their `MASTER_SITES` " "updated." msgstr "" "Сканер дистрибутивных файлов портов FreeBSD (portscout) http://portscout." "FreeBSD.org[FreeBSD Ports distfile scanner (portscout)] может показать вам " "порты, для которых дистрибутивные файлы недоступны для загрузки. Вы можете " "проверить свои собственные порты или использовать его для поиска портов, " "которым требуется обновление `MASTER_SITES`." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:628 msgid "" "package:ports-mgmt/poudriere[] is the most thorough way to test a port " "through the entire cycle of installation, packaging, and deinstallation. " "Documentation is located at the https://github.com/freebsd/" "poudriere[poudriere GitHub repository]" msgstr "" "package:ports-mgmt/poudriere[] — это наиболее тщательный способ проверить " "порт на протяжении всего цикла установки, упаковки и удаления. Документация " "находится в https://github.com/freebsd/poudriere[репозитории poudriere на " "GitHub]" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:632 msgid "" "man:portlint[1] is an application which can be used to verify that your port " "conforms to many important stylistic and functional guidelines. portlint is " "a simple heuristic application, so you should use it __only as a guide__. " "If portlint suggests changes which seem unreasonable, consult the extref:" "{porters-handbook}[Porter's Handbook] or ask for advice." msgstr "" "man:portlint[1] — это приложение, которое можно использовать для проверки " "соответствия вашего порта многим важным стилистическим и функциональным " "рекомендациям. portlint — это простое эвристическое приложение, поэтому его " "следует использовать __только в качестве ориентира__. Если portlint " -"предлагает изменения, которые кажутся необоснованными, обратитесь к extref" -":{porters-handbook}[Руководству портировщика] или попросите совета." +"предлагает изменения, которые кажутся необоснованными, обратитесь к extref:" +"{porters-handbook}[Руководству портировщика] или попросите совета." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:637 msgid "" "The {freebsd-ports} is for general ports-related discussion. It is a good " "place to ask for help. You can link:https://lists.freebsd.org/[subscribe, " "or read and search the list archives]. Reading the archives of the {freebsd-" "ports-bugs} and the {svn-ports-head} may also be of interest." msgstr "" "{freebsd-ports} предназначен для общих обсуждений, связанных с портами. Это " -"хорошее место для поиска помощи. Вы можете link:https://lists.freebsd.org/[" -"subscribe, читать и искать в архивах списка]. Также может быть полезно " +"хорошее место для поиска помощи. Вы можете link:https://lists.freebsd.org/" +"[subscribe, читать и искать в архивах списка]. Также может быть полезно " "ознакомиться с архивами {freebsd-ports-bugs} и {svn-ports-head}." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:639 msgid "" "https://portsfallout.com/[PortsFallout] is a place to help in searching for " "the https://lists.freebsd.org/archives/freebsd-pkg-fallout/[FreeBSD package-" "fallout archive]." msgstr "" "https://portsfallout.com/[PortsFallout] — это место для помощи в поиске по " "https://lists.freebsd.org/archives/freebsd-pkg-fallout/[архиву FreeBSD " "package-fallout]." #. type: Title == #: documentation/content/en/articles/contributing/_index.adoc:641 #, no-wrap msgid "Getting Started in Other Areas" msgstr "Начало работы в других областях" #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:645 msgid "" "Looking for something interesting to get started that is not mentioned " "elsewhere in this article? The FreeBSD Project has several Wiki pages " "containing areas within which new contributors can get ideas on how to get " "started." msgstr "" "Ищете что-то интересное для начала работы, что не упоминается в этой статье? " "Проект FreeBSD имеет несколько страниц на Wiki, содержащих области, в " "которых новые участники могут найти идеи о том, как начать." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:647 msgid "" "The https://wiki.freebsd.org/JuniorJobs[Junior Jobs] page has a list of " "projects that might be of interest to people just getting started in " "FreeBSD, and want to work on interesting things to get their feet wet." msgstr "" "https://wiki.freebsd.org/JuniorJobs[Страница Junior Jobs] содержит список " "проектов, которые могут быть интересны тем, кто только начинает работать с " "FreeBSD и хочет попробовать свои силы в интересных задачах." #. type: delimited block = 4 #: documentation/content/en/articles/contributing/_index.adoc:648 msgid "" "The https://wiki.freebsd.org/IdeasPage[Ideas Page] contains various \"nice " "to have\" or \"interesting\" things to work on in the Project." msgstr "" "https://wiki.freebsd.org/IdeasPage[Страница идей] содержит различные " "«приятные» или «интересные» вещи для работы в Проекте." diff --git a/documentation/content/ru/articles/filtering-bridges/_index.adoc b/documentation/content/ru/articles/filtering-bridges/_index.adoc index 384b3570aa..796b1e66ef 100644 --- a/documentation/content/ru/articles/filtering-bridges/_index.adoc +++ b/documentation/content/ru/articles/filtering-bridges/_index.adoc @@ -1,235 +1,235 @@ --- authors: - author: 'Alex Dupre' email: ale@FreeBSD.org description: 'Настройка межсетевых экранов и фильтрации на хостах FreeBSD, выступающих в роли мостов, а не маршрутизаторов' tags: ["network", "filtering", "bridges", "FreeBSD"] title: 'Фильтрующие мосты' trademarks: ["freebsd", "3com", "intel", "general"] --- = Фильтрующие мосты :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/filtering-bridges/ 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] Аннотация Часто бывает полезно разделить одну физическую сеть (например, Ethernet) на два отдельных сегмента без необходимости создания подсетей и использовать маршрутизатор для их соединения. Устройство, которое соединяет две сети таким образом, называется мостом. Система FreeBSD с двумя сетевыми интерфейсами достаточна для работы в качестве моста. Мост работает, сканируя адреса на MAC-уровне (Ethernet-адреса) устройств, подключённых к каждому из его сетевых интерфейсов, и затем пересылая трафик между двумя сетями только в том случае, если источник и получатель находятся в разных сегментах. Во многих аспектах мост аналогичен Ethernet-коммутатору с двумя портами. ''' toc::[] [[filtering-bridges-why]] == Зачем использовать фильтрующий мост? Всё чаще, благодаря снижению стоимости широкополосных подключений к Интернету (xDSL), а также из-за сокращения доступных IPv4-адресов, многие компании подключены к Интернету 24 часа в сутки и имеют мало (иногда даже не степень двойки) IP-адресов. В таких ситуациях часто возникает желание иметь межсетевой экран, который фильтрует входящий и исходящий трафик из Интернета и в него, но решение для фильтрации пакетов на основе маршрутизатора может быть неприменимо — из-за проблем с подсетями, потому что маршрутизатор принадлежит поставщику услуг (ISP) или потому что он не поддерживает такие функции. В таких сценариях настоятельно рекомендуется использовать фильтрующий мост. Межсетевой экран на основе моста может быть настроен и установлен между xDSL-маршрутизатором и вашим Ethernet-концентратором/коммутатором без каких-либо проблем с IP-адресацией. [[filtering-bridges-how]] == Как установить Добавление функциональности моста в систему FreeBSD не является сложной задачей. Начиная с версии 4.5, появилась возможность загружать такие функции как модули, вместо необходимости пересборки ядра, что значительно упрощает процедуру. В следующих подразделах я объясню оба способа установки. [IMPORTANT] ==== _Не_ следуйте обеим инструкциям: одна процедура _исключает_ другую. Выберите наиболее подходящий вариант в соответствии с вашими потребностями и возможностями. ==== Прежде чем продолжить, убедитесь, что у вас есть как минимум две Ethernet-карты, поддерживающие режим promiscuous как для приёма, так и для передачи, поскольку они должны уметь отправлять Ethernet-пакеты с любым адресом, а не только с собственным. Кроме того, для обеспечения хорошей пропускной способности карты должны поддерживать управление шиной PCI. Наилучшим выбором по-прежнему остаются Intel EtherExpress(TM) Pro, за которыми следуют карты серии 3Com(R) 3c9xx. Для упрощения настройки межсетевого экрана может быть полезно иметь две карты от разных производителей (использующие разные драйверы), чтобы чётко различать, какой интерфейс подключён к маршрутизатору, а какой — к внутренней сети. [[filtering-bridges-kernel]] === Настройка ядра Итак, вы решили использовать старый, но хорошо проверенный метод установки. Для начала вам нужно добавить следующие строки в файл конфигурации ядра: [.programlisting] .... options BRIDGE options IPFIREWALL options IPFIREWALL_VERBOSE .... Первая строка компилирует поддержку моста, вторая — межсетевой экран, а третья — функции журналирования межсетевого экрана. -Теперь необходимо собрать и установить новое ядро. Подробные инструкции можно найти в разделе extref:{handbook}[Сборка и установка пользовательского ядра, kernelconfig-building] руководства FreeBSD. +Теперь необходимо собрать и установить новое ядро. Подробные инструкции можно найти в разделе extref:{handbook}kernelconfig[Сборка и установка пользовательского ядра, kernelconfig-building] руководства FreeBSD. [[filtering-bridges-modules]] === Загрузка модулей Если вы выбрали использование нового и более простого метода установки, единственное, что нужно сделать сейчас, это добавить следующую строку в [.filename]#/boot/loader.conf#: [.programlisting] .... bridge_load="YES" .... Таким образом, во время загрузки системы модуль [.filename]#bridge.ko# будет загружен вместе с ядром. Не требуется добавлять аналогичную строку для модуля [.filename]#ipfw.ko#, так как он будет загружен автоматически после выполнения шагов из следующего раздела. [[filtering-bridges-finalprep]] == Окончательная подготовка Прежде чем перезагрузиться для загрузки нового ядра или необходимых модулей (в соответствии с выбранным ранее методом установки), необходимо внести некоторые изменения в конфигурационный файл [.filename]#/etc/rc.conf#. Правило по умолчанию для межсетевого экрана — отклонять все IP-пакеты. Изначально мы настроим `открытый` межсетевой экран, чтобы проверить его работу без каких-либо проблем, связанных с фильтрацией пакетов (если вы выполняете эту процедуру удалённо, такая конфигурация позволит избежать изоляции от сети). Добавьте следующие строки в [.filename]#/etc/rc.conf#: [.programlisting] .... firewall_enable="YES" firewall_type="open" firewall_quiet="YES" firewall_logging="YES" .... Первая строка включит межсетевой экран (и загрузит модуль [.filename]#ipfw.ko#, если он не встроен в ядро), вторая настроит его в режиме `open` (как описано в [.filename]#/etc/rc.firewall#), третья отключит отображение загрузки правил, а четвёртая включит поддержку журналирования. О конфигурации сетевых интерфейсов: наиболее распространённый способ — назначить IP только одной из сетевых карт, но мост будет работать одинаково, даже если оба интерфейса или ни один из них не имеют настроенного IP. В последнем случае (без IP) машина с мостом останется более скрытой, так как будет недоступна из сети: для её настройки потребуется войти с консоли или через третий сетевой интерфейс, отделённый от моста. Иногда во время запуска системы некоторым программам требуется доступ к сети, например, для разрешения доменных имён: в этом случае необходимо назначить IP внешнему интерфейсу (тому, который подключён к интернету, где находится DNS-сервер), так как мост будет активирован в конце процедуры запуска. Это означает, что интерфейс [.filename]#fxp0# (в нашем случае) должен быть указан в разделе ifconfig файла [.filename]#/etc/rc.conf#, тогда как [.filename]#xl0# — нет. Назначение IP обеим сетевым картам не имеет особого смысла, за исключением случаев, когда во время запуска приложения должны получать доступ к сервисам на обоих сегментах Ethernet. Есть ещё один важный момент. При работе IP поверх Ethernet фактически используются два протокола Ethernet: один — это IP, другой — ARP. ARP выполняет преобразование IP-адреса хоста в его Ethernet-адрес (уровень MAC). Чтобы обеспечить связь между двумя хостами, разделёнными мостом, необходимо, чтобы мост передавал ARP-пакеты. Этот протокол не включён в уровень IP, так как он существует только при работе IP поверх Ethernet. Межсетевой экран FreeBSD фильтрует исключительно на уровне IP, поэтому все не-IP пакеты (включая ARP) будут передаваться без фильтрации, даже если межсетевой экран настроен на запрет всего. Вот теперь пришло время перезагрузить систему и использовать её как прежде: будут появляться некоторые новые сообщения о мосте и межсетевом экране, но мост не будет активирован, а межсетевой экран, находясь в режиме `open`, не будет препятствовать никаким операциям. Если возникли какие-либо проблемы, их следует решить сейчас, прежде чем продолжить. [[filtering-bridges-enabling]] == Включение моста На этом этапе, чтобы включить мост, необходимо выполнить следующие команды (с учётом замены имён двух сетевых интерфейсов [.filename]#fxp0# и [.filename]#xl0# на ваши собственные): [source, shell] .... # sysctl net.link.ether.bridge.config=fxp0:0,xl0:0 # sysctl net.link.ether.bridge.ipfw=1 # sysctl net.link.ether.bridge.enable=1 .... Первая строка указывает, какие интерфейсы должны быть активированы мостом, вторая включает межсетевой экран на мосту, а третья активирует сам мост. На этом этапе вы должны быть способны разместить машину между двумя группами хостов, не нарушая их способности к взаимодействию. Если это так, следующим шагом будет добавление строк `net.link.ether.bridge._[blah]_=_[blah]_` в файл [.filename]#/etc/sysctl.conf#, чтобы они выполнялись при запуске системы. [[filtering-bridges-ipfirewall]] == Настройка межсетевого экрана Время создать собственный файл с правилами межсетевого экрана для защиты внутренней сети. Это будет несколько сложно, так как не все функции межсетевого экрана доступны для мостовых пакетов. Кроме того, есть разница между пакетами, которые перенаправляются, и пакетами, которые принимаются локальной машиной. В целом, входящие пакеты проходят через межсетевой экран только один раз, а не два, как обычно; фактически они фильтруются только при получении, поэтому правила с `out` или `xmit` никогда не сработают. Лично я использую `in via` — это более старый синтаксис, но он интуитивно понятен при чтении. Ещё одно ограничение заключается в том, что для пакетов, фильтруемых мостом, можно использовать только команды `pass` или `drop`. Более сложные действия, такие как `divert`, `forward` или `reject`, недоступны. Такие опции всё ещё можно использовать, но только для трафика, направленного на саму машину моста или исходящего от неё (если у неё есть IP-адрес). В FreeBSD 4.0 появилась концепция фильтрации с сохранением состояния. Это значительное улучшение для UDP-трафика, который обычно представляет собой запрос, отправляемый наружу, за которым вскоре следует ответ с тем же набором IP-адресов и номеров портов (но, конечно, с поменянными местами источником и назначением). Для межсетевых экранов без сохранения состояния практически нет возможности обрабатывать такой трафик как единую сессию. Однако, если межсетевой экран может «запоминать» исходящий UDP-пакет и в течение нескольких минут разрешать ответ, обработка UDP-сервисов становится тривиальной. В следующем примере показано, как это сделать. То же самое можно проделать и с TCP-пакетами. Это позволяет избежать некоторых атак типа «отказ в обслуживании» и других неприятных трюков, но также обычно приводит к быстрому росту таблицы состояний. Рассмотрим пример настройки. Обратите внимание, что в начале файла [.filename]#/etc/rc.firewall# уже есть стандартные правила для loopback-интерфейса (интерфейса обратной петли) [.filename]#lo0#, поэтому нам не нужно о них заботиться. Пользовательские правила следует поместить в отдельный файл (например, [.filename]#/etc/rc.firewall.local#) и загружать его при старте системы, изменив строку в [.filename]#/etc/rc.conf#, где мы определили `open` для межсетевого экрана: [.programlisting] .... firewall_type="/etc/rc.firewall.local" .... [IMPORTANT] ==== Вы должны указать _полный_ путь, иначе он не будет загружен с риском остаться изолированным от сети. ==== Для нашего примера представим, что интерфейс [.filename]#fxp0# подключён к внешней сети (Интернет), а [.filename]#xl0# — к внутренней (ЛВС). У машины с мостом IP-адрес `1.2.3.4` (ваш провайдер вряд ли выдаст вам такой адрес, но для нашего примера он подходит). [.programlisting] .... # Things that we have kept state on before get to go through in a hurry add check-state # Throw away RFC 1918 networks add drop all from 10.0.0.0/8 to any in via fxp0 add drop all from 172.16.0.0/12 to any in via fxp0 add drop all from 192.168.0.0/16 to any in via fxp0 # Allow the bridge machine to say anything it wants # (if the machine is IP-less do not include these rows) add pass tcp from 1.2.3.4 to any setup keep-state add pass udp from 1.2.3.4 to any keep-state add pass ip from 1.2.3.4 to any # Allow the inside hosts to say anything they want add pass tcp from any to any in via xl0 setup keep-state add pass udp from any to any in via xl0 keep-state add pass ip from any to any in via xl0 # TCP section # Allow SSH add pass tcp from any to any 22 in via fxp0 setup keep-state # Allow SMTP only towards the mail server add pass tcp from any to relay 25 in via fxp0 setup keep-state # Allow zone transfers only by the secondary name server [dns2.nic.it] add pass tcp from 193.205.245.8 to ns 53 in via fxp0 setup keep-state # Pass ident probes. It is better than waiting for them to timeout add pass tcp from any to any 113 in via fxp0 setup keep-state # Pass the "quarantine" range add pass tcp from any to any 49152-65535 in via fxp0 setup keep-state # UDP section # Allow DNS only towards the name server add pass udp from any to ns 53 in via fxp0 keep-state # Pass the "quarantine" range add pass udp from any to any 49152-65535 in via fxp0 keep-state # ICMP section # Pass 'ping' add pass icmp from any to any icmptypes 8 keep-state # Pass error messages generated by 'traceroute' add pass icmp from any to any icmptypes 3 add pass icmp from any to any icmptypes 11 # Everything else is suspect add drop log all from any to any .... Те из вас, кто ранее настраивал межсетевые экраны, могут заметить некоторые отсутствующие элементы. В частности, здесь нет правил защиты от спуфинга, и фактически мы _не_ добавили: [.programlisting] .... add deny all from 1.2.3.4/8 to any in via fxp0 .... То есть, отбрасывать пакеты, которые поступают извне, утверждая, что они из нашей сети. Это стандартная мера для предотвращения попыток обхода межсетевого экрана путем генерации вредоносных пакетов, которые выглядят так, будто они из внутренней сети. Проблема в том, что есть _как минимум_ один хост на внешнем интерфейсе, который нельзя игнорировать: маршрутизатор. Однако обычно интернет-провайдер применяет антиспуфинг на своем маршрутизаторе, так что нам не нужно слишком беспокоиться об этом. Последнее правило кажется точной копией правила по умолчанию, то есть не пропускать ничего, что явно не разрешено. Однако есть разница: весь подозрительный трафик будет записываться в журнал. Существует два правила для пропуска SMTP и DNS-трафика к почтовому серверу и серверу имен, если они у вас есть. Очевидно, весь набор правил должен быть адаптирован под личные предпочтения — это лишь конкретный пример (формат правил подробно описан на man:ipfw[8]). Обратите внимание, что для работы "relay" и "ns" разрешение имен должно работать _до_ включения моста. Это пример того, как убедиться, что IP-адрес установлен на правильной сетевой карте. Альтернативно можно указать IP-адрес вместо имени хоста (это требуется, если у машины нет IP-адреса). Люди, привыкшие настраивать межсетевые экраны, вероятно, также привыкли использовать правило `reset` или `forward` для идентификационных пакетов (TCP-порт 113). К сожалению, это не применимо при использовании моста, поэтому лучше всего просто передавать их целевому устройству. Пока на этом устройстве не запущен идентификационный демон, это относительно безопасно. Альтернативой является сброс соединений на порту 113, что создает проблемы с такими сервисами, как IRC (запрос идентификации будет ожидать таймаута). Единственное, что может показаться немного странным — это наличие правила, разрешающего общение для мостовой машины, и другого правила для внутренних хостов. Помните, что это связано с тем, что два типа трафика проходят разные пути через ядро и попадают в пакетный фильтр. Трафик внутренней сети проходит через мост, в то время как локальная машина использует обычный IP-стек для общения. Поэтому и нужны два правила для обработки разных случаев. Правила `in via fxp0` работают для обоих путей. В общем случае, если вы используете правила `in via` во всём фильтре, вам потребуется сделать исключение для локально сгенерированных пакетов, так как они не поступают через какие-либо из наших интерфейсов. [[filtering-bridges-contributors]] == Участники Многие части этой статьи были взяты, обновлены и адаптированы из старого текста о мостах, отредактированного Ником Сайером. Пара вдохновений обязана введению в мосты от Стива Петерсона. Огромная благодарность Луиджи Риццо за реализацию кода моста в FreeBSD и за время, которое он уделил мне, отвечая на все мои вопросы по этой теме. Благодарность также выражается Тому Родсу, который проверил мою работу по переводу с итальянского (оригинального языка этой статьи) на английский. diff --git a/documentation/content/ru/articles/filtering-bridges/_index.po b/documentation/content/ru/articles/filtering-bridges/_index.po index 225877e2c2..5072172669 100644 --- a/documentation/content/ru/articles/filtering-bridges/_index.po +++ b/documentation/content/ru/articles/filtering-bridges/_index.po @@ -1,826 +1,825 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2024-01-17 20:35-0300\n" -"PO-Revision-Date: 2025-09-26 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-09 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/filtering-bridges/_index.adoc:1 #, no-wrap msgid "Configuring firewalls and filtering on FreeBSD hosts acting as bridges rather than routers" -msgstr "" -"Настройка межсетевых экранов и фильтрации на хостах FreeBSD, выступающих в " -"роли мостов, а не маршрутизаторов" +msgstr "Настройка межсетевых экранов и фильтрации на хостах FreeBSD, выступающих в роли мостов, а не маршрутизаторов" #. type: Title = #: documentation/content/en/articles/filtering-bridges/_index.adoc:1 #: documentation/content/en/articles/filtering-bridges/_index.adoc:11 #, no-wrap msgid "Filtering Bridges" msgstr "Фильтрующие мосты" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:48 msgid "" "Often it is useful to divide one physical network (like an Ethernet) into " "two separate segments without having to create subnets, and use a router to " "link them together. The device that connects the two networks in this way " "is called a bridge. A FreeBSD system with two network interfaces is enough " "to act as a bridge." msgstr "" "Часто бывает полезно разделить одну физическую сеть (например, Ethernet) на " "два отдельных сегмента без необходимости создания подсетей и использовать " "маршрутизатор для их соединения. Устройство, которое соединяет две сети " "таким образом, называется мостом. Система FreeBSD с двумя сетевыми " "интерфейсами достаточна для работы в качестве моста." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:51 msgid "" "A bridge works by scanning the addresses of MAC level (Ethernet addresses) " "of the devices connected to each of its network interfaces and then " "forwarding the traffic between the two networks only if the source and the " "destination are on different segments. Under many points of view a bridge " "is similar to an Ethernet switch with only two ports." msgstr "" "Мост работает, сканируя адреса на MAC-уровне (Ethernet-адреса) устройств, " "подключённых к каждому из его сетевых интерфейсов, и затем пересылая трафик " "между двумя сетями только в том случае, если источник и получатель находятся " "в разных сегментах. Во многих аспектах мост аналогичен Ethernet-коммутатору " "с двумя портами." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:53 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:57 #, no-wrap msgid "Why use a filtering bridge?" msgstr "Зачем использовать фильтрующий мост?" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:62 msgid "" "More and more frequently, thanks to the lowering costs of broad band " "Internet connections (xDSL) and also because of the reduction of available " "IPv4 addresses, many companies are connected to the Internet 24 hours on 24 " "and with few (sometimes not even a power of 2) IP addresses. In these " "situations it is often desirable to have a firewall that filters incoming " "and outgoing traffic from and towards Internet, but a packet filtering " "solution based on router may not be applicable, either due to subnetting " "issues, the router is owned by the connectivity supplier (ISP), or because " "it does not support such functionalities. In these scenarios the use of a " "filtering bridge is highly advised." msgstr "" "Всё чаще, благодаря снижению стоимости широкополосных подключений к " "Интернету (xDSL), а также из-за сокращения доступных IPv4-адресов, многие " "компании подключены к Интернету 24 часа в сутки и имеют мало (иногда даже не " "степень двойки) IP-адресов. В таких ситуациях часто возникает желание иметь " "межсетевой экран, который фильтрует входящий и исходящий трафик из Интернета " "и в него, но решение для фильтрации пакетов на основе маршрутизатора может " "быть неприменимо — из-за проблем с подсетями, потому что маршрутизатор " "принадлежит поставщику услуг (ISP) или потому что он не поддерживает такие " "функции. В таких сценариях настоятельно рекомендуется использовать " "фильтрующий мост." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:64 msgid "" "A bridge-based firewall can be configured and inserted between the xDSL " "router and your Ethernet hub/switch without any IP numbering issues." msgstr "" "Межсетевой экран на основе моста может быть настроен и установлен между xDSL-" "маршрутизатором и вашим Ethernet-концентратором/коммутатором без каких-либо " "проблем с IP-адресацией." #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:66 #, no-wrap msgid "How to Install" msgstr "Как установить" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:71 msgid "" "Adding bridge functionalities to a FreeBSD system is not difficult. Since " "4.5 release it is possible to load such functionalities as modules instead " "of having to rebuild the kernel, simplifying the procedure a great deal. In " "the following subsections I will explain both installation ways." msgstr "" "Добавление функциональности моста в систему FreeBSD не является сложной " "задачей. Начиная с версии 4.5, появилась возможность загружать такие функции " "как модули, вместо необходимости пересборки ядра, что значительно упрощает " "процедуру. В следующих подразделах я объясню оба способа установки." #. type: delimited block = 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:76 msgid "" "_Do not_ follow both instructions: a procedure _excludes_ the other one. " "Select the best choice according to your needs and abilities." msgstr "" "_Не_ следуйте обеим инструкциям: одна процедура _исключает_ другую. Выберите " "наиболее подходящий вариант в соответствии с вашими потребностями и " "возможностями." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:82 msgid "" "Before going on, be sure to have at least two Ethernet cards that support " "the promiscuous mode for both reception and transmission, since they must be " "able to send Ethernet packets with any address, not just their own. " "Moreover, to have a good throughput, the cards should be PCI bus mastering " "cards. The best choices are still the Intel EtherExpress(TM) Pro, followed " "by the 3Com(R) 3c9xx series. To simplify the firewall configuration it may " "be useful to have two cards of different manufacturers (using different " "drivers) to distinguish clearly which interface is connected to the router " "and which to the inner network." msgstr "" "Прежде чем продолжить, убедитесь, что у вас есть как минимум две Ethernet-" "карты, поддерживающие режим promiscuous как для приёма, так и для передачи, " "поскольку они должны уметь отправлять Ethernet-пакеты с любым адресом, а не " "только с собственным. Кроме того, для обеспечения хорошей пропускной " "способности карты должны поддерживать управление шиной PCI. Наилучшим " "выбором по-прежнему остаются Intel EtherExpress(TM) Pro, за которыми следуют " "карты серии 3Com(R) 3c9xx. Для упрощения настройки межсетевого экрана может " "быть полезно иметь две карты от разных производителей (использующие разные " "драйверы), чтобы чётко различать, какой интерфейс подключён к " "маршрутизатору, а какой — к внутренней сети." #. type: Title === #: documentation/content/en/articles/filtering-bridges/_index.adoc:84 #, no-wrap msgid "Kernel Configuration" msgstr "Настройка ядра" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:88 msgid "" "So you have decided to use the older but well tested installation method. " "To begin, you have to add the following rows to your kernel configuration " "file:" msgstr "" "Итак, вы решили использовать старый, но хорошо проверенный метод установки. " "Для начала вам нужно добавить следующие строки в файл конфигурации ядра:" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:94 #, no-wrap msgid "" "options BRIDGE\n" "options IPFIREWALL\n" "options IPFIREWALL_VERBOSE\n" msgstr "" "options BRIDGE\n" "options IPFIREWALL\n" "options IPFIREWALL_VERBOSE\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:97 msgid "" "The first line is to compile the bridge support, the second one is the " "firewall and the third one is the logging functions of the firewall." msgstr "" "Первая строка компилирует поддержку моста, вторая — межсетевой экран, а " "третья — функции журналирования межсетевого экрана." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:100 msgid "" "Now it is necessary to build and install the new kernel. You may find " -"detailed instructions in the extref:{handbook}[Building and Installing a " -"Custom Kernel, kernelconfig-building] section of the FreeBSD Handbook." +"detailed instructions in the extref:{handbook}kernelconfig[Building and " +"Installing a Custom Kernel, kernelconfig-building] section of the FreeBSD " +"Handbook." msgstr "" "Теперь необходимо собрать и установить новое ядро. Подробные инструкции " -"можно найти в разделе extref:{handbook}[Сборка и установка пользовательского " -"ядра, kernelconfig-building] руководства FreeBSD." +"можно найти в разделе extref:{handbook}kernelconfig[Сборка и установка " +"пользовательского ядра, kernelconfig-building] руководства FreeBSD." #. type: Title === #: documentation/content/en/articles/filtering-bridges/_index.adoc:102 #, no-wrap msgid "Modules Loading" msgstr "Загрузка модулей" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:105 msgid "" "If you have chosen to use the new and simpler installation method, the only " "thing to do now is add the following row to [.filename]#/boot/loader.conf#:" msgstr "" "Если вы выбрали использование нового и более простого метода установки, " "единственное, что нужно сделать сейчас, это добавить следующую строку в [." "filename]#/boot/loader.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:109 #, no-wrap msgid "bridge_load=\"YES\"\n" msgstr "bridge_load=\"YES\"\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:113 msgid "" "In this way, during the system startup, the [.filename]#bridge.ko# module " "will be loaded together with the kernel. It is not required to add a " "similar row for the [.filename]#ipfw.ko# module, since it will be loaded " "automatically after the execution of the steps in the following section." msgstr "" "Таким образом, во время загрузки системы модуль [.filename]#bridge.ko# будет " "загружен вместе с ядром. Не требуется добавлять аналогичную строку для " "модуля [.filename]#ipfw.ko#, так как он будет загружен автоматически после " "выполнения шагов из следующего раздела." #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:115 #, no-wrap msgid "Final Preparation" msgstr "Окончательная подготовка" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:121 msgid "" "Before rebooting to load the new kernel or the required modules (according " "to the previously chosen installation method), you have to make some changes " "to the [.filename]#/etc/rc.conf# configuration file. The default rule of " "the firewall is to reject all IP packets. Initially we will set up an " "`open` firewall, to verify its operation without any issue related to packet " "filtering (in case you are going to execute this procedure remotely, such " "configuration will avoid you to remain isolated from the network). Put " "these lines in [.filename]#/etc/rc.conf#:" msgstr "" -"Прежде чем перезагрузиться для загрузки нового ядра или необходимых модулей (" -"в соответствии с выбранным ранее методом установки), необходимо внести " +"Прежде чем перезагрузиться для загрузки нового ядра или необходимых модулей " +"(в соответствии с выбранным ранее методом установки), необходимо внести " "некоторые изменения в конфигурационный файл [.filename]#/etc/rc.conf#. " "Правило по умолчанию для межсетевого экрана — отклонять все IP-пакеты. " "Изначально мы настроим `открытый` межсетевой экран, чтобы проверить его " "работу без каких-либо проблем, связанных с фильтрацией пакетов (если вы " "выполняете эту процедуру удалённо, такая конфигурация позволит избежать " "изоляции от сети). Добавьте следующие строки в [.filename]#/etc/rc.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:128 #, no-wrap msgid "" "firewall_enable=\"YES\"\n" "firewall_type=\"open\"\n" "firewall_quiet=\"YES\"\n" "firewall_logging=\"YES\"\n" msgstr "" "firewall_enable=\"YES\"\n" "firewall_type=\"open\"\n" "firewall_quiet=\"YES\"\n" "firewall_logging=\"YES\"\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:131 msgid "" "The first row will enable the firewall (and will load the module [." "filename]#ipfw.ko# if it is not compiled in the kernel), the second one to " "set up it in `open` mode (as explained in [.filename]#/etc/rc.firewall#), " "the third one to not show rules loading and the fourth one to enable logging " "support." msgstr "" "Первая строка включит межсетевой экран (и загрузит модуль [.filename]#ipfw." "ko#, если он не встроен в ядро), вторая настроит его в режиме `open` (как " "описано в [.filename]#/etc/rc.firewall#), третья отключит отображение " "загрузки правил, а четвёртая включит поддержку журналирования." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:137 msgid "" "About the configuration of the network interfaces, the most used way is to " "assign an IP to only one of the network cards, but the bridge will work " "equally even if both interfaces or none has a configured IP. In the last " "case (IP-less) the bridge machine will be still more hidden, as inaccessible " "from the network: to configure it, you have to login from console or through " "a third network interface separated from the bridge. Sometimes, during the " "system startup, some programs require network access, say for domain " "resolution: in this case it is necessary to assign an IP to the external " "interface (the one connected to Internet, where DNS server resides), since " "the bridge will be activated at the end of the startup procedure. It means " "that the [.filename]#fxp0# interface (in our case) must be mentioned in the " "ifconfig section of the [.filename]#/etc/rc.conf# file, while the [." "filename]#xl0# is not. Assigning an IP to both the network cards does not " "make much sense, unless, during the start procedure, applications should " "access to services on both Ethernet segments." msgstr "" "О конфигурации сетевых интерфейсов: наиболее распространённый способ — " "назначить IP только одной из сетевых карт, но мост будет работать одинаково, " "даже если оба интерфейса или ни один из них не имеют настроенного IP. В " "последнем случае (без IP) машина с мостом останется более скрытой, так как " "будет недоступна из сети: для её настройки потребуется войти с консоли или " "через третий сетевой интерфейс, отделённый от моста. Иногда во время запуска " "системы некоторым программам требуется доступ к сети, например, для " "разрешения доменных имён: в этом случае необходимо назначить IP внешнему " "интерфейсу (тому, который подключён к интернету, где находится DNS-сервер), " "так как мост будет активирован в конце процедуры запуска. Это означает, что " "интерфейс [.filename]#fxp0# (в нашем случае) должен быть указан в разделе " "ifconfig файла [.filename]#/etc/rc.conf#, тогда как [.filename]#xl0# — нет. " "Назначение IP обеим сетевым картам не имеет особого смысла, за исключением " "случаев, когда во время запуска приложения должны получать доступ к сервисам " "на обоих сегментах Ethernet." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:144 msgid "" "There is another important thing to know. When running IP over Ethernet, " "there are actually two Ethernet protocols in use: one is IP, the other is " "ARP. ARP does the conversion of the IP address of a host into its Ethernet " "address (MAC layer). To allow the communication between two hosts separated " "by the bridge, it is necessary that the bridge will forward ARP packets. " "Such protocol is not included in the IP layer, since it exists only with IP " "over Ethernet. The FreeBSD firewall filters exclusively on the IP layer and " "therefore all non-IP packets (ARP included) will be forwarded without being " "filtered, even if the firewall is configured to not permit anything." msgstr "" "Есть ещё один важный момент. При работе IP поверх Ethernet фактически " "используются два протокола Ethernet: один — это IP, другой — ARP. ARP " "выполняет преобразование IP-адреса хоста в его Ethernet-адрес (уровень MAC). " "Чтобы обеспечить связь между двумя хостами, разделёнными мостом, необходимо, " "чтобы мост передавал ARP-пакеты. Этот протокол не включён в уровень IP, так " "как он существует только при работе IP поверх Ethernet. Межсетевой экран " -"FreeBSD фильтрует исключительно на уровне IP, поэтому все не-IP пакеты (" -"включая ARP) будут передаваться без фильтрации, даже если межсетевой экран " +"FreeBSD фильтрует исключительно на уровне IP, поэтому все не-IP пакеты " +"(включая ARP) будут передаваться без фильтрации, даже если межсетевой экран " "настроен на запрет всего." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:146 msgid "" "Now it is time to reboot the system and use it as before: there will be some " "new messages about the bridge and the firewall, but the bridge will not be " "activated and the firewall, being in `open` mode, will not avoid any " "operations." msgstr "" "Вот теперь пришло время перезагрузить систему и использовать её как прежде: " "будут появляться некоторые новые сообщения о мосте и межсетевом экране, но " "мост не будет активирован, а межсетевой экран, находясь в режиме `open`, не " "будет препятствовать никаким операциям." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:148 msgid "" "If there are any problems, you should sort them out now before proceeding." msgstr "" "Если возникли какие-либо проблемы, их следует решить сейчас, прежде чем " "продолжить." #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:150 #, no-wrap msgid "Enabling the Bridge" msgstr "Включение моста" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:153 msgid "" "At this point, to enable the bridge, you have to execute the following " "commands (having the shrewdness to replace the names of the two network " "interfaces [.filename]#fxp0# and [.filename]#xl0# with your own ones):" msgstr "" -"На этом этапе, чтобы включить мост, необходимо выполнить следующие команды (" -"с учётом замены имён двух сетевых интерфейсов [.filename]#fxp0# и [." +"На этом этапе, чтобы включить мост, необходимо выполнить следующие команды " +"(с учётом замены имён двух сетевых интерфейсов [.filename]#fxp0# и [." "filename]#xl0# на ваши собственные):" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:159 #, no-wrap msgid "" "# sysctl net.link.ether.bridge.config=fxp0:0,xl0:0\n" "# sysctl net.link.ether.bridge.ipfw=1\n" "# sysctl net.link.ether.bridge.enable=1\n" msgstr "" "# sysctl net.link.ether.bridge.config=fxp0:0,xl0:0\n" "# sysctl net.link.ether.bridge.ipfw=1\n" "# sysctl net.link.ether.bridge.enable=1\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:162 msgid "" "The first row specifies which interfaces should be activated by the bridge, " "the second one will enable the firewall on the bridge and finally the third " "one will enable the bridge." msgstr "" "Первая строка указывает, какие интерфейсы должны быть активированы мостом, " "вторая включает межсетевой экран на мосту, а третья активирует сам мост." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:165 msgid "" "At this point you should be able to insert the machine between two sets of " "hosts without compromising any communication abilities between them. If so, " "the next step is to add the `net.link.ether.bridge._[blah]_=_[blah]_` " "portions of these rows to the [.filename]#/etc/sysctl.conf# file, to have " "them execute at startup." msgstr "" "На этом этапе вы должны быть способны разместить машину между двумя группами " "хостов, не нарушая их способности к взаимодействию. Если это так, следующим " "шагом будет добавление строк `net.link.ether.bridge._[blah]_=_[blah]_` в " "файл [.filename]#/etc/sysctl.conf#, чтобы они выполнялись при запуске " "системы." #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:167 #, no-wrap msgid "Configuring The Firewall" msgstr "Настройка межсетевого экрана" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:177 msgid "" "Now it is time to create your own file with custom firewall rules, to secure " "the inside network. There will be some complication in doing this because " "not all of the firewall functionalities are available on bridged packets. " "Furthermore, there is a difference between the packets that are in the " "process of being forwarded and packets that are being received by the local " "machine. In general, incoming packets are run through the firewall only " "once, not twice as is normally the case; in fact they are filtered only upon " "receipt, so rules that use `out` or `xmit` will never match. Personally, I " "use `in via` which is an older syntax, but one that has a sense when you " "read it. Another limitation is that you are restricted to use only `pass` " "or `drop` commands for packets filtered by a bridge. Sophisticated things " "like `divert`, `forward` or `reject` are not available. Such options can " "still be used, but only on traffic to or from the bridge machine itself (if " "it has an IP address)." msgstr "" "Время создать собственный файл с правилами межсетевого экрана для защиты " "внутренней сети. Это будет несколько сложно, так как не все функции " "межсетевого экрана доступны для мостовых пакетов. Кроме того, есть разница " "между пакетами, которые перенаправляются, и пакетами, которые принимаются " "локальной машиной. В целом, входящие пакеты проходят через межсетевой экран " "только один раз, а не два, как обычно; фактически они фильтруются только при " "получении, поэтому правила с `out` или `xmit` никогда не сработают. Лично я " "использую `in via` — это более старый синтаксис, но он интуитивно понятен " "при чтении. Ещё одно ограничение заключается в том, что для пакетов, " "фильтруемых мостом, можно использовать только команды `pass` или `drop`. " "Более сложные действия, такие как `divert`, `forward` или `reject`, " "недоступны. Такие опции всё ещё можно использовать, но только для трафика, " -"направленного на саму машину моста или исходящего от неё (если у неё есть " -"IP-адрес)." +"направленного на саму машину моста или исходящего от неё (если у неё есть IP-" +"адрес)." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:185 msgid "" "New in FreeBSD 4.0, is the concept of stateful filtering. This is a big " "improvement for UDP traffic, which typically is a request going out, " "followed shortly thereafter by a response with the same set of IP addresses " "and port numbers (but with source and destination reversed, of course). For " "firewalls that have no statekeeping, there is almost no way to deal with " "this sort of traffic as a single session. But with a firewall that can " "\"remember\" an outgoing UDP packet and, for the next few minutes, allow a " "response, handling UDP services is trivial. The following example shows how " "to do it. It is possible to do the same thing with TCP packets. This " "allows you to avoid some denial of service attacks and other nasty tricks, " "but it also typically makes your state table grow quickly in size." msgstr "" "В FreeBSD 4.0 появилась концепция фильтрации с сохранением состояния. Это " "значительное улучшение для UDP-трафика, который обычно представляет собой " "запрос, отправляемый наружу, за которым вскоре следует ответ с тем же " "набором IP-адресов и номеров портов (но, конечно, с поменянными местами " "источником и назначением). Для межсетевых экранов без сохранения состояния " "практически нет возможности обрабатывать такой трафик как единую сессию. " "Однако, если межсетевой экран может «запоминать» исходящий UDP-пакет и в " "течение нескольких минут разрешать ответ, обработка UDP-сервисов становится " "тривиальной. В следующем примере показано, как это сделать. То же самое " "можно проделать и с TCP-пакетами. Это позволяет избежать некоторых атак типа " "«отказ в обслуживании» и других неприятных трюков, но также обычно приводит " "к быстрому росту таблицы состояний." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:189 msgid "" "Let's look at an example setup. Note first that at the top of [.filename]#/" "etc/rc.firewall# there are already standard rules for the loopback interface " "[.filename]#lo0#, so we should not have to care for them anymore. Custom " "rules should be put in a separate file (say [.filename]#/etc/rc.firewall." "local#) and loaded at system startup, by modifying the row of [.filename]#/" "etc/rc.conf# where we defined the `open` firewall:" msgstr "" "Рассмотрим пример настройки. Обратите внимание, что в начале файла [." "filename]#/etc/rc.firewall# уже есть стандартные правила для loopback-" "интерфейса (интерфейса обратной петли) [.filename]#lo0#, поэтому нам не " "нужно о них заботиться. Пользовательские правила следует поместить в " "отдельный файл (например, [.filename]#/etc/rc.firewall.local#) и загружать " "его при старте системы, изменив строку в [.filename]#/etc/rc.conf#, где мы " "определили `open` для межсетевого экрана:" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:193 #, no-wrap msgid "firewall_type=\"/etc/rc.firewall.local\"\n" msgstr "firewall_type=\"/etc/rc.firewall.local\"\n" #. type: delimited block = 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:198 msgid "" "You have to specify the _full_ path, otherwise it will not be loaded with " "the risk to remain isolated from the network." msgstr "" "Вы должны указать _полный_ путь, иначе он не будет загружен с риском " "остаться изолированным от сети." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:201 msgid "" "For our example imagine to have the [.filename]#fxp0# interface connected " "towards the outside (Internet) and the [.filename]#xl0# towards the inside " "(LAN). The bridge machine has the IP `1.2.3.4` (it is not possible that your " "ISP can give you an address quite like this, but for our example it is good)." msgstr "" "Для нашего примера представим, что интерфейс [.filename]#fxp0# подключён к " "внешней сети (Интернет), а [.filename]#xl0# — к внутренней (ЛВС). У машины с " "мостом IP-адрес `1.2.3.4` (ваш провайдер вряд ли выдаст вам такой адрес, но " "для нашего примера он подходит)." #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:206 #, no-wrap msgid "" "# Things that we have kept state on before get to go through in a hurry\n" "add check-state\n" msgstr "" "# Things that we have kept state on before get to go through in a hurry\n" "add check-state\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:211 #, no-wrap msgid "" "# Throw away RFC 1918 networks\n" "add drop all from 10.0.0.0/8 to any in via fxp0\n" "add drop all from 172.16.0.0/12 to any in via fxp0\n" "add drop all from 192.168.0.0/16 to any in via fxp0\n" msgstr "" "# Throw away RFC 1918 networks\n" "add drop all from 10.0.0.0/8 to any in via fxp0\n" "add drop all from 172.16.0.0/12 to any in via fxp0\n" "add drop all from 192.168.0.0/16 to any in via fxp0\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:217 #, no-wrap msgid "" "# Allow the bridge machine to say anything it wants\n" "# (if the machine is IP-less do not include these rows)\n" "add pass tcp from 1.2.3.4 to any setup keep-state\n" "add pass udp from 1.2.3.4 to any keep-state\n" "add pass ip from 1.2.3.4 to any\n" msgstr "" "# Allow the bridge machine to say anything it wants\n" "# (if the machine is IP-less do not include these rows)\n" "add pass tcp from 1.2.3.4 to any setup keep-state\n" "add pass udp from 1.2.3.4 to any keep-state\n" "add pass ip from 1.2.3.4 to any\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:222 #, no-wrap msgid "" "# Allow the inside hosts to say anything they want\n" "add pass tcp from any to any in via xl0 setup keep-state\n" "add pass udp from any to any in via xl0 keep-state\n" "add pass ip from any to any in via xl0\n" msgstr "" "# Allow the inside hosts to say anything they want\n" "add pass tcp from any to any in via xl0 setup keep-state\n" "add pass udp from any to any in via xl0 keep-state\n" "add pass ip from any to any in via xl0\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:234 #, no-wrap msgid "" "# TCP section\n" "# Allow SSH\n" "add pass tcp from any to any 22 in via fxp0 setup keep-state\n" "# Allow SMTP only towards the mail server\n" "add pass tcp from any to relay 25 in via fxp0 setup keep-state\n" "# Allow zone transfers only by the secondary name server [dns2.nic.it]\n" "add pass tcp from 193.205.245.8 to ns 53 in via fxp0 setup keep-state\n" "# Pass ident probes. It is better than waiting for them to timeout\n" "add pass tcp from any to any 113 in via fxp0 setup keep-state\n" "# Pass the \"quarantine\" range\n" "add pass tcp from any to any 49152-65535 in via fxp0 setup keep-state\n" msgstr "" "# TCP section\n" "# Allow SSH\n" "add pass tcp from any to any 22 in via fxp0 setup keep-state\n" "# Allow SMTP only towards the mail server\n" "add pass tcp from any to relay 25 in via fxp0 setup keep-state\n" "# Allow zone transfers only by the secondary name server [dns2.nic.it]\n" "add pass tcp from 193.205.245.8 to ns 53 in via fxp0 setup keep-state\n" "# Pass ident probes. It is better than waiting for them to timeout\n" "add pass tcp from any to any 113 in via fxp0 setup keep-state\n" "# Pass the \"quarantine\" range\n" "add pass tcp from any to any 49152-65535 in via fxp0 setup keep-state\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:240 #, no-wrap msgid "" "# UDP section\n" "# Allow DNS only towards the name server\n" "add pass udp from any to ns 53 in via fxp0 keep-state\n" "# Pass the \"quarantine\" range\n" "add pass udp from any to any 49152-65535 in via fxp0 keep-state\n" msgstr "" "# UDP section\n" "# Allow DNS only towards the name server\n" "add pass udp from any to ns 53 in via fxp0 keep-state\n" "# Pass the \"quarantine\" range\n" "add pass udp from any to any 49152-65535 in via fxp0 keep-state\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:247 #, no-wrap msgid "" "# ICMP section\n" "# Pass 'ping'\n" "add pass icmp from any to any icmptypes 8 keep-state\n" "# Pass error messages generated by 'traceroute'\n" "add pass icmp from any to any icmptypes 3\n" "add pass icmp from any to any icmptypes 11\n" msgstr "" "# ICMP section\n" "# Pass 'ping'\n" "add pass icmp from any to any icmptypes 8 keep-state\n" "# Pass error messages generated by 'traceroute'\n" "add pass icmp from any to any icmptypes 3\n" "add pass icmp from any to any icmptypes 11\n" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:250 #, no-wrap msgid "" "# Everything else is suspect\n" "add drop log all from any to any\n" msgstr "" "# Everything else is suspect\n" "add drop log all from any to any\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:254 msgid "" "Those of you who have set up firewalls before may notice some things " "missing. In particular, there are no anti-spoofing rules, in fact we did " "_not_ add:" msgstr "" "Те из вас, кто ранее настраивал межсетевые экраны, могут заметить некоторые " "отсутствующие элементы. В частности, здесь нет правил защиты от спуфинга, и " "фактически мы _не_ добавили:" #. type: delimited block . 4 #: documentation/content/en/articles/filtering-bridges/_index.adoc:258 #, no-wrap msgid "add deny all from 1.2.3.4/8 to any in via fxp0\n" msgstr "add deny all from 1.2.3.4/8 to any in via fxp0\n" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:264 msgid "" "That is, drop packets that are coming in from the outside claiming to be " "from our network. This is something that you would commonly do to be sure " "that someone does not try to evade the packet filter, by generating " "nefarious packets that look like they are from the inside. The problem with " "that is that there is _at least_ one host on the outside interface that you " "do not want to ignore: the router. But usually, the ISP anti-spoofs at " "their router, so we do not need to bother that much." msgstr "" "То есть, отбрасывать пакеты, которые поступают извне, утверждая, что они из " "нашей сети. Это стандартная мера для предотвращения попыток обхода " "межсетевого экрана путем генерации вредоносных пакетов, которые выглядят " "так, будто они из внутренней сети. Проблема в том, что есть _как минимум_ " "один хост на внешнем интерфейсе, который нельзя игнорировать: маршрутизатор. " "Однако обычно интернет-провайдер применяет антиспуфинг на своем " "маршрутизаторе, так что нам не нужно слишком беспокоиться об этом." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:267 msgid "" "The last rule seems to be an exact duplicate of the default rule, that is, " "do not let anything pass that is not specifically allowed. But there is a " "difference: all suspected traffic will be logged." msgstr "" "Последнее правило кажется точной копией правила по умолчанию, то есть не " "пропускать ничего, что явно не разрешено. Однако есть разница: весь " "подозрительный трафик будет записываться в журнал." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:273 msgid "" "There are two rules for passing SMTP and DNS traffic towards the mail server " "and the name server, if you have them. Obviously the whole rule set should " "be flavored to personal taste, this is only a specific example (rule format " -"is described accurately in the man:ipfw[8] man page). Note that for " -"\"relay\" and \"ns\" to work, name service lookups must work _before_ the " -"bridge is enabled. This is an example of making sure that you set the IP on " -"the correct network card. Alternatively it is possible to specify the IP " +"is described accurately in the man:ipfw[8] man page). Note that for \"relay" +"\" and \"ns\" to work, name service lookups must work _before_ the bridge is " +"enabled. This is an example of making sure that you set the IP on the " +"correct network card. Alternatively it is possible to specify the IP " "address instead of the host name (required if the machine is IP-less)." msgstr "" "Существует два правила для пропуска SMTP и DNS-трафика к почтовому серверу и " "серверу имен, если они у вас есть. Очевидно, весь набор правил должен быть " "адаптирован под личные предпочтения — это лишь конкретный пример (формат " "правил подробно описан на man:ipfw[8]). Обратите внимание, что для работы " "\"relay\" и \"ns\" разрешение имен должно работать _до_ включения моста. Это " "пример того, как убедиться, что IP-адрес установлен на правильной сетевой " "карте. Альтернативно можно указать IP-адрес вместо имени хоста (это " "требуется, если у машины нет IP-адреса)." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:278 msgid "" "People that are used to setting up firewalls are probably also used to " "either having a `reset` or a `forward` rule for ident packets (TCP port " "113). Unfortunately, this is not an applicable option with the bridge, so " "the best thing is to simply pass them to their destination. As long as that " "destination machine is not running an ident daemon, this is relatively " "harmless. The alternative is dropping connections on port 113, which " "creates some problems with services like IRC (the ident probe must timeout)." msgstr "" "Люди, привыкшие настраивать межсетевые экраны, вероятно, также привыкли " "использовать правило `reset` или `forward` для идентификационных пакетов " "(TCP-порт 113). К сожалению, это не применимо при использовании моста, " "поэтому лучше всего просто передавать их целевому устройству. Пока на этом " "устройстве не запущен идентификационный демон, это относительно безопасно. " "Альтернативой является сброс соединений на порту 113, что создает проблемы с " "такими сервисами, как IRC (запрос идентификации будет ожидать таймаута)." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:285 msgid "" "The only other thing that is a little weird that you may have noticed is " "that there is a rule to let the bridge machine speak, and another for " "internal hosts. Remember that this is because the two sets of traffic will " "take different paths through the kernel and into the packet filter. The " "inside net will go through the bridge, while the local machine will use the " "normal IP stack to speak. Thus the two rules to handle the different " "cases. The `in via fxp0` rules work for both paths. In general, if you use " "`in via` rules throughout the filter, you will need to make an exception for " "locally generated packets, because they did not come in via any of our " "interfaces." msgstr "" "Единственное, что может показаться немного странным — это наличие правила, " "разрешающего общение для мостовой машины, и другого правила для внутренних " "хостов. Помните, что это связано с тем, что два типа трафика проходят разные " "пути через ядро и попадают в пакетный фильтр. Трафик внутренней сети " "проходит через мост, в то время как локальная машина использует обычный IP-" "стек для общения. Поэтому и нужны два правила для обработки разных случаев. " "Правила `in via fxp0` работают для обоих путей. В общем случае, если вы " "используете правила `in via` во всём фильтре, вам потребуется сделать " "исключение для локально сгенерированных пакетов, так как они не поступают " "через какие-либо из наших интерфейсов." #. type: Title == #: documentation/content/en/articles/filtering-bridges/_index.adoc:287 #, no-wrap msgid "Contributors" msgstr "Участники" #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:291 msgid "" "Many parts of this article have been taken, updated and adapted from an old " "text about bridging, edited by Nick Sayer. A pair of inspirations are due " "to an introduction on bridging by Steve Peterson." msgstr "" "Многие части этой статьи были взяты, обновлены и адаптированы из старого " "текста о мостах, отредактированного Ником Сайером. Пара вдохновений обязана " "введению в мосты от Стива Петерсона." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:293 msgid "" "A big thanks to Luigi Rizzo for the implementation of the bridge code in " "FreeBSD and for the time he has dedicated to me answering all of my related " "questions." msgstr "" "Огромная благодарность Луиджи Риццо за реализацию кода моста в FreeBSD и за " "время, которое он уделил мне, отвечая на все мои вопросы по этой теме." #. type: Plain text #: documentation/content/en/articles/filtering-bridges/_index.adoc:294 msgid "" "A thanks goes out also to Tom Rhodes who looked over my job of translation " "from Italian (the original language of this article) into English." msgstr "" "Благодарность также выражается Тому Родсу, который проверил мою работу по " "переводу с итальянского (оригинального языка этой статьи) на английский." diff --git a/documentation/content/ru/articles/freebsd-update-server/_index.adoc b/documentation/content/ru/articles/freebsd-update-server/_index.adoc index d2aa4552ee..a936427267 100644 --- a/documentation/content/ru/articles/freebsd-update-server/_index.adoc +++ b/documentation/content/ru/articles/freebsd-update-server/_index.adoc @@ -1,610 +1,610 @@ --- authors: - author: 'Jason Helfman' email: jgh@FreeBSD.org copyright: '2009-2011, 2013 Jason Helfman' description: 'Создание собственного сервера freebsd-update позволяет системному администратору выполнять быстрые обновления для множества машин из локального зеркала' tags: ["FreeBSD", "Update", "Server", "internal"] title: 'Создайте свой собственный сервер обновлений FreeBSD' trademarks: ["freebsd", "amd", "intel", "general"] --- = Создайте свой собственный сервер обновлений FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/freebsd-update-server/ 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::[] [WARNING] ==== Инструкции в этой статье относятся к более старой версии FreeBSD и могут не работать корректно в последних версиях ОС. В связи с появлением pkgbase, утилита freebsd-update планируется к удалению из FreeBSD в будущем. Когда это произойдет, статья будет либо обновлена с учетом новых процедур, либо полностью удалена. ==== [.abstract-title] Аннотация В этой статье описывается создание внутреннего сервера обновлений FreeBSD. https://github.com/freebsd/freebsd-update-build/[freebsd-update-server] написан `{cperciva}`, почетным руководителем безопасности FreeBSD. Для пользователей, которым удобно обновлять свои системы через официальный сервер обновлений, создание собственного сервера обновлений FreeBSD может помочь расширить его функциональность, поддерживая вручную модифицированные выпуски FreeBSD или предоставляя локальное зеркало, которое позволит ускорить обновления для множества машин. ''' toc::[] [[acknowledgments]] == Благодарности Эта статья была впоследствии опубликована в онлайн издании https://people.freebsd.org/~jgh/files/fus/BSD_03_2010_EN.pdf[BSD Magazine]. [[introduction]] == Введение Опытные пользователи или администраторы часто отвечают за несколько машин или окружений. Они понимают сложные требования и вызовы, связанные с поддержанием такой инфраструктуры. Запуск сервера обновлений FreeBSD упрощает развертывание исправлений безопасности и программного обеспечения на выбранных тестовых машинах перед их внедрением в рабочую среду. Это также означает, что множество систем могут быть обновлены из локальной сети, а не через потенциально медленное интернет-соединение. В этой статье описаны шаги, необходимые для создания внутреннего сервера обновлений FreeBSD. [[prerequisites]] == Предварительные требования Для создания внутреннего сервера обновлений FreeBSD необходимо выполнить некоторые требования. * Работающая система FreeBSD. + [NOTE] ==== Минимальное требование для обновлений — сборка на версии FreeBSD, которая не меньше целевой версии для распространения. ==== * Пользовательская учётная запись с как минимум 4 ГБ свободного места. Это позволит создавать обновления для версий 7.1 и 7.2, но точные требования к месту могут меняться от версии к версии. * Учетная запись man:ssh[1] на удаленной машине для загрузки распределенных обновлений. -* Веб-сервер, например extref:{handbook}[Apache, network-apache], с более чем половиной пространства, необходимого для сборки. Например, тестовые сборки для версий 7.1 и 7.2 занимают в общей сложности 4 ГБ, а пространство веб-сервера, необходимое для распространения этих обновлений, составляет 2.6 ГБ. +* Веб-сервер, например extref:{handbook}network-servers[Apache, network-apache], с более чем половиной пространства, необходимого для сборки. Например, тестовые сборки для версий 7.1 и 7.2 занимают в общей сложности 4 ГБ, а пространство веб-сервера, необходимое для распространения этих обновлений, составляет 2.6 ГБ. * Базовые знания написания скриптов для оболочки Bourne shell, man:sh[1]. [[Configuration]] == Конфигурация: установка и настройка Загрузите программное обеспечение https://github.com/freebsd/freebsd-update-build/[freebsd-update-server], установив пакеты package:devel/git[] и package:security/ca_root_nss[], и выполните: [source, shell] .... % git clone https://github.com/freebsd/freebsd-update-build.git freebsd-update-server .... Обновите соответствующим образом файл [.filename]#scripts/build.conf#. Он используется во всех операциях сборки. Вот стандартный [.filename]#build.conf#, который следует изменить в соответствии с вашим окружением. [.programlisting] .... # Main configuration file for FreeBSD Update builds. The # release-specific configuration data is lower down in # the scripts tree. # Location from which to fetch releases export FTP=ftp://ftp2.freebsd.org/pub/FreeBSD/releases <.> # Host platform export HOSTPLATFORM=`uname -m` # Host name to use inside jails export BUILDHOSTNAME=${HOSTPLATFORM}-builder.daemonology.net <.> # Location of SSH key export SSHKEY=/root/.ssh/id_dsa <.> # SSH account into which files are uploaded MASTERACCT=builder@wadham.daemonology.net <.> # Directory into which files are uploaded MASTERDIR=update-master.freebsd.org <.> .... Учтите возможные варианты следующих настроек: <.> Это место, откуда загружаются образы ISO (с помощью подпрограммы `fetchiso()` из файла [.filename]#scripts/build.subr#). Настроенное расположение не ограничивается URI FTP. Должны работать любые схемы URI, поддерживаемые стандартной утилитой man:fetch[1]. Пользовательские изменения кода `fetchiso()` можно установить, скопировав скрипт [.filename]#build.subr# по умолчанию в область, специфичную для выпуска и архитектуры, по пути [.filename]#scripts/РЕЛИЗ/АРХИТЕКТУРА/build.subr#, и применив локальные изменения. <.> Имя хоста для сборки. Эта информация будет отображаться на обновленных системах при выполнении команды: + [source, shell] .... % uname -v .... + <.> Ключ SSH для загрузки файлов на сервер обновлений. Пару ключей можно создать, выполнив команду `ssh-keygen -t dsa`. Этот параметр необязателен; стандартная аутентификация по паролю будет использоваться в качестве резервного метода, если `SSHKEY` не определён. Более подробную информацию о SSH и соответствующих шагах по созданию и использованию ключей можно найти на man:ssh-keygen[1]. <.> Учетная запись для загрузки файлов на сервер обновлений. <.> Каталог на сервере обновлений, в который загружаются файлы. В стандартном файле [.filename]#build.conf#, поставляемом с исходниками freebsd-update-server, задана сборка релизов FreeBSD для архитектуры i386. В качестве примера настройки сервера обновлений для других архитектур ниже приведены шаги с необходимыми изменениями конфигурации для amd64: [.procedure] ==== . Создайте среду сборки для amd64: + [source, shell] .... % mkdir -p /usr/local/freebsd-update-server/scripts/7.2-RELEASE/amd64 .... . Установите файл [.filename]#build.conf# в только что созданный каталог сборки. Параметры конфигурации сборки для FreeBSD 7.2-RELEASE на amd64 должны быть примерно такими: + [.programlisting] .... # SHA256 hash of RELEASE disc1.iso image. export RELH=1ea1f6f652d7c5f5eab7ef9f8edbed50cb664b08ed761850f95f48e86cc71ef5 <.> # Components of the world, source, and kernels export WORLDPARTS="base catpages dict doc games info manpages proflibs lib32" export SOURCEPARTS="base bin contrib crypto etc games gnu include krb5 \ lib libexec release rescue sbin secure share sys tools \ ubin usbin cddl" export KERNELPARTS="generic" # EOL date export EOL=1275289200 <.> .... + <.> Хеш-ключ man:sha256[1] для желаемого выпуска опубликован в соответствующем link:https://www.FreeBSD.org/releases/[анонсе выпуска]. <.> Для получения номера "End of Life" для файла [.filename]#build.conf# обратитесь к "Estimated EOL" на сайте link:https://www.FreeBSD.org/security/security/[FreeBSD Security Website]. Значение `EOL` можно вывести из даты, указанной на веб-сайте, используя утилиту man:date[1], например: + [source, shell] .... % date -j -f '%Y%m%d-%H%M%S' '20090401-000000' '+%s' .... ==== [[build]] == Сборка кода обновления Первым шагом является запуск [.filename]#scripts/make.sh#. Это приведёт к сборке некоторых бинарных файлов, созданию каталогов и генерации RSA-ключа подписи, используемого для подтверждения сборок. На этом этапе потребуется ввести парольную фразу для окончательного создания ключа подписи. [source, shell] .... # sh scripts/make.sh cc -O2 -fno-strict-aliasing -pipe findstamps.c -o findstamps findstamps.c: In function 'usage': findstamps.c:45: warning: incompatible implicit declaration of built-in function 'exit' cc -O2 -fno-strict-aliasing -pipe unstamp.c -o unstamp install findstamps ../bin install unstamp ../bin rm -f findstamps unstamp Generating RSA private key, 4096 bit long modulus ................................................................................++ ...................++ e is 65537 (0x10001) Public key fingerprint: 27ef53e48dc869eea6c3136091cc6ab8589f967559824779e855d58a2294de9e Encrypting signing key for root enter aes-256-cbc encryption password: Verifying - enter aes-256-cbc encryption password: .... [NOTE] ==== Сохраните сгенерированный отпечаток ключа. Это значение требуется в [.filename]#/etc/freebsd-update.conf# для бинарных обновлений. ==== На этом этапе мы готовы к подготовке сборки. [source, shell] .... # cd /usr/local/freebsd-update-server # sh scripts/init.sh amd64 7.2-RELEASE .... Ниже приведён пример _первоначальной_ сборки. [source, shell] .... # sh scripts/init.sh amd64 7.2-RELEASE Mon Aug 24 16:04:36 PDT 2009 Starting fetch for FreeBSD/amd64 7.2-RELEASE /usr/local/freebsd-update-server/work/7.2-RELE100 of 588 MB 359 kBps 00m00s Mon Aug 24 16:32:38 PDT 2009 Verifying disc1 hash for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 16:32:44 PDT 2009 Extracting components for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 16:34:05 PDT 2009 Constructing world+src image for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 16:35:57 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 23:36:24 UTC 2009 Building world for FreeBSD/amd64 7.2-RELEASE Tue Aug 25 00:31:29 UTC 2009 Distributing world for FreeBSD/amd64 7.2-RELEASE Tue Aug 25 00:32:36 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE Tue Aug 25 00:44:44 UTC 2009 Constructing world components for FreeBSD/amd64 7.2-RELEASE Tue Aug 25 00:44:56 UTC 2009 Distributing source for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 17:46:18 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 17:46:33 PDT 2009 Identifying extra documentation for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 17:47:13 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 17:47:18 PDT 2009 Indexing release for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 17:50:44 PDT 2009 Indexing world0 for FreeBSD/amd64 7.2-RELEASE Files built but not released: Files released but not built: Files which differ by more than contents: Files which differ between release and build: kernel|generic|/GENERIC/hptrr.ko kernel|generic|/GENERIC/kernel src|sys|/sys/conf/newvers.sh world|base|/boot/loader world|base|/boot/pxeboot world|base|/etc/mail/freebsd.cf world|base|/etc/mail/freebsd.submit.cf world|base|/etc/mail/sendmail.cf world|base|/etc/mail/submit.cf world|base|/lib/libcrypto.so.5 world|base|/usr/bin/ntpq world|base|/usr/lib/libalias.a world|base|/usr/lib/libalias_cuseeme.a world|base|/usr/lib/libalias_dummy.a world|base|/usr/lib/libalias_ftp.a ... .... Затем выполняется сборка world с применением патчей world. Более подробное объяснение можно найти в [.filename]#scripts/build.subr#. [WARNING] ==== В течение этого второго цикла сборки демон протокола сетевого времени, man:ntpd[8], отключен. По словам `{cperciva}`, почетного офицера безопасности FreeBSD, "код сборки https://github.com/freebsd/freebsd-update-build/[freebsd-update-server] должен идентифицировать временные метки, хранящиеся в файлах, чтобы их можно было игнорировать при сравнении сборок для определения того, какие файлы нуждаются в обновлении. Этот поиск временных меток работает путем выполнения двух сборок с интервалом в 400 дней и сравнения результатов." ==== [source, shell] .... Mon Aug 24 17:54:07 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE Wed Sep 29 00:54:34 UTC 2010 Building world for FreeBSD/amd64 7.2-RELEASE Wed Sep 29 01:49:42 UTC 2010 Distributing world for FreeBSD/amd64 7.2-RELEASE Wed Sep 29 01:50:50 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE Wed Sep 29 02:02:56 UTC 2010 Constructing world components for FreeBSD/amd64 7.2-RELEASE Wed Sep 29 02:03:08 UTC 2010 Distributing source for FreeBSD/amd64 7.2-RELEASE Tue Sep 28 19:04:31 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:04:46 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:04:51 PDT 2009 Indexing world1 for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:08:04 PDT 2009 Locating build stamps for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:10:19 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:10:19 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 19:10:20 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 12:16:57 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.2-RELEASE Mon Aug 24 12:16:59 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.2-RELEASE Files found which include build stamps: kernel|generic|/GENERIC/hptrr.ko kernel|generic|/GENERIC/kernel world|base|/boot/loader world|base|/boot/pxeboot world|base|/etc/mail/freebsd.cf world|base|/etc/mail/freebsd.submit.cf world|base|/etc/mail/sendmail.cf world|base|/etc/mail/submit.cf world|base|/lib/libcrypto.so.5 world|base|/usr/bin/ntpq world|base|/usr/include/osreldate.h world|base|/usr/lib/libalias.a world|base|/usr/lib/libalias_cuseeme.a world|base|/usr/lib/libalias_dummy.a world|base|/usr/lib/libalias_ftp.a ... .... Наконец, сборка завершена. [source, shell] .... Values of build stamps, excluding library archive headers: v1.2 (Aug 25 2009 00:40:36) v1.2 (Aug 25 2009 00:38:22) @()FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009 FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009 root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC 7.2-RELEASE Mon Aug 24 23:55:25 UTC 2009 Mon Aug 24 23:55:25 UTC 2009 built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009 built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009 built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009 built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009 Mon Aug 24 23:46:47 UTC 2009 ntpq 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1) * Copyright (c) 1992-2009 The FreeBSD Project. Mon Aug 24 23:46:47 UTC 2009 Mon Aug 24 23:55:40 UTC 2009 Aug 25 2009 ntpd 4.2.4p5-a Mon Aug 24 23:55:52 UTC 2009 (1) ntpdate 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1) ntpdc 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1) Tue Aug 25 00:21:21 UTC 2009 Tue Aug 25 00:21:21 UTC 2009 Tue Aug 25 00:21:21 UTC 2009 Mon Aug 24 23:46:47 UTC 2009 FreeBSD/amd64 7.2-RELEASE initialization build complete. Please review the list of build stamps printed above to confirm that they look sensible, then run sh -e approve.sh amd64 7.2-RELEASE to sign the release. .... Одобрите сборку, если всё правильно. Дополнительную информацию о том, как это определить, можно найти в распределённом исходном файле с именем [.filename]#USAGE#. Выполните [.filename]#scripts/approve.sh#, как указано. Это подпишет релиз и переместит компоненты в промежуточную область, подходящую для загрузки. [source, shell] .... # cd /usr/local/freebsd-update-server # sh scripts/mountkey.sh .... [source, shell] .... # sh -e scripts/approve.sh amd64 7.2-RELEASE Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.2-RELEASE Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.2-RELEASE Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.2-RELEASE Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.2-RELEASE Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE .... После завершения процесса утверждения можно начать процедуру загрузки. [source, shell] .... # cd /usr/local/freebsd-update-server # sh scripts/upload.sh amd64 7.2-RELEASE .... [NOTE] ==== В случае необходимости повторной загрузки кода обновления, это можно сделать, перейдя в публичный каталог дистрибутивов для целевого выпуска и обновив атрибуты файла _uploaded_. [source, shell] .... # cd /usr/local/freebsd-update-server/pub/7.2-RELEASE/amd64 # touch -t 200801010101.01 uploaded .... ==== -Загруженные файлы должны находиться в корневом каталоге веб-сервера, чтобы обновления могли распространяться. Точная конфигурация будет зависеть от используемого веб-сервера. Для веб-сервера Apache обратитесь к разделу extref:{handbook}[Настройка серверов Apache, network-apache] в Руководстве. +Загруженные файлы должны находиться в корневом каталоге веб-сервера, чтобы обновления могли распространяться. Точная конфигурация будет зависеть от используемого веб-сервера. Для веб-сервера Apache обратитесь к разделу extref:{handbook}network-servers[Настройка серверов Apache, network-apache] в Руководстве. -Обновите `KeyPrint` и `ServerName` клиента в [.filename]#/etc/freebsd-update.conf# и выполните обновления, как указано в разделе extref:{handbook}[Обновление FreeBSD, updating-upgrading-freebsdupdate] Руководства. +Обновите `KeyPrint` и `ServerName` клиента в [.filename]#/etc/freebsd-update.conf# и выполните обновления, как указано в разделе extref:{handbook}cutting-edge[Обновление FreeBSD, updating-upgrading-freebsdupdate] Руководства. [IMPORTANT] ==== Для корректной работы сервера обновлений FreeBSD Update необходимо собирать обновления как для текущего релиза, так и для релиза, _на который планируется обновление_. Это необходимо для определения различий в файлах между релизами. Например, при обновлении системы FreeBSD с 7.1-RELEASE до 7.2-RELEASE потребуется собрать и загрузить на сервер распространения обновления для обеих версий. ==== Для справки, полный текст выполнения link:../../source/articles/freebsd-update-server/init.txt[init.sh] прилагается. [[patch]] == Построение патча Каждый раз, когда объявляется link:https://www.FreeBSD.org/security/advisories/[консультативный документ по безопасности] или link:https://www.FreeBSD.org/security/notices/[уведомление о безопасности], можно собрать обновление с исправлением. Для этого примера будет использоваться версия 7.1-RELEASE. Несколько предположений сделано для другой сборки выпуска: * Настройка правильной структуры каталогов для первоначальной сборки. * Выполните первоначальную сборку для 7.1-RELEASE. Создайте каталог с патчами соответствующего выпуска в [.filename]#/usr/local/freebsd-update-server/patches/#. [source, shell] .... % mkdir -p /usr/local/freebsd-update-server/patches/7.1-RELEASE/ % cd /usr/local/freebsd-update-server/patches/7.1-RELEASE .... -В качестве примера возьмем патч для man:named[8]. Прочтите рекомендации и загрузите необходимый файл с link:https://www.FreeBSD.org/security/advisories/[FreeBSD Security Advisories]. Дополнительную информацию о том, как интерпретировать рекомендации, можно найти в extref:{handbook}[FreeBSD Handbook, security-advisories]. +В качестве примера возьмем патч для man:named[8]. Прочтите рекомендации и загрузите необходимый файл с link:https://www.FreeBSD.org/security/advisories/[FreeBSD Security Advisories]. Дополнительную информацию о том, как интерпретировать рекомендации, можно найти в extref:{handbook}security[FreeBSD Handbook, security-advisories]. В https://security.freebsd.org/advisories/FreeBSD-SA-09:12.bind.asc[кратком обзоре безопасности] этот совет называется `SA-09:12.bind`. После загрузки файла необходимо переименовать его в соответствии с уровнем исправления. Рекомендуется сохранять это в соответствии с официальными уровнями исправлений FreeBSD, но имя может быть выбрано свободно. Для данной сборки давайте последуем текущей установленной практике FreeBSD и назовем его `p7`. Переименуйте файл: [source, shell] .... % cd /usr/local/freebsd-update-server/patches/7.1-RELEASE/; mv bind.patch 7-SA-09:12.bind .... [NOTE] ==== При выполнении сборки уровня патча предполагается, что предыдущие патчи уже установлены. При запуске сборки патча будут выполнены все патчи, содержащиеся в каталоге патчей. В сборку могут быть добавлены пользовательские патчи. Используйте ноль или любое другое число. ==== [WARNING] ==== Задача администратора сервера FreeBSD Update — принимать соответствующие меры для проверки подлинности каждого патча. ==== На этом этапе _diff_ готов к сборке. Программное обеспечение сначала проверяет, был ли запущен [.filename]#scripts/init.sh# для соответствующего выпуска перед выполнением сборки diff. [source, shell] .... # cd /usr/local/freebsd-update-server # sh scripts/diff.sh amd64 7.1-RELEASE 7 .... Вот пример выполнения _дифференциальной_ сборки. [source, shell] .... # sh -e scripts/diff.sh amd64 7.1-RELEASE 7 Wed Aug 26 10:09:59 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 17:10:25 UTC 2009 Building world for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 18:05:11 UTC 2009 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 18:06:16 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 18:17:50 UTC 2009 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 18:18:02 UTC 2009 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 11:19:23 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 11:19:37 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 11:19:42 PDT 2009 Indexing world0 for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 11:23:02 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 18:23:29 UTC 2010 Building world for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 19:18:15 UTC 2010 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 19:19:18 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 19:30:52 UTC 2010 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 19:31:03 UTC 2010 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7 Thu Sep 30 12:32:25 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:32:39 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:32:43 PDT 2009 Indexing world1 for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:35:54 PDT 2009 Locating build stamps for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:36:58 PDT 2009 Reverting changes due to build stamps for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:37:14 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:37:14 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:37:15 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:43:23 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.1-RELEASE-p7 Wed Aug 26 12:43:25 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.1-RELEASE-p7 ... Files found which include build stamps: kernel|generic|/GENERIC/hptrr.ko kernel|generic|/GENERIC/kernel world|base|/boot/loader world|base|/boot/pxeboot world|base|/etc/mail/freebsd.cf world|base|/etc/mail/freebsd.submit.cf world|base|/etc/mail/sendmail.cf world|base|/etc/mail/submit.cf world|base|/lib/libcrypto.so.5 world|base|/usr/bin/ntpq world|base|/usr/include/osreldate.h world|base|/usr/lib/libalias.a world|base|/usr/lib/libalias_cuseeme.a world|base|/usr/lib/libalias_dummy.a world|base|/usr/lib/libalias_ftp.a ... Values of build stamps, excluding library archive headers: v1.2 (Aug 26 2009 18:13:46) v1.2 (Aug 26 2009 18:11:44) @()FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009 FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009 root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC 7.1-RELEASE-p7 Wed Aug 26 17:29:15 UTC 2009 Wed Aug 26 17:29:15 UTC 2009 built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009 built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009 built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009 built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009 Wed Aug 26 17:20:39 UTC 2009 ntpq 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1) * Copyright (c) 1992-2009 The FreeBSD Project. Wed Aug 26 17:20:39 UTC 2009 Wed Aug 26 17:29:30 UTC 2009 Aug 26 2009 ntpd 4.2.4p5-a Wed Aug 26 17:29:41 UTC 2009 (1) ntpdate 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1) ntpdc 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1) Wed Aug 26 17:55:02 UTC 2009 Wed Aug 26 17:55:02 UTC 2009 Wed Aug 26 17:55:02 UTC 2009 Wed Aug 26 17:20:39 UTC 2009 ... .... Обновления выводятся на экран, и запрашивается подтверждение. [source, shell] .... New updates: kernel|generic|/GENERIC/kernel.symbols|f|0|0|0555|0|7c8dc176763f96ced0a57fc04e7c1b8d793f27e006dd13e0b499e1474ac47e10| kernel|generic|/GENERIC/kernel|f|0|0|0555|0|33197e8cf15bbbac263d17f39c153c9d489348c2c534f7ca1120a1183dec67b1| kernel|generic|/|d|0|0|0755|0|| src|base|/|d|0|0|0755|0|| src|bin|/|d|0|0|0755|0|| src|cddl|/|d|0|0|0755|0|| src|contrib|/contrib/bind9/bin/named/update.c|f|0|10000|0644|0|4d434abf0983df9bc47435670d307fa882ef4b348ed8ca90928d250f42ea0757| src|contrib|/contrib/bind9/lib/dns/openssldsa_link.c|f|0|10000|0644|0|c6805c39f3da2a06dd3f163f26c314a4692d4cd9a2d929c0acc88d736324f550| src|contrib|/contrib/bind9/lib/dns/opensslrsa_link.c|f|0|10000|0644|0|fa0f7417ee9da42cc8d0fd96ad24e7a34125e05b5ae075bd6e3238f1c022a712| ... FreeBSD/amd64 7.1-RELEASE update build complete. Please review the list of build stamps printed above and the list of updated files to confirm that they look sensible, then run sh -e approve.sh amd64 7.1-RELEASE to sign the build. .... Следуйте той же процедуре, что и ранее, для подтверждения сборки: [source, shell] .... # sh -e scripts/approve.sh amd64 7.1-RELEASE Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.1-RELEASE Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.1-RELEASE Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.1-RELEASE Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.1-RELEASE Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE The FreeBSD/amd64 7.1-RELEASE update build has been signed and is ready to be uploaded. Remember to run sh -e umountkey.sh to unmount the decrypted key once you have finished signing all the new builds. .... После утверждения сборки загрузите программное обеспечение: [source, shell] .... # cd /usr/local/freebsd-update-server # sh scripts/upload.sh amd64 7.1-RELEASE .... Для справки, полный запуск скрипта link:../../source/articles/freebsd-update-server/diff.txt[diff.sh] прилагается. [[tips]] == Советы * Если пользовательская сборка создана с использованием стандартной процедуры `make release` extref:{releng}[procedure, release-build], код freebsd-update-server будет работать с вашей сборкой. Например, сборка без портов или документации может быть создана путем отключения функциональности, относящейся к подпрограммам документации `findextradocs ()`, `addextradocs ()`, и изменения места загрузки в `fetchiso ()` соответственно в файле [.filename]#scripts/build.subr#. В завершение измените хеш man:sha256[1] в файле [.filename]#build.conf# для соответствующей сборки и архитектуры, после чего можно приступать к сборке вашей пользовательской версии. + [.programlisting] .... # Compare ${WORKDIR}/release and ${WORKDIR}/$1, identify which parts # of the world|doc subcomponent are missing from the latter, and # build a tarball out of them. findextradocs () { } # Add extra docs to ${WORKDIR}/$1 addextradocs () { } .... * Добавление флагов `-j _ЧИСЛО_` к целям `buildworld` и `obj` в скрипте [.filename]#scripts/build.subr# может ускорить обработку в зависимости от используемого оборудования, однако это не обязательно. Использование этих флагов в других целях не рекомендуется, так как это может привести к ненадёжности сборки. + [.programlisting] .... # Build the world log "Building world" cd /usr/src && make -j 2 ${COMPATFLAGS} buildworld 2>&1 # Distribute the world log "Distributing world" cd /usr/src/release && make -j 2 obj && make ${COMPATFLAGS} release.1 release.2 2>&1 .... -* Создайте соответствующий extref:{handbook}[DNS, network-dns] SRV-запись для сервера обновлений и разместите остальные за ним с переменными весами. Использование этой возможности обеспечит зеркала для обновлений, однако данный совет не обязателен, если вы не хотите предоставлять избыточный сервис. +* Создайте соответствующий extref:{handbook}network-servers[DNS, network-dns] SRV-запись для сервера обновлений и разместите остальные за ним с переменными весами. Использование этой возможности обеспечит зеркала для обновлений, однако данный совет не обязателен, если вы не хотите предоставлять избыточный сервис. + [.programlisting] .... _http._tcp.update.myserver.com. IN SRV 0 2 80 host1.myserver.com. IN SRV 0 1 80 host2.myserver.com. IN SRV 0 0 80 host3.myserver.com. .... diff --git a/documentation/content/ru/articles/freebsd-update-server/_index.po b/documentation/content/ru/articles/freebsd-update-server/_index.po index 7e8874769e..766f3120c4 100644 --- a/documentation/content/ru/articles/freebsd-update-server/_index.po +++ b/documentation/content/ru/articles/freebsd-update-server/_index.po @@ -1,1482 +1,1485 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-09-21 11:50+0300\n" -"PO-Revision-Date: 2025-08-15 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/articles/freebsd-update-server/_index.adoc:1 #, no-wrap msgid "Building your own freebsd-update server allows a system administrator to perform fast updates for a number of machines from a local mirror" msgstr "Создание собственного сервера freebsd-update позволяет системному администратору выполнять быстрые обновления для множества машин из локального зеркала" #. type: Title = #: documentation/content/en/articles/freebsd-update-server/_index.adoc:1 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:12 #, no-wrap msgid "Build Your Own FreeBSD Update Server" msgstr "Создайте свой собственный сервер обновлений FreeBSD" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:51 msgid "" "The instructions in this article refer to an older version of FreeBSD and " "may not work properly on recent versions of the OS. With the availability of " "pkgbase, the freebsd-update utility is scheduled to be removed from FreeBSD " "in the future. When that happens, this article is either updated to reflect " "the new procedures or removed entirely." msgstr "" "Инструкции в этой статье относятся к более старой версии FreeBSD и могут не " "работать корректно в последних версиях ОС. В связи с появлением pkgbase, " "утилита freebsd-update планируется к удалению из FreeBSD в будущем. Когда " "это произойдет, статья будет либо обновлена с учетом новых процедур, либо " "полностью удалена." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:55 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:59 msgid "" "This article describes building an internal FreeBSD Update Server. The " "https://github.com/freebsd/freebsd-update-build/[freebsd-update-server] is " "written by `{cperciva}`, Security Officer Emeritus of FreeBSD. For users " "that think it is convenient to update their systems against an official " "update server, building their own FreeBSD Update Server may help to extend " "its functionality by supporting manually-tweaked FreeBSD releases or by " "providing a local mirror that will allow faster updates for a number of " "machines." msgstr "" "В этой статье описывается создание внутреннего сервера обновлений FreeBSD. " "https://github.com/freebsd/freebsd-update-build/[freebsd-update-server] " "написан `{cperciva}`, почетным руководителем безопасности FreeBSD. Для " "пользователей, которым удобно обновлять свои системы через официальный " "сервер обновлений, создание собственного сервера обновлений FreeBSD может " "помочь расширить его функциональность, поддерживая вручную модифицированные " "выпуски FreeBSD или предоставляя локальное зеркало, которое позволит " "ускорить обновления для множества машин." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:61 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:65 #, no-wrap msgid "Acknowledgments" msgstr "Благодарности" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:68 msgid "" "This article was subsequently printed at https://people.freebsd.org/~jgh/" "files/fus/BSD_03_2010_EN.pdf[BSD Magazine]." msgstr "" -"Эта статья была впоследствии опубликована в онлайн издании https://" -"people.freebsd.org/~jgh/files/fus/BSD_03_2010_EN.pdf[BSD Magazine]." +"Эта статья была впоследствии опубликована в онлайн издании https://people." +"freebsd.org/~jgh/files/fus/BSD_03_2010_EN.pdf[BSD Magazine]." #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:70 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:77 msgid "" "Experienced users or administrators are often responsible for several " "machines or environments. They understand the difficult demands and " "challenges of maintaining such an infrastructure. Running a FreeBSD Update " "Server makes it easier to deploy security and software patches to selected " "test machines before rolling them out to production. It also means a number " "of systems can be updated from the local network rather than a potentially " "slower Internet connection. This article outlines the steps involved in " "creating an internal FreeBSD Update Server." msgstr "" "Опытные пользователи или администраторы часто отвечают за несколько машин " "или окружений. Они понимают сложные требования и вызовы, связанные с " "поддержанием такой инфраструктуры. Запуск сервера обновлений FreeBSD " "упрощает развертывание исправлений безопасности и программного обеспечения " "на выбранных тестовых машинах перед их внедрением в рабочую среду. Это также " "означает, что множество систем могут быть обновлены из локальной сети, а не " "через потенциально медленное интернет-соединение. В этой статье описаны " "шаги, необходимые для создания внутреннего сервера обновлений FreeBSD." #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:79 #, no-wrap msgid "Prerequisites" msgstr "Предварительные требования" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:82 msgid "" "To build an internal FreeBSD Update Server some requirements should be met." msgstr "" "Для создания внутреннего сервера обновлений FreeBSD необходимо выполнить " "некоторые требования." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:84 msgid "A running FreeBSD system." msgstr "Работающая система FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:88 msgid "" "At a minimum, updates require building on a FreeBSD release greater than or " "equal to the target release version for distribution." msgstr "" "Минимальное требование для обновлений — сборка на версии FreeBSD, которая не " "меньше целевой версии для распространения." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:90 msgid "" "A user account with at least 4 GB of available space. This will allow the " "creation of updates for 7.1 and 7.2, but the exact space requirements may " "change from version to version." msgstr "" "Пользовательская учётная запись с как минимум 4 ГБ свободного места. Это " "позволит создавать обновления для версий 7.1 и 7.2, но точные требования к " "месту могут меняться от версии к версии." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:91 msgid "" "An man:ssh[1] account on a remote machine to upload distributed updates." msgstr "" "Учетная запись man:ssh[1] на удаленной машине для загрузки распределенных " "обновлений." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:92 msgid "" -"A web server, like extref:{handbook}[Apache, network-apache], with over half " -"of the space required for the build. For instance, test builds for 7.1 and " -"7.2 consume a total amount of 4 GB, and the webserver space needed to " -"distribute these updates is 2.6 GB." +"A web server, like extref:{handbook}network-servers[Apache, network-apache], " +"with over half of the space required for the build. For instance, test " +"builds for 7.1 and 7.2 consume a total amount of 4 GB, and the webserver " +"space needed to distribute these updates is 2.6 GB." msgstr "" -"Веб-сервер, например extref:{handbook}[Apache, network-apache], с более чем " -"половиной пространства, необходимого для сборки. Например, тестовые сборки " -"для версий 7.1 и 7.2 занимают в общей сложности 4 ГБ, а пространство веб-" -"сервера, необходимое для распространения этих обновлений, составляет 2.6 ГБ." +"Веб-сервер, например extref:{handbook}network-servers[Apache, network-apache]" +", с более чем половиной пространства, необходимого для сборки. Например, " +"тестовые сборки для версий 7.1 и 7.2 занимают в общей сложности 4 ГБ, а " +"пространство веб-сервера, необходимое для распространения этих обновлений, " +"составляет 2.6 ГБ." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:93 msgid "Basic knowledge of shell scripting with Bourne shell, man:sh[1]." msgstr "" "Базовые знания написания скриптов для оболочки Bourne shell, man:sh[1]." #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:95 #, no-wrap msgid "Configuration: Installation & Setup" msgstr "Конфигурация: установка и настройка" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:98 msgid "" "Download the https://github.com/freebsd/freebsd-update-build/[freebsd-update-" "server] software by installing package:devel/git[] and package:security/" "ca_root_nss[], and execute:" msgstr "" "Загрузите программное обеспечение https://github.com/freebsd/freebsd-update-" "build/[freebsd-update-server], установив пакеты package:devel/git[] и " "package:security/ca_root_nss[], и выполните:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:102 #, no-wrap msgid "% git clone https://github.com/freebsd/freebsd-update-build.git freebsd-update-server\n" msgstr "% git clone https://github.com/freebsd/freebsd-update-build.git freebsd-update-server\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:106 msgid "" "Update [.filename]#scripts/build.conf# appropriately. It is sourced during " "all build operations." msgstr "" "Обновите соответствующим образом файл [.filename]#scripts/build.conf#. Он " "используется во всех операциях сборки." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:108 msgid "" "Here is the default [.filename]#build.conf#, which should be modified to " "suit your environment." msgstr "" "Вот стандартный [.filename]#build.conf#, который следует изменить в " "соответствии с вашим окружением." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:114 #, no-wrap msgid "" "# Main configuration file for FreeBSD Update builds. The\n" "# release-specific configuration data is lower down in\n" "# the scripts tree.\n" msgstr "" "# Main configuration file for FreeBSD Update builds. The\n" "# release-specific configuration data is lower down in\n" "# the scripts tree.\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:117 #, no-wrap msgid "" "# Location from which to fetch releases\n" "export FTP=ftp://ftp2.freebsd.org/pub/FreeBSD/releases <.>\n" msgstr "" "# Location from which to fetch releases\n" "export FTP=ftp://ftp2.freebsd.org/pub/FreeBSD/releases <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:120 #, no-wrap msgid "" "# Host platform\n" "export HOSTPLATFORM=`uname -m`\n" msgstr "" "# Host platform\n" "export HOSTPLATFORM=`uname -m`\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:123 #, no-wrap msgid "" "# Host name to use inside jails\n" "export BUILDHOSTNAME=${HOSTPLATFORM}-builder.daemonology.net <.>\n" msgstr "" "# Host name to use inside jails\n" "export BUILDHOSTNAME=${HOSTPLATFORM}-builder.daemonology.net <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:126 #, no-wrap msgid "" "# Location of SSH key\n" "export SSHKEY=/root/.ssh/id_dsa <.>\n" msgstr "" "# Location of SSH key\n" "export SSHKEY=/root/.ssh/id_dsa <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:129 #, no-wrap msgid "" "# SSH account into which files are uploaded\n" "MASTERACCT=builder@wadham.daemonology.net <.>\n" msgstr "" "# SSH account into which files are uploaded\n" "MASTERACCT=builder@wadham.daemonology.net <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:132 #, no-wrap msgid "" "# Directory into which files are uploaded\n" "MASTERDIR=update-master.freebsd.org <.>\n" msgstr "" "# Directory into which files are uploaded\n" "MASTERDIR=update-master.freebsd.org <.>\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:135 msgid "Parameters for consideration would be:" msgstr "Учтите возможные варианты следующих настроек:" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:138 msgid "" "This is the location where ISO images are downloaded from (by the " "`fetchiso()` subroutine of [.filename]#scripts/build.subr#). The location " "configured is not limited to FTP URIs. Any URI scheme supported by standard " "man:fetch[1] utility should work fine. Customizations to the `fetchiso()` " "code can be installed by copying the default [.filename]#build.subr# script " "to the release and architecture-specific area at [.filename]#scripts/RELEASE/" "ARCHITECTURE/build.subr# and applying local changes." msgstr "" "Это место, откуда загружаются образы ISO (с помощью подпрограммы " "`fetchiso()` из файла [.filename]#scripts/build.subr#). Настроенное " "расположение не ограничивается URI FTP. Должны работать любые схемы URI, " "поддерживаемые стандартной утилитой man:fetch[1]. Пользовательские изменения " -"кода `fetchiso()` можно установить, скопировав скрипт " -"[.filename]#build.subr# по умолчанию в область, специфичную для выпуска и " -"архитектуры, по пути [.filename]#scripts/РЕЛИЗ/АРХИТЕКТУРА/build.subr#, и " -"применив локальные изменения." +"кода `fetchiso()` можно установить, скопировав скрипт [.filename]#build." +"subr# по умолчанию в область, специфичную для выпуска и архитектуры, по пути " +"[.filename]#scripts/РЕЛИЗ/АРХИТЕКТУРА/build.subr#, и применив локальные " +"изменения." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:140 msgid "" "The name of the build host. This information will be displayed on updated " "systems when issuing:" msgstr "" "Имя хоста для сборки. Эта информация будет отображаться на обновленных " "системах при выполнении команды:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:144 #, no-wrap msgid "% uname -v\n" msgstr "% uname -v\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:148 msgid "" "The SSH key for uploading files to the update server. A key pair can be " "created by typing `ssh-keygen -t dsa`. This parameter is optional; standard " "password authentication will be used as a fallback authentication method " "when `SSHKEY` is not defined. The man:ssh-keygen[1] manual page has more " "detailed information about SSH and the appropriate steps for creating and " "using one." msgstr "" "Ключ SSH для загрузки файлов на сервер обновлений. Пару ключей можно " "создать, выполнив команду `ssh-keygen -t dsa`. Этот параметр необязателен; " "стандартная аутентификация по паролю будет использоваться в качестве " "резервного метода, если `SSHKEY` не определён. Более подробную информацию о " "SSH и соответствующих шагах по созданию и использованию ключей можно найти " "на man:ssh-keygen[1]." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:150 msgid "Account for uploading files to the update server." msgstr "Учетная запись для загрузки файлов на сервер обновлений." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:152 msgid "Directory on the update server where files are uploaded to." msgstr "Каталог на сервере обновлений, в который загружаются файлы." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:154 msgid "" "The default [.filename]#build.conf# shipped with the freebsd-update-server " "sources is suitable for building i386 releases of FreeBSD. As an example of " "building an update server for other architectures, the following steps " "outline the configuration changes needed for amd64:" msgstr "" "В стандартном файле [.filename]#build.conf#, поставляемом с исходниками " "freebsd-update-server, задана сборка релизов FreeBSD для архитектуры i386. В " "качестве примера настройки сервера обновлений для других архитектур ниже " "приведены шаги с необходимыми изменениями конфигурации для amd64:" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:158 msgid "Create a build environment for amd64:" msgstr "Создайте среду сборки для amd64:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:162 #, no-wrap msgid "% mkdir -p /usr/local/freebsd-update-server/scripts/7.2-RELEASE/amd64\n" msgstr "% mkdir -p /usr/local/freebsd-update-server/scripts/7.2-RELEASE/amd64\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:165 msgid "" "Install a [.filename]#build.conf# in the newly created build directory. The " "build configuration options for FreeBSD 7.2-RELEASE on amd64 should be " "similar to:" msgstr "" "Установите файл [.filename]#build.conf# в только что созданный каталог " "сборки. Параметры конфигурации сборки для FreeBSD 7.2-RELEASE на amd64 " "должны быть примерно такими:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:176 #, no-wrap msgid "" "# SHA256 hash of RELEASE disc1.iso image.\n" "export RELH=1ea1f6f652d7c5f5eab7ef9f8edbed50cb664b08ed761850f95f48e86cc71ef5 <.>\n" "# Components of the world, source, and kernels\n" "export WORLDPARTS=\"base catpages dict doc games info manpages proflibs lib32\"\n" "export SOURCEPARTS=\"base bin contrib crypto etc games gnu include krb5 \\\n" " lib libexec release rescue sbin secure share sys tools \\\n" " ubin usbin cddl\"\n" "export KERNELPARTS=\"generic\"\n" msgstr "" "# SHA256 hash of RELEASE disc1.iso image.\n" "export RELH=1ea1f6f652d7c5f5eab7ef9f8edbed50cb664b08ed761850f95f48e86cc71ef5 <.>\n" "# Components of the world, source, and kernels\n" "export WORLDPARTS=\"base catpages dict doc games info manpages proflibs lib32\"\n" "export SOURCEPARTS=\"base bin contrib crypto etc games gnu include krb5 \\\n" " lib libexec release rescue sbin secure share sys tools \\\n" " ubin usbin cddl\"\n" "export KERNELPARTS=\"generic\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:179 #, no-wrap msgid "" "# EOL date\n" "export EOL=1275289200 <.>\n" msgstr "" "# EOL date\n" "export EOL=1275289200 <.>\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:182 msgid "" "The man:sha256[1] hash key for the desired release, is published within the " "respective link:https://www.FreeBSD.org/releases/[release announcement]." msgstr "" "Хеш-ключ man:sha256[1] для желаемого выпуска опубликован в соответствующем " "link:https://www.FreeBSD.org/releases/[анонсе выпуска]." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:183 msgid "" "To generate the \"End of Life\" number for [.filename]#build.conf#, refer to " "the \"Estimated EOL\" posted on the link:https://www.FreeBSD.org/security/" "security/[FreeBSD Security Website]. The value of `EOL` can be derived from " "the date listed on the web site, using the man:date[1] utility, for example:" msgstr "" "Для получения номера \"End of Life\" для файла [.filename]#build.conf# " "обратитесь к \"Estimated EOL\" на сайте link:https://www.FreeBSD.org/" "security/security/[FreeBSD Security Website]. Значение `EOL` можно вывести " "из даты, указанной на веб-сайте, используя утилиту man:date[1], например:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:187 #, no-wrap msgid "% date -j -f '%Y%m%d-%H%M%S' '20090401-000000' '+%s'\n" msgstr "% date -j -f '%Y%m%d-%H%M%S' '20090401-000000' '+%s'\n" #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:191 #, no-wrap msgid "Building Update Code" msgstr "Сборка кода обновления" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:196 msgid "" "The first step is to run [.filename]#scripts/make.sh#. This will build some " "binaries, create directories, and generate an RSA signing key used for " "approving builds. In this step, a passphrase will have to be supplied for " "the final creation of the signing key." msgstr "" "Первым шагом является запуск [.filename]#scripts/make.sh#. Это приведёт к " "сборке некоторых бинарных файлов, созданию каталогов и генерации RSA-ключа " "подписи, используемого для подтверждения сборок. На этом этапе потребуется " "ввести парольную фразу для окончательного создания ключа подписи." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:211 #, no-wrap msgid "" "# sh scripts/make.sh\n" "cc -O2 -fno-strict-aliasing -pipe findstamps.c -o findstamps\n" "findstamps.c: In function 'usage':\n" "findstamps.c:45: warning: incompatible implicit declaration of built-in function 'exit'\n" "cc -O2 -fno-strict-aliasing -pipe unstamp.c -o unstamp\n" "install findstamps ../bin\n" "install unstamp ../bin\n" "rm -f findstamps unstamp\n" "Generating RSA private key, 4096 bit long modulus\n" "................................................................................++\n" "...................++\n" "e is 65537 (0x10001)\n" msgstr "" "# sh scripts/make.sh\n" "cc -O2 -fno-strict-aliasing -pipe findstamps.c -o findstamps\n" "findstamps.c: In function 'usage':\n" "findstamps.c:45: warning: incompatible implicit declaration of built-in function 'exit'\n" "cc -O2 -fno-strict-aliasing -pipe unstamp.c -o unstamp\n" "install findstamps ../bin\n" "install unstamp ../bin\n" "rm -f findstamps unstamp\n" "Generating RSA private key, 4096 bit long modulus\n" "................................................................................++\n" "...................++\n" "e is 65537 (0x10001)\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:214 #, no-wrap msgid "" "Public key fingerprint:\n" "27ef53e48dc869eea6c3136091cc6ab8589f967559824779e855d58a2294de9e\n" msgstr "" "Public key fingerprint:\n" "27ef53e48dc869eea6c3136091cc6ab8589f967559824779e855d58a2294de9e\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:218 #, no-wrap msgid "" "Encrypting signing key for root\n" "enter aes-256-cbc encryption password:\n" "Verifying - enter aes-256-cbc encryption password:\n" msgstr "" "Encrypting signing key for root\n" "enter aes-256-cbc encryption password:\n" "Verifying - enter aes-256-cbc encryption password:\n" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:224 msgid "" -"Keep a note of the generated key fingerprint. This value is required in " -"[.filename]#/etc/freebsd-update.conf# for binary updates." +"Keep a note of the generated key fingerprint. This value is required in [." +"filename]#/etc/freebsd-update.conf# for binary updates." msgstr "" -"Сохраните сгенерированный отпечаток ключа. Это значение требуется в " -"[.filename]#/etc/freebsd-update.conf# для бинарных обновлений." +"Сохраните сгенерированный отпечаток ключа. Это значение требуется в [." +"filename]#/etc/freebsd-update.conf# для бинарных обновлений." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:227 msgid "At this point, we are ready to stage a build." msgstr "На этом этапе мы готовы к подготовке сборки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:232 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/init.sh amd64 7.2-RELEASE\n" msgstr "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/init.sh amd64 7.2-RELEASE\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:235 msgid "What follows is a sample of an _initial_ build run." msgstr "Ниже приведён пример _первоначальной_ сборки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:255 #, no-wrap msgid "" "# sh scripts/init.sh amd64 7.2-RELEASE\n" "Mon Aug 24 16:04:36 PDT 2009 Starting fetch for FreeBSD/amd64 7.2-RELEASE\n" "/usr/local/freebsd-update-server/work/7.2-RELE100 of 588 MB 359 kBps 00m00s\n" "Mon Aug 24 16:32:38 PDT 2009 Verifying disc1 hash for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:32:44 PDT 2009 Extracting components for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:34:05 PDT 2009 Constructing world+src image for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:35:57 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 23:36:24 UTC 2009 Building world for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:31:29 UTC 2009 Distributing world for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:32:36 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:44:44 UTC 2009 Constructing world components for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:44:56 UTC 2009 Distributing source for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:46:18 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:46:33 PDT 2009 Identifying extra documentation for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:47:13 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:47:18 PDT 2009 Indexing release for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:50:44 PDT 2009 Indexing world0 for FreeBSD/amd64 7.2-RELEASE\n" msgstr "" "# sh scripts/init.sh amd64 7.2-RELEASE\n" "Mon Aug 24 16:04:36 PDT 2009 Starting fetch for FreeBSD/amd64 7.2-RELEASE\n" "/usr/local/freebsd-update-server/work/7.2-RELE100 of 588 MB 359 kBps 00m00s\n" "Mon Aug 24 16:32:38 PDT 2009 Verifying disc1 hash for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:32:44 PDT 2009 Extracting components for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:34:05 PDT 2009 Constructing world+src image for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 16:35:57 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 23:36:24 UTC 2009 Building world for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:31:29 UTC 2009 Distributing world for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:32:36 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:44:44 UTC 2009 Constructing world components for FreeBSD/amd64 7.2-RELEASE\n" "Tue Aug 25 00:44:56 UTC 2009 Distributing source for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:46:18 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:46:33 PDT 2009 Identifying extra documentation for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:47:13 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:47:18 PDT 2009 Indexing release for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 17:50:44 PDT 2009 Indexing world0 for FreeBSD/amd64 7.2-RELEASE\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:276 #, no-wrap msgid "" "Files built but not released:\n" "Files released but not built:\n" "Files which differ by more than contents:\n" "Files which differ between release and build:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "src|sys|/sys/conf/newvers.sh\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" msgstr "" "Files built but not released:\n" "Files released but not built:\n" "Files which differ by more than contents:\n" "Files which differ between release and build:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "src|sys|/sys/conf/newvers.sh\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:280 msgid "" "Then the build of the world is performed again, with world patches. A more " "detailed explanation may be found in [.filename]#scripts/build.subr#." msgstr "" "Затем выполняется сборка world с применением патчей world. Более подробное " "объяснение можно найти в [.filename]#scripts/build.subr#." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:286 msgid "" -"During this second build cycle, the network time protocol daemon, " -"man:ntpd[8], is turned off. Per `{cperciva}`, Security Officer Emeritus of " +"During this second build cycle, the network time protocol daemon, man:" +"ntpd[8], is turned off. Per `{cperciva}`, Security Officer Emeritus of " "FreeBSD, \"the https://github.com/freebsd/freebsd-update-build/[freebsd-" "update-server] build code needs to identify timestamps which are stored in " "files so that they can be ignored when comparing builds to determine which " "files need to be updated. This timestamp-finding works by doing two builds " "400 days apart and comparing the results.\"" msgstr "" -"В течение этого второго цикла сборки демон протокола сетевого времени, " -"man:ntpd[8], отключен. По словам `{cperciva}`, почетного офицера " -"безопасности FreeBSD, \"код сборки https://github.com/freebsd/freebsd-update-" -"build/[freebsd-update-server] должен идентифицировать временные метки, " -"хранящиеся в файлах, чтобы их можно было игнорировать при сравнении сборок " -"для определения того, какие файлы нуждаются в обновлении. Этот поиск " -"временных меток работает путем выполнения двух сборок с интервалом в 400 " -"дней и сравнения результатов.\"" +"В течение этого второго цикла сборки демон протокола сетевого времени, man:" +"ntpd[8], отключен. По словам `{cperciva}`, почетного офицера безопасности " +"FreeBSD, \"код сборки https://github.com/freebsd/freebsd-update-build/" +"[freebsd-update-server] должен идентифицировать временные метки, хранящиеся " +"в файлах, чтобы их можно было игнорировать при сравнении сборок для " +"определения того, какие файлы нуждаются в обновлении. Этот поиск временных " +"меток работает путем выполнения двух сборок с интервалом в 400 дней и " +"сравнения результатов.\"" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:305 #, no-wrap msgid "" "Mon Aug 24 17:54:07 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 00:54:34 UTC 2010 Building world for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 01:49:42 UTC 2010 Distributing world for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 01:50:50 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 02:02:56 UTC 2010 Constructing world components for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 02:03:08 UTC 2010 Distributing source for FreeBSD/amd64 7.2-RELEASE\n" "Tue Sep 28 19:04:31 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:04:46 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:04:51 PDT 2009 Indexing world1 for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:08:04 PDT 2009 Locating build stamps for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:19 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:19 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:20 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 12:16:57 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 12:16:59 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.2-RELEASE\n" msgstr "" "Mon Aug 24 17:54:07 PDT 2009 Extracting world+src for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 00:54:34 UTC 2010 Building world for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 01:49:42 UTC 2010 Distributing world for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 01:50:50 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 02:02:56 UTC 2010 Constructing world components for FreeBSD/amd64 7.2-RELEASE\n" "Wed Sep 29 02:03:08 UTC 2010 Distributing source for FreeBSD/amd64 7.2-RELEASE\n" "Tue Sep 28 19:04:31 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:04:46 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:04:51 PDT 2009 Indexing world1 for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:08:04 PDT 2009 Locating build stamps for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:19 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:19 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 19:10:20 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 12:16:57 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.2-RELEASE\n" "Mon Aug 24 12:16:59 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.2-RELEASE\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:323 #, no-wrap msgid "" "Files found which include build stamps:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/include/osreldate.h\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" msgstr "" "Files found which include build stamps:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/include/osreldate.h\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:326 msgid "Finally, the build completes." msgstr "Наконец, сборка завершена." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:355 #, no-wrap msgid "" "Values of build stamps, excluding library archive headers:\n" "v1.2 (Aug 25 2009 00:40:36)\n" "v1.2 (Aug 25 2009 00:38:22)\n" "@()FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009\n" "FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009\n" " root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC\n" "7.2-RELEASE\n" "Mon Aug 24 23:55:25 UTC 2009\n" "Mon Aug 24 23:55:25 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" "Mon Aug 24 23:46:47 UTC 2009\n" "ntpq 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" " * Copyright (c) 1992-2009 The FreeBSD Project.\n" "Mon Aug 24 23:46:47 UTC 2009\n" "Mon Aug 24 23:55:40 UTC 2009\n" "Aug 25 2009\n" "ntpd 4.2.4p5-a Mon Aug 24 23:55:52 UTC 2009 (1)\n" "ntpdate 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" "ntpdc 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Mon Aug 24 23:46:47 UTC 2009\n" msgstr "" "Values of build stamps, excluding library archive headers:\n" "v1.2 (Aug 25 2009 00:40:36)\n" "v1.2 (Aug 25 2009 00:38:22)\n" "@()FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009\n" "FreeBSD 7.2-RELEASE 0: Tue Aug 25 00:38:29 UTC 2009\n" " root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC\n" "7.2-RELEASE\n" "Mon Aug 24 23:55:25 UTC 2009\n" "Mon Aug 24 23:55:25 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" " built by root@server.myhost.com on Tue Aug 25 00:16:15 UTC 2009\n" "Mon Aug 24 23:46:47 UTC 2009\n" "ntpq 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" " * Copyright (c) 1992-2009 The FreeBSD Project.\n" "Mon Aug 24 23:46:47 UTC 2009\n" "Mon Aug 24 23:55:40 UTC 2009\n" "Aug 25 2009\n" "ntpd 4.2.4p5-a Mon Aug 24 23:55:52 UTC 2009 (1)\n" "ntpdate 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" "ntpdc 4.2.4p5-a Mon Aug 24 23:55:53 UTC 2009 (1)\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Tue Aug 25 00:21:21 UTC 2009\n" "Mon Aug 24 23:46:47 UTC 2009\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:361 #, no-wrap msgid "" "FreeBSD/amd64 7.2-RELEASE initialization build complete. Please\n" "review the list of build stamps printed above to confirm that\n" "they look sensible, then run\n" " sh -e approve.sh amd64 7.2-RELEASE\n" "to sign the release.\n" msgstr "" "FreeBSD/amd64 7.2-RELEASE initialization build complete. Please\n" "review the list of build stamps printed above to confirm that\n" "they look sensible, then run\n" " sh -e approve.sh amd64 7.2-RELEASE\n" "to sign the release.\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:366 msgid "" "Approve the build if everything is correct. More information on determining " "this can be found in the distributed source file named [.filename]#USAGE#. " "Execute [.filename]#scripts/approve.sh#, as directed. This will sign the " "release, and move components into a staging area suitable for uploading." msgstr "" "Одобрите сборку, если всё правильно. Дополнительную информацию о том, как " -"это определить, можно найти в распределённом исходном файле с именем " -"[.filename]#USAGE#. Выполните [.filename]#scripts/approve.sh#, как указано. " +"это определить, можно найти в распределённом исходном файле с именем [." +"filename]#USAGE#. Выполните [.filename]#scripts/approve.sh#, как указано. " "Это подпишет релиз и переместит компоненты в промежуточную область, " "подходящую для загрузки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:371 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/mountkey.sh\n" msgstr "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/mountkey.sh\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:381 #, no-wrap msgid "" "# sh -e scripts/approve.sh amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE\n" msgstr "" "# sh -e scripts/approve.sh amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.2-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.2-RELEASE\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:384 msgid "" "After the approval process is complete, the upload procedure may be started." msgstr "После завершения процесса утверждения можно начать процедуру загрузки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:389 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/upload.sh amd64 7.2-RELEASE\n" msgstr "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/upload.sh amd64 7.2-RELEASE\n" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:394 msgid "" "In the event update code needs to be re-uploaded, this may be done by " "changing to the public distributions directory for the target release and " "updating attributes of the _uploaded_ file." msgstr "" "В случае необходимости повторной загрузки кода обновления, это можно " "сделать, перейдя в публичный каталог дистрибутивов для целевого выпуска и " "обновив атрибуты файла _uploaded_." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:399 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server/pub/7.2-RELEASE/amd64\n" "# touch -t 200801010101.01 uploaded\n" msgstr "" "# cd /usr/local/freebsd-update-server/pub/7.2-RELEASE/amd64\n" "# touch -t 200801010101.01 uploaded\n" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:406 msgid "" "The uploaded files will need to be in the document root of the webserver in " "order for updates to be distributed. The exact configuration will vary " "depending on the web server used. For the Apache web server, please refer " -"to the extref:{handbook}[Configuration of Apache servers, network-apache] " -"section in the Handbook." +"to the extref:{handbook}network-servers[Configuration of Apache servers, " +"network-apache] section in the Handbook." msgstr "" "Загруженные файлы должны находиться в корневом каталоге веб-сервера, чтобы " "обновления могли распространяться. Точная конфигурация будет зависеть от " "используемого веб-сервера. Для веб-сервера Apache обратитесь к разделу " -"extref:{handbook}[Настройка серверов Apache, network-apache] в Руководстве." +"extref:{handbook}network-servers[Настройка серверов Apache, network-apache] " +"в Руководстве." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:408 msgid "" "Update client's `KeyPrint` and `ServerName` in [.filename]#/etc/freebsd-" "update.conf#, and perform updates as instructed in the extref:{handbook}" -"[FreeBSD Update, updating-upgrading-freebsdupdate] section of the Handbook." +"cutting-edge[FreeBSD Update, updating-upgrading-freebsdupdate] section of " +"the Handbook." msgstr "" -"Обновите `KeyPrint` и `ServerName` клиента в [.filename]#/etc/freebsd-" -"update.conf# и выполните обновления, как указано в разделе extref:{handbook}" -"[Обновление FreeBSD, updating-upgrading-freebsdupdate] Руководства." +"Обновите `KeyPrint` и `ServerName` клиента в [.filename]#/etc/freebsd-update." +"conf# и выполните обновления, как указано в разделе extref:{handbook}cutting-" +"edge[Обновление FreeBSD, updating-upgrading-freebsdupdate] Руководства." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:414 msgid "" "In order for FreeBSD Update Server to work properly, updates for both the " "_current_ release and the release _one wants to upgrade to_ need to be " "built. This is necessary for determining the differences of files between " "releases. For example, when upgrading a FreeBSD system from 7.1-RELEASE to " "7.2-RELEASE, updates will need to be built and uploaded to your distribution " "server for both versions." msgstr "" "Для корректной работы сервера обновлений FreeBSD Update необходимо собирать " "обновления как для текущего релиза, так и для релиза, _на который " "планируется обновление_. Это необходимо для определения различий в файлах " "между релизами. Например, при обновлении системы FreeBSD с 7.1-RELEASE до " "7.2-RELEASE потребуется собрать и загрузить на сервер распространения " "обновления для обеих версий." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:417 msgid "" "For reference, the entire run of link:../../source/articles/freebsd-update-" "server/init.txt[init.sh] is attached." msgstr "" "Для справки, полный текст выполнения link:../../source/articles/freebsd-" "update-server/init.txt[init.sh] прилагается." #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:419 #, no-wrap msgid "Building a Patch" msgstr "Построение патча" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:422 msgid "" "Every time a link:https://www.FreeBSD.org/security/advisories/[security " "advisory] or link:https://www.FreeBSD.org/security/notices/[security notice] " "is announced, a patch update can be built." msgstr "" "Каждый раз, когда объявляется link:https://www.FreeBSD.org/security/" -"advisories/[консультативный документ по безопасности] или link:https://" -"www.FreeBSD.org/security/notices/[уведомление о безопасности], можно собрать " +"advisories/[консультативный документ по безопасности] или link:https://www." +"FreeBSD.org/security/notices/[уведомление о безопасности], можно собрать " "обновление с исправлением." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:424 msgid "For this example, 7.1-RELEASE will be used." msgstr "Для этого примера будет использоваться версия 7.1-RELEASE." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:426 msgid "A couple of assumptions are made for a different release build:" msgstr "Несколько предположений сделано для другой сборки выпуска:" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:428 msgid "Setup the correct directory structure for the initial build." msgstr "Настройка правильной структуры каталогов для первоначальной сборки." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:429 msgid "Perform an initial build for 7.1-RELEASE." msgstr "Выполните первоначальную сборку для 7.1-RELEASE." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:431 msgid "" "Create the patch directory of the respective release under [.filename]#/usr/" "local/freebsd-update-server/patches/#." msgstr "" "Создайте каталог с патчами соответствующего выпуска в [.filename]#/usr/local/" "freebsd-update-server/patches/#." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:436 #, no-wrap msgid "" "% mkdir -p /usr/local/freebsd-update-server/patches/7.1-RELEASE/\n" "% cd /usr/local/freebsd-update-server/patches/7.1-RELEASE\n" msgstr "" "% mkdir -p /usr/local/freebsd-update-server/patches/7.1-RELEASE/\n" "% cd /usr/local/freebsd-update-server/patches/7.1-RELEASE\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:441 msgid "" "As an example, take the patch for man:named[8]. Read the advisory, and grab " "the necessary file from link:https://www.FreeBSD.org/security/advisories/" "[FreeBSD Security Advisories]. More information on interpreting the " -"advisory, can be found in the extref:{handbook}[FreeBSD Handbook, security-" -"advisories]." +"advisory, can be found in the extref:{handbook}security[FreeBSD Handbook, " +"security-advisories]." msgstr "" "В качестве примера возьмем патч для man:named[8]. Прочтите рекомендации и " "загрузите необходимый файл с link:https://www.FreeBSD.org/security/" "advisories/[FreeBSD Security Advisories]. Дополнительную информацию о том, " -"как интерпретировать рекомендации, можно найти в extref:{handbook}[FreeBSD " -"Handbook, security-advisories]." +"как интерпретировать рекомендации, можно найти в extref:{handbook}security[" +"FreeBSD Handbook, security-advisories]." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:446 msgid "" -"In the https://security.freebsd.org/advisories/FreeBSD-" -"SA-09:12.bind.asc[security brief], this advisory is called `SA-09:12.bind`. " -"After downloading the file, it is required to rename the file to an " -"appropriate patch level. It is suggested to keep this consistent with " -"official FreeBSD patch levels, but its name may be freely chosen. For this " -"build, let us follow the currently established practice of FreeBSD and call " -"this `p7`. Rename the file:" +"In the https://security.freebsd.org/advisories/FreeBSD-SA-09:12.bind." +"asc[security brief], this advisory is called `SA-09:12.bind`. After " +"downloading the file, it is required to rename the file to an appropriate " +"patch level. It is suggested to keep this consistent with official FreeBSD " +"patch levels, but its name may be freely chosen. For this build, let us " +"follow the currently established practice of FreeBSD and call this `p7`. " +"Rename the file:" msgstr "" "В https://security.freebsd.org/advisories/FreeBSD-SA-09:12.bind.asc[кратком " "обзоре безопасности] этот совет называется `SA-09:12.bind`. После загрузки " "файла необходимо переименовать его в соответствии с уровнем исправления. " "Рекомендуется сохранять это в соответствии с официальными уровнями " "исправлений FreeBSD, но имя может быть выбрано свободно. Для данной сборки " "давайте последуем текущей установленной практике FreeBSD и назовем его `p7`. " "Переименуйте файл:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:450 #, no-wrap msgid "% cd /usr/local/freebsd-update-server/patches/7.1-RELEASE/; mv bind.patch 7-SA-09:12.bind\n" msgstr "% cd /usr/local/freebsd-update-server/patches/7.1-RELEASE/; mv bind.patch 7-SA-09:12.bind\n" #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:456 msgid "" "When running a patch level build, it is assumed that previous patches are in " "place. When a patch build is run, it will run all patches contained in the " "patch directory." msgstr "" "При выполнении сборки уровня патча предполагается, что предыдущие патчи уже " "установлены. При запуске сборки патча будут выполнены все патчи, " "содержащиеся в каталоге патчей." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:458 msgid "" "There can be custom patches added to any build. Use the number zero, or any " "other number." msgstr "" "В сборку могут быть добавлены пользовательские патчи. Используйте ноль или " "любое другое число." #. type: delimited block = 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:464 msgid "" "It is up to the administrator of the FreeBSD Update Server to take " "appropriate measures to verify the authenticity of every patch." msgstr "" "Задача администратора сервера FreeBSD Update — принимать соответствующие " "меры для проверки подлинности каждого патча." #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:468 msgid "" "At this point, a _diff_ is ready to be built. The software checks first to " "see if a [.filename]#scripts/init.sh# has been run on the respective release " "prior to running the diff build." msgstr "" "На этом этапе _diff_ готов к сборке. Программное обеспечение сначала " "проверяет, был ли запущен [.filename]#scripts/init.sh# для соответствующего " "выпуска перед выполнением сборки diff." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:473 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/diff.sh amd64 7.1-RELEASE 7\n" msgstr "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/diff.sh amd64 7.1-RELEASE 7\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:476 msgid "What follows is a sample of a _differential_ build run." msgstr "Вот пример выполнения _дифференциальной_ сборки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:550 #, no-wrap msgid "" "# sh -e scripts/diff.sh amd64 7.1-RELEASE 7\n" "Wed Aug 26 10:09:59 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 17:10:25 UTC 2009 Building world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:05:11 UTC 2009 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:06:16 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:17:50 UTC 2009 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:18:02 UTC 2009 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:23 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:37 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:42 PDT 2009 Indexing world0 for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:23:02 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 18:23:29 UTC 2010 Building world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:18:15 UTC 2010 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:19:18 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:30:52 UTC 2010 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:31:03 UTC 2010 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 12:32:25 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:32:39 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:32:43 PDT 2009 Indexing world1 for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:35:54 PDT 2009 Locating build stamps for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:36:58 PDT 2009 Reverting changes due to build stamps for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:14 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:14 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:15 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:43:23 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:43:25 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.1-RELEASE-p7\n" "...\n" "Files found which include build stamps:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/include/osreldate.h\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" "Values of build stamps, excluding library archive headers:\n" "v1.2 (Aug 26 2009 18:13:46)\n" "v1.2 (Aug 26 2009 18:11:44)\n" "@()FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009\n" "FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009\n" " root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC\n" "7.1-RELEASE-p7\n" "Wed Aug 26 17:29:15 UTC 2009\n" "Wed Aug 26 17:29:15 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" "Wed Aug 26 17:20:39 UTC 2009\n" "ntpq 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" " * Copyright (c) 1992-2009 The FreeBSD Project.\n" "Wed Aug 26 17:20:39 UTC 2009\n" "Wed Aug 26 17:29:30 UTC 2009\n" "Aug 26 2009\n" "ntpd 4.2.4p5-a Wed Aug 26 17:29:41 UTC 2009 (1)\n" "ntpdate 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" "ntpdc 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:20:39 UTC 2009\n" "...\n" msgstr "" "# sh -e scripts/diff.sh amd64 7.1-RELEASE 7\n" "Wed Aug 26 10:09:59 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 17:10:25 UTC 2009 Building world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:05:11 UTC 2009 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:06:16 UTC 2009 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:17:50 UTC 2009 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 18:18:02 UTC 2009 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:23 PDT 2009 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:37 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:19:42 PDT 2009 Indexing world0 for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 11:23:02 PDT 2009 Extracting world+src for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 18:23:29 UTC 2010 Building world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:18:15 UTC 2010 Distributing world for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:19:18 UTC 2010 Building and distributing kernels for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:30:52 UTC 2010 Constructing world components for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 19:31:03 UTC 2010 Distributing source for FreeBSD/amd64 7.1-RELEASE-p7\n" "Thu Sep 30 12:32:25 PDT 2010 Moving components into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:32:39 PDT 2009 Extracting extra docs for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:32:43 PDT 2009 Indexing world1 for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:35:54 PDT 2009 Locating build stamps for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:36:58 PDT 2009 Reverting changes due to build stamps for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:14 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:14 PDT 2009 Preparing to copy files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:37:15 PDT 2009 Copying data files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:43:23 PDT 2009 Copying metadata files into staging area for FreeBSD/amd64 7.1-RELEASE-p7\n" "Wed Aug 26 12:43:25 PDT 2009 Constructing metadata index and tag for FreeBSD/amd64 7.1-RELEASE-p7\n" "...\n" "Files found which include build stamps:\n" "kernel|generic|/GENERIC/hptrr.ko\n" "kernel|generic|/GENERIC/kernel\n" "world|base|/boot/loader\n" "world|base|/boot/pxeboot\n" "world|base|/etc/mail/freebsd.cf\n" "world|base|/etc/mail/freebsd.submit.cf\n" "world|base|/etc/mail/sendmail.cf\n" "world|base|/etc/mail/submit.cf\n" "world|base|/lib/libcrypto.so.5\n" "world|base|/usr/bin/ntpq\n" "world|base|/usr/include/osreldate.h\n" "world|base|/usr/lib/libalias.a\n" "world|base|/usr/lib/libalias_cuseeme.a\n" "world|base|/usr/lib/libalias_dummy.a\n" "world|base|/usr/lib/libalias_ftp.a\n" "...\n" "Values of build stamps, excluding library archive headers:\n" "v1.2 (Aug 26 2009 18:13:46)\n" "v1.2 (Aug 26 2009 18:11:44)\n" "@()FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009\n" "FreeBSD 7.1-RELEASE-p7 0: Wed Aug 26 18:11:50 UTC 2009\n" " root@server.myhost.com:/usr/obj/usr/src/sys/GENERIC\n" "7.1-RELEASE-p7\n" "Wed Aug 26 17:29:15 UTC 2009\n" "Wed Aug 26 17:29:15 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" " built by root@server.myhost.com on Wed Aug 26 17:49:58 UTC 2009\n" "Wed Aug 26 17:20:39 UTC 2009\n" "ntpq 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" " * Copyright (c) 1992-2009 The FreeBSD Project.\n" "Wed Aug 26 17:20:39 UTC 2009\n" "Wed Aug 26 17:29:30 UTC 2009\n" "Aug 26 2009\n" "ntpd 4.2.4p5-a Wed Aug 26 17:29:41 UTC 2009 (1)\n" "ntpdate 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" "ntpdc 4.2.4p5-a Wed Aug 26 17:29:42 UTC 2009 (1)\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:55:02 UTC 2009\n" "Wed Aug 26 17:20:39 UTC 2009\n" "...\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:553 msgid "Updates are printed, and approval is requested." msgstr "Обновления выводятся на экран, и запрашивается подтверждение." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:572 #, no-wrap msgid "" "New updates:\n" "kernel|generic|/GENERIC/kernel.symbols|f|0|0|0555|0|7c8dc176763f96ced0a57fc04e7c1b8d793f27e006dd13e0b499e1474ac47e10|\n" "kernel|generic|/GENERIC/kernel|f|0|0|0555|0|33197e8cf15bbbac263d17f39c153c9d489348c2c534f7ca1120a1183dec67b1|\n" "kernel|generic|/|d|0|0|0755|0||\n" "src|base|/|d|0|0|0755|0||\n" "src|bin|/|d|0|0|0755|0||\n" "src|cddl|/|d|0|0|0755|0||\n" "src|contrib|/contrib/bind9/bin/named/update.c|f|0|10000|0644|0|4d434abf0983df9bc47435670d307fa882ef4b348ed8ca90928d250f42ea0757|\n" "src|contrib|/contrib/bind9/lib/dns/openssldsa_link.c|f|0|10000|0644|0|c6805c39f3da2a06dd3f163f26c314a4692d4cd9a2d929c0acc88d736324f550|\n" "src|contrib|/contrib/bind9/lib/dns/opensslrsa_link.c|f|0|10000|0644|0|fa0f7417ee9da42cc8d0fd96ad24e7a34125e05b5ae075bd6e3238f1c022a712|\n" "...\n" "FreeBSD/amd64 7.1-RELEASE update build complete. Please review\n" "the list of build stamps printed above and the list of updated\n" "files to confirm that they look sensible, then run\n" " sh -e approve.sh amd64 7.1-RELEASE\n" "to sign the build.\n" msgstr "" "New updates:\n" "kernel|generic|/GENERIC/kernel.symbols|f|0|0|0555|0|7c8dc176763f96ced0a57fc04e7c1b8d793f27e006dd13e0b499e1474ac47e10|\n" "kernel|generic|/GENERIC/kernel|f|0|0|0555|0|33197e8cf15bbbac263d17f39c153c9d489348c2c534f7ca1120a1183dec67b1|\n" "kernel|generic|/|d|0|0|0755|0||\n" "src|base|/|d|0|0|0755|0||\n" "src|bin|/|d|0|0|0755|0||\n" "src|cddl|/|d|0|0|0755|0||\n" "src|contrib|/contrib/bind9/bin/named/update.c|f|0|10000|0644|0|4d434abf0983df9bc47435670d307fa882ef4b348ed8ca90928d250f42ea0757|\n" "src|contrib|/contrib/bind9/lib/dns/openssldsa_link.c|f|0|10000|0644|0|c6805c39f3da2a06dd3f163f26c314a4692d4cd9a2d929c0acc88d736324f550|\n" "src|contrib|/contrib/bind9/lib/dns/opensslrsa_link.c|f|0|10000|0644|0|fa0f7417ee9da42cc8d0fd96ad24e7a34125e05b5ae075bd6e3238f1c022a712|\n" "...\n" "FreeBSD/amd64 7.1-RELEASE update build complete. Please review\n" "the list of build stamps printed above and the list of updated\n" "files to confirm that they look sensible, then run\n" " sh -e approve.sh amd64 7.1-RELEASE\n" "to sign the build.\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:575 msgid "Follow the same process as noted before for approving a build:" msgstr "Следуйте той же процедуре, что и ранее, для подтверждения сборки:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:584 #, no-wrap msgid "" "# sh -e scripts/approve.sh amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE\n" msgstr "" "# sh -e scripts/approve.sh amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Signing build for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to patch source directories for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:06 PDT 2009 Copying files to upload staging area for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Updating databases for FreeBSD/amd64 7.1-RELEASE\n" "Wed Aug 26 12:50:07 PDT 2009 Cleaning staging area for FreeBSD/amd64 7.1-RELEASE\n" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:590 #, no-wrap msgid "" "The FreeBSD/amd64 7.1-RELEASE update build has been signed and is\n" "ready to be uploaded. Remember to run\n" " sh -e umountkey.sh\n" "to unmount the decrypted key once you have finished signing all\n" "the new builds.\n" msgstr "" "The FreeBSD/amd64 7.1-RELEASE update build has been signed and is\n" "ready to be uploaded. Remember to run\n" " sh -e umountkey.sh\n" "to unmount the decrypted key once you have finished signing all\n" "the new builds.\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:593 msgid "After approving the build, upload the software:" msgstr "После утверждения сборки загрузите программное обеспечение:" #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:598 #, no-wrap msgid "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/upload.sh amd64 7.1-RELEASE\n" msgstr "" "# cd /usr/local/freebsd-update-server\n" "# sh scripts/upload.sh amd64 7.1-RELEASE\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:601 msgid "" "For reference, the entire run of link:../../source/articles/freebsd-update-" "server/diff.txt[diff.sh] is attached." msgstr "" "Для справки, полный запуск скрипта link:../../source/articles/freebsd-update-" "server/diff.txt[diff.sh] прилагается." #. type: Title == #: documentation/content/en/articles/freebsd-update-server/_index.adoc:603 #, no-wrap msgid "Tips" msgstr "Советы" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:606 msgid "" "If a custom release is built using the native `make release` extref:{releng}" "[procedure, release-build], freebsd-update-server code will work from your " "release. As an example, a release without ports or documentation can be " "built by clearing functionality pertaining to documentation subroutines " "`findextradocs ()`, `addextradocs ()` and altering the download location in " "`fetchiso ()`, respectively, in [.filename]#scripts/build.subr#. As a last " "step, change the man:sha256[1] hash in [.filename]#build.conf# under your " "respective release and architecture and you are ready to build off your " "custom release." msgstr "" "Если пользовательская сборка создана с использованием стандартной процедуры " "`make release` extref:{releng}[procedure, release-build], код freebsd-update-" "server будет работать с вашей сборкой. Например, сборка без портов или " "документации может быть создана путем отключения функциональности, " "относящейся к подпрограммам документации `findextradocs ()`, `addextradocs " -"()`, и изменения места загрузки в `fetchiso ()` соответственно в файле " -"[.filename]#scripts/build.subr#. В завершение измените хеш man:sha256[1] в " +"()`, и изменения места загрузки в `fetchiso ()` соответственно в файле [." +"filename]#scripts/build.subr#. В завершение измените хеш man:sha256[1] в " "файле [.filename]#build.conf# для соответствующей сборки и архитектуры, " "после чего можно приступать к сборке вашей пользовательской версии." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:617 #, no-wrap msgid "" "# Compare ${WORKDIR}/release and ${WORKDIR}/$1, identify which parts\n" "# of the world|doc subcomponent are missing from the latter, and\n" "# build a tarball out of them.\n" "findextradocs () {\n" "}\n" "# Add extra docs to ${WORKDIR}/$1\n" "addextradocs () {\n" "}\n" msgstr "" "# Compare ${WORKDIR}/release and ${WORKDIR}/$1, identify which parts\n" "# of the world|doc subcomponent are missing from the latter, and\n" "# build a tarball out of them.\n" "findextradocs () {\n" "}\n" "# Add extra docs to ${WORKDIR}/$1\n" "addextradocs () {\n" "}\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:620 msgid "" -"Adding `-j _NUMBER_` flags to `buildworld` and `obj` targets in the " -"[.filename]#scripts/build.subr# script may speed up processing depending on " +"Adding `-j _NUMBER_` flags to `buildworld` and `obj` targets in the [." +"filename]#scripts/build.subr# script may speed up processing depending on " "the hardware used, however it is not necessary. Using these flags in other " "targets is not recommended, as it may cause the build to become unreliable." msgstr "" -"Добавление флагов `-j _ЧИСЛО_` к целям `buildworld` и `obj` в скрипте " -"[.filename]#scripts/build.subr# может ускорить обработку в зависимости от " +"Добавление флагов `-j _ЧИСЛО_` к целям `buildworld` и `obj` в скрипте [." +"filename]#scripts/build.subr# может ускорить обработку в зависимости от " "используемого оборудования, однако это не обязательно. Использование этих " "флагов в других целях не рекомендуется, так как это может привести к " "ненадёжности сборки." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:632 #, no-wrap msgid "" " # Build the world\n" "\t\t log \"Building world\"\n" "\t\t cd /usr/src &&\n" "\t\t make -j 2 ${COMPATFLAGS} buildworld 2>&1\n" "\t\t# Distribute the world\n" "\t\t log \"Distributing world\"\n" "\t\t cd /usr/src/release &&\n" "\t\t make -j 2 obj &&\n" "\t\t make ${COMPATFLAGS} release.1 release.2 2>&1\n" msgstr "" " # Build the world\n" "\t\t log \"Building world\"\n" "\t\t cd /usr/src &&\n" "\t\t make -j 2 ${COMPATFLAGS} buildworld 2>&1\n" "\t\t# Distribute the world\n" "\t\t log \"Distributing world\"\n" "\t\t cd /usr/src/release &&\n" "\t\t make -j 2 obj &&\n" "\t\t make ${COMPATFLAGS} release.1 release.2 2>&1\n" #. type: Plain text #: documentation/content/en/articles/freebsd-update-server/_index.adoc:635 msgid "" -"Create an appropriate extref:{handbook}[DNS, network-dns] SRV record for the " -"update server, and put others behind it with variable weights. Using this " -"facility will provide update mirrors, however this tip is not necessary " -"unless you wish to provide a redundant service." +"Create an appropriate extref:{handbook}network-servers[DNS, network-dns] SRV " +"record for the update server, and put others behind it with variable " +"weights. Using this facility will provide update mirrors, however this tip " +"is not necessary unless you wish to provide a redundant service." msgstr "" -"Создайте соответствующий extref:{handbook}[DNS, network-dns] SRV-запись для " -"сервера обновлений и разместите остальные за ним с переменными весами. " -"Использование этой возможности обеспечит зеркала для обновлений, однако " -"данный совет не обязателен, если вы не хотите предоставлять избыточный " -"сервис." +"Создайте соответствующий extref:{handbook}network-servers[DNS, network-dns] " +"SRV-запись для сервера обновлений и разместите остальные за ним с " +"переменными весами. Использование этой возможности обеспечит зеркала для " +"обновлений, однако данный совет не обязателен, если вы не хотите " +"предоставлять избыточный сервис." #. type: delimited block . 4 #: documentation/content/en/articles/freebsd-update-server/_index.adoc:641 #, no-wrap msgid "" "_http._tcp.update.myserver.com.\t\tIN SRV 0 2 80 host1.myserver.com.\n" "\t\t\t\t\tIN SRV 0 1 80 host2.myserver.com.\n" "\t\t\t\t\tIN SRV 0 0 80 host3.myserver.com.\n" msgstr "" "_http._tcp.update.myserver.com.\t\tIN SRV 0 2 80 host1.myserver.com.\n" "\t\t\t\t\tIN SRV 0 1 80 host2.myserver.com.\n" "\t\t\t\t\tIN SRV 0 0 80 host3.myserver.com.\n" diff --git a/documentation/content/ru/articles/geom-class/_index.adoc b/documentation/content/ru/articles/geom-class/_index.adoc index a7940ade06..c5575c9087 100644 --- a/documentation/content/ru/articles/geom-class/_index.adoc +++ b/documentation/content/ru/articles/geom-class/_index.adoc @@ -1,362 +1,362 @@ --- authors: - author: 'Ivan Voras' email: ivoras@FreeBSD.org description: 'Руководство по внутреннему устройству GEOM и созданию собственного класса GEOM' tags: ["GEOM", "kernel", "modules", "FreeBSD"] title: 'Создание класса GEOM' trademarks: ["freebsd", "intel", "general"] --- = Создание класса GEOM :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/geom-class/ 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] Аннотация Эта статья документирует некоторые начальные выкладки в разработке GEOM-классов, а также модулей ядра в общем. Предполагается, что читатель близко знаком с программированием на Си в контексте пространства пользовательских процессов (userland). ''' toc::[] [[intro]] == Введение [[intro-docs]] === Documentation Документация по программированию для ядра скудная, это одна из немногих областей программирования, где почти нет хороших учебных пособий, и совет "читай исходники!" - сохраняет свою справедливость. Однако, существует несколько статей и книг разной актуальности, которые рекомендуются к изучению перед тем, как начать программировать: * extref:{developers-handbook}[Руководство FreeBSD для разработчиков] - часть Проекта Документации FreeBSD, ничего специфичного о программировании ядра в нем нет, зато есть немного общей полезной информации. * extref:{arch-handbook}[Руководство по Архитектуре FreeBSD] - также является частью Проекта Документации FreeBSD, содержит описания некоторых низкоуровневых средств и процедур. Уделите внимание разделу номер 13 - extref:{arch-handbook}[Написание драйверов устройств для FreeBSD, driverbasics]. * Несколько интересных статей об устройстве ядра можно найти на сайте http://www.freebsddiary.com[FreeBSD Diary]. * Страницы из раздела номер 9 системного справочника, содержат важную документацию по функциям ядра. * Страница справочника man:geom[4], а также http://phk.freebsd.dk/pubs/[слайды Пола-Хеннинга Кампа ] - общее представление о подсистеме GEOM. * Страницы справочника man:g_bio[9], man:g_event[9], man:g_data[9], man:g_geom[9], man:g_provider[9], man:g_consumer[9], man:g_access[9], а также другие, связанные с вышеупомянутыми и раскрывающие специфический функционал подсистемы GEOM. * Страница справочника man:style[9] - документирует соглашения о стиле оформления кода, которые обязаны быть соблюдены если вы планируете передать ваш код в Subversion репозиторий FreeBSD. [[prelim]] == Подготовка Для того, чтоб заниматься разработками для ядра, желательно иметь два отдельных компьютера. Один из них предназначен для среды разработки и исходных кодов, а второй - для запуска тестов отлаживаемого кода. Второму компьютеру для работы достаточно иметь возможность выполнять начальную загрузку по сети и монтирование файловых систем по сети. В этой ситуации, если отлаживаемый код содержит ошибки и вызовет аварийную остановку системы, то это не повлечет порчу или утерю исходного кода . Второму компьютеру даже не потребуется иметь свой монитор, достаточно будет соединения асинхронных портов кабелем RS-232 или соединения при помощи KVM-устройства. Но так как далеко не у каждого есть два или более компьютеров под рукой, есть пара способов подготовить иную "живую" систему для разработки кода для ядра. Один из них - это разработка в http://www.vmware.com/[VMWare] или http://www.qemu.org/[QEmu] виртуальной машине (это лучшее из доступного, после, конечно-же, выделенного для тестов компьютера). [[prelim-system]] === Настройка системы для разработки Прежде всего необходимо иметь в ядре поддержку `INVARIANTS`. Добавьте следующие строки в файл конфигурации ядра: [.programlisting] .... options INVARIANT_SUPPORT options INVARIANTS .... Для большей информативности при отладке включите поддержку WITNESS, которая будет предупреждать вас в случае возникновения взаимоблокировок: [.programlisting] .... options WITNESS_SUPPORT options WITNESS .... Также включите отладочные символы, если планируете выполнять отладку по дампам аварийных отказов: [.programlisting] .... makeoptions DEBUG=-g .... Установка отладочного ядра обычным способом (`make installkernel`) не даст привычного результата: файл ядра будет называться [.filename]#kernel.debug# и будет находиться в [.filename]#/usr/obj/usr/src/sys/KERNELNAME/#. Для удобства, отладочное ядро необходимо скопировать в [.filename]#/boot/kernel/#. Также удобно иметь включенный отладчик ядра, так вы сможете исследовать паники сразу-же после их возникновения. Для включения отладчика добавьте следующие строки в файл конфигурации ядра: [.programlisting] .... options KDB options DDB options KDB_TRACE .... Для автоматического запуска отладчика ядра после возникновения паники может понадобиться установить переменную sysctl: [.programlisting] .... debug.debugger_on_panic=1 .... Паники системы будут происходить, поэтому уделите внимание кэшу файловой системы. Обычно, при включенном механизме softupdates, последняя версия файла может быть утеряна если паника произошла раньше сбрасывания кэша на устройство хранения. Выключение механизма softupdates (посредством монтирования файловой системы с опцией "sync") значительно сказывается на производительности и, опять-же, не гарантирует целостности данных. Как компромисс, можно сократить задержки сбрасывания кэша механизма softupdates. Есть три переменных sysctl, значения которых необходимо изменить (лучше всего - прописав их в [.filename]#/etc/sysctl.conf#): [.programlisting] .... kern.filedelay=5 kern.dirdelay=4 kern.metadelay=3 .... Значения этих переменных - секунды. Для отладки паник ядра необходимы дампы памяти. Так как паника ядра может "сломать" файловую систему, дамп сначала сохраняется в "сырой" раздел. Обычно, это своп-раздел. Поэтому, размер своп-раздела должен быть не меньше размера ОЗУ компьютера. При последующей загрузке дамп копируется в обычный файл. Это происходит сразу-же после проверки и монтирования файловых систем, но перед активированием раздела свопа. Такое поведение контролируется следующими переменными [.filename]#/etc/rc.conf#: [.programlisting] .... dumpdev="/dev/ad0s4b" -dumpdir="/usr/core +dumpdir="/usr/core" .... Переменная `dumpdev` указывает на раздел подкачки, а `dumpdir` сообщает системе куда перемещать дамп ядра при следующей загрузке. Сохранение дампа ядра - процесс медленный, и, если у вашего компьютера много оперативной памяти (>256M) и если паники случаются часто, то ожидание сохранения дампов может начать раздражать (вспомним, что над дампом происходит две операции: сохранение в своп-файл и перемещение на файловую систему). В таком случае может оказаться удобным ограничивание объема используемой системой памяти путем установки переменной в [.filename]#/boot/loader.conf#: [.programlisting] .... hw.physmem="256M" .... Если паники случаются часто и размер файловых систем большой (или же вы просто не доверяете softupdates и фоновой проверке файловых систем), рекомендуется отключить фоновую проверку файловых систем посредством установки переменной в [.filename]#/etc/rc.conf#: [.programlisting] .... background_fsck="NO" .... В этом случае файловые системы будут проверяться только при необходимости. Также заметьте, что в случае использования фоновой проверки, новая паника может случиться в то время, когда проверяются диски. Другими словами, наиболее безопасный способ - не иметь много локальных файловых систем, а использовать второй компьютер в качестве NFS-сервера. [[prelim-starting]] === Начало проекта Для написания нового класса GEOM необходимо создать поддиректорию в любой доступной пользователю директории. Совсем не обязательно, чтоб ваш модуль изначально размещался в [.filename]#/usr/src#. [[prelim-makefile]] === Makefile Правилом хорошего тона является создание [.filename]#Makefile#-ов для каждого нетривиального проекта, примером которого конечно-же является создание модулей ядра. Создание [.filename]#Makefile# - дело не сложное благодаря исчерпывающему набору вспомогательных средств, предоставляемых системой. В вкратце, вот как должен выглядеть [.filename]#Makefile# для модуля ядра: [.programlisting] .... SRCS=g_journal.c KMOD=geom_journal .include .... Этот [.filename]#Makefile# (с измененными именами файлов) подойдет к любому модулю ядра. Класс GEOM может размещаться в одном единственном модуле ядра. Если для сборки вашего модуля требуется больше, чем один файл, то перечислите их имена, разделенные пробельными символами, в переменной `SRCS`. [[kernelprog]] == Программирование в ядре FreeBSD [[kernelprog-memalloc]] === Выделение памяти Прочитайте man:malloc[9] - выделение памяти лишь немного отличается от своего эквивалента, используемого в пространстве пользовательских процессов (userland). Наиболее приметно то, что `malloc`() и `free`() принимают дополнительные параметры, которые описаны в странице справочника. Тип "malloc_type" необходимо объявить в секции деклараций файла с исходным кодом, например: [.programlisting] .... static MALLOC_DEFINE(M_GJOURNAL, "gjournal data", "GEOM_JOURNAL Data"); .... Для того, чтобы можно было использовать этот макрос, необходимо включить следующие заголовочные файлы: [.filename]#sys/param.h#, [.filename]#sys/kernel.h# и [.filename]#sys/malloc.h#. Существует еще один механизм выделения памяти - UMA (Universal Memory Allocator), описанный в man:uma[9]. Это специфический метод, преимущественно предназначенный для быстрого выделения памяти под списки, состоящие из элементов одинакового размера (например, динамические массивы структур). [[kernelprog-lists]] === Очереди и списки Ознакомьтесь с man:queue[3] Во множестве случаев вам необходимо будет организовывать и управлять такой структурой данных, как списки. К счастью, эта структура данных реализована несколькими способами в виде макросов на Си, а также включена в систему. Наиболее гибкий и часто употребляемый тип списка - TAILQ. Этот тип списка также один из наиболее требовательных к памяти (его элементы - с двойными связями), а также - наиболее медленный (однако счет идет на несколько инструкций ЦПУ, поэтому последнее утверждение не следует воспринимать в всерьез). Если важна скорость получения данных, то возьмите на вооружение man:tree[3] и man:hashinit[9]. [[kernelprog-bios]] === BIOs Структура `bio` используется для всех операций ввода/вывода, касающихся GEOM. Она содержит информацию о том, какое устройство ('поставщик geom') должно ответить на запрос, тип запроса, смещение, длину и указатель на буфер, а также набор "определенных пользователем" флагов и полей . Важным моментом является то, что `bio` обрабатываются асинхронно. Это значит, что во многих частях кода нет аналога к man:read[2] и man:write[2] функциям из пространства пользовательских процессов, которые не возвращают управление пока не выполнится системный вызов. Скорее, по завершении обработки запроса (или в случае ошибки при обработке) как извещение вызывается определенная пользователем функция. Асинхронная модель программирования в чем-то сложней, нежели чаще используемая императивная модель, используемая в пространстве пользовательских процессов; в любом случае, привыкание займет некоторое время. В некоторых случаях могут быть использованы вспомогательные функции `g_write_data`() и `g_read_data`(), но __далеко не всегда__. В частности, эти функции не могут использоваться когда захвачен мьютекс; например, мьютекс GEOM-топологии или внутренний мьютекс, удерживаемый в ходе выполнения `.start`() или `.stop`(). [[geom]] == Программирование в системе GEOM [[geom-ggate]] === Ggate Если максимальная производительность не требуется, то более простой способ совершать преобразования данных - это выполнять их в пространстве пользовательских процессов посредством ggate (GEOM gate). К недостаткам следует отнести невозможность простого переноса кода в ядро. [[geom-class]] === Класс GEOM Класс GEOM выполняет преобразования данных. Эти преобразования могут быть скомпонованы друг с другом в виде дерева. Экземпляр класса GEOM называют __geom__. В каждом классе GEOM есть несколько "методов класса", которые вызываются когда экземпляра класса нет в наличии (или же они не привязаны к конкретному экземпляру класса): * `.init` вызывается тогда, когда системе GEOM становится известно о классе GEOM (например, когда загружается модуль ядра). * `.fini` будет вызван в случае отказа GEOM системы от класса (например, при выгрузке модуля) * `.taste` вызывается, когда в системе появляется новый класс или поставщик geom ("provider"). Если соответствие найдено, то эта функция обычно создает и запускает экземпляр geom. * `.destroy_geom` вызывается при необходимости разрушить экземпляр geom * `.ctlconf` будет вызван, когда пользователь запросит изменение конфигурации существующего экземпляра geom Также определены функции событий GEOM, которые копируются в экземпляр geom. Поле `.geom` в структуре `g_class` - это список (LIST) экземпляров geom, реализованных из класса. Эти функции вызываются из g_event потока ядра. [[geom-softc]] === Softc "softc" - это устаревший термин для "приватных данных драйвера" ("driver private data"). Название вероятней всего происходит от устаревшего термина "software control block". В системе GEOM softc это структура (точнее: указатель на структуру) которая может быть присоединена к экземпляру geom и может содержать приватные данные экземпляра. У большинства классов GEOM есть следующие члены: * `struct g_provider *provider` : "поставщик geom" предоставляемый данным экземпляром geom * `uint16_t n_disks` : Количество потребителей geom ("consumer"), обслуживаемых данным экземпляром geom * `struct g_consumer \**disks` : Массив `struct g_consumer*`. (Невозможно обойтись одинарным указателем, потому что система GEOM создает для нас структуры struct g_consumer). Структура `softc` содержит состояние экземпляра geom. У каждого экземпляра есть свой softc. [[geom-metadata]] === Метаданные Формат метаданных в той или иной мере зависит от конкретного класса, но _обязан_ начинаться с: * 16-байтного буфера для подписи - строки с завершающим нулем (обычно это имя класса) * uint32 идентификатора версии Подразумевается, что классы geom знают как обращаться с метаданными с идентификаторами версий ниже, чем их собственные. Метаданные размещаются в последнем секторе поставщика geom (поэтому обязаны целиком умещаться в нем). (Все это зависит от реализации, но весь существующий код работает подобно описанному и поддерживается библиотеками.) [[geom-creating]] === Маркирование/создание экземпляра geom Последовательность событий следующая: * пользователь запускает служебную программу man:geom[8] * программа решает каким классом geom ей придется управлять и ищет библиотеку [.filename]#geom_CLASSNAME.so# (которая обычно находится в [.filename]#/lib/geom#). * она открывает библиотеку при помощи man:dlopen[3], извлекает вспомогательные функции и определения параметров командной строки. Вот так происходит создание/маркирование нового экземпляра geom: * man:geom[8] ищет команду в аргументах командной строки (обычно это `label`) и вызывает вспомогательную функцию. * Вспомогательная функция проверяет параметры и собирает метаданные, которые записываются во все вовлеченные поставщики geom. * Это "повреждает (spoil)" существующие экземпляры geom (если они были) и порождает новый виток "тестирования" поставщиков geom. Целевой класс geom опознает метаданные и активирует экземпляр geom. (Приведенная выше последовательность событий зависит от конкретной реализации, но весь существующий код работает подобно описанному и поддерживается библиотеками.) [[geom-command]] === Структура команд geom Вспомогательная библиотека [.filename]#geom_CLASSNAME.so# экспортирует структуру `class_commands`, которая является массивом элементов `struct g_command`. Эти команды одинакового формата и выглядят следующим образом: [.programlisting] .... verb [-options] geomname [other] .... Общими командами являются: * label - записать метаданные в устройства, чтобы они могли быть опознаны в процессе тестирования и использованы в соответствующих экземплярах geom * destroy - разрушить метаданные, за которым последует разрушение экземпляров geom Общие опции: * `-v` : детальный вывод * `-f` : принудить Некоторые операции, к примеру маркирование метаданными и разрушение метаданных могут быть выполнены из пространства пользовательских процессов. Для этого, структура `g_command` содержит поле `gc_func`, которое может быть установлено на функцию (в том-же [.filename]#.so#), которая будет вызвана для обработки команды. В случае, когда `gc_func` равно NULL, команда будет передана модулю ядра: функции `.ctlreq` класса GEOM. [[geom-geoms]] === Экземпляры geom У экземпляров классов GEOM есть внутренние данные, которые хранятся в структурах softc, а также есть некоторые функции, посредством которых они реагируют на внешние события. Функции событий: * `.access` : просчитывает права доступа (чтение/запись/исключительный доступ) * `.dumpconf` : возвращает информацию о экземпляре geom; формат XML * `.orphan` : вызывается, когда отсоединяется любой из низлежащих поставщиков geom * `.spoiled` : вызывается, когда производится запись в низлежащий поставщик geom * `.start` : обрабатывает ввод/вывод Эти функции вызываются из ядерного потока `g_down` и в этом контексте не может быть блокировок (поищите определение "блокировка" в других источниках), что немного ограничивает свободу действий, но способствует быстроте обработки. Из вышеупомянутых, наиболее важной и выполняющей полезную работу функцией является `.start`(), которая вызывается всякий раз, когда поставщику geom, управляемому экземпляром класса, приходит запрос BIO. [[geom-threads]] === Потоки выполнения системы geom Системой GEOM в ядре ОС создаются и используются три потока выполнения (kernel threads): * `g_down` : Обрабатывает запросы, приходящие от высокоуровневых сущностей (таких, как запросы из пространства пользовательских процессов) на пути к физическим устройствам * `g_up` : Обрабатывает ответы от драйверов устройств на запросы, выполненные высокоуровневыми сущностями * `g_event` : Отрабатывает в остальных случаях, как-то создание экземпляра geom, просчитывание прав доступа, события "повреждения" и т.п. Когда пользовательский процесс запрашивает "прочитать данные X по смещению Y файла", происходит следующее: * Файловая система преобразует запрос в экземпляр структуры bio и передает его системе GEOM. Файловая система "знает", что экземпляр geom должен обработать запрос, так как файловые системы размещаются непосредственно над экземпляром geom. * Запрос завершается вызовом функции `.start`() в потоке g_down и достигает верхнего экземпляра geom. * Верхний экземпляр geom (например, это секционировщик разделов (partition slicer)) определяет, что запрос должен быть переадресован нижестоящему экземпляру geom (к примеру, драйверу диска). Вышестоящий экземпляр geom создает копию запроса bio (запросы bio _ВСЕГДА_ копируются при передаче между экземплярами geom при помощи `g_clone_bio`()!), изменяет поля смещения и целевого поставщика geom и запускает на обработку копию при помощи функции `g_io_request`() * Драйвер диска также получает запрос bio, как вызов функции `.start`() в потоке `g_down`. Драйвер обращается к контроллеру диска, получает блок данных и вызывает функцию `g_io_deliver`() используя копию запроса bio. * Теперь, извещение о завершении bio "всплывает" в потоке `g_up`. Сначала в потоке `g_up` вызывается функция `.done`() секционировщика разделов, последний использует полученную информацию, разрушает клонированный экземпляр структуры bio посредством `g_destroy_bio`() и вызывает `g_io_deliver`() используя первоначальный запрос. * Файловая система получает данные и передает их пользовательскому процессу. За информацией о том, как данные передаются в структуре `bio` между экземплярами geom, смотрите man:g_bio[9] (обратите внимание на использование полей `bio_parent` и `bio_children`). Важный момент в том, что __НЕЛЬЗЯ ДОПУСКАТЬ БЛОКИРОВОК В ПОТОКАХ G_UP И G_DOWN__. Вот неполный перечень того, что нельзя делать в этих потоках: * Вызывать функции `msleep`() или `tsleep`(). * Использовать функции `g_write_data`() и `g_read_data`(), так как они блокируются в момент обмена данными с потребителями geom. * Ожидать ввод/вывод. * Вызывать man:malloc[9] и `uma_zalloc`() с установленным флагом `M_WAITOK` * Использовать man:sx[9] Это ограничение на код GEOM призвано избежать от "засорения" пути запроса ввода/вывода, так как блокировки обычно не имеют четких временных границ, и нет гарантий на занимаемое время (также на то есть и другие технические причины). Это также значит, что в вышеупомянутых потоках сколь-нибудь сложные операции выполнить нельзя, например: любое сложное преобразование требует выделения памяти. К счастью решение есть: создание дополнительных ядерных потоков. [[geom-kernelthreads]] === Ядерные потоки выполнения, предназначенные для использования в коде geom Ядерные потоки выполнения создаются функцией man:kthread_create[9], в своем поведении они схожи с потоками, созданными в пространстве пользовательских процессов, но есть одно отличие: они не могут известить вызвавший их поток о своем завершении; по завершению - необходимо вызывать man:kthread_exit[9]. В коде GEOM обычное назначение этих потоков - разгрузить поток `g_down` (функцию `.start`() ) от обработки запросов. Эти потоки подобны "обработчикам событий" ("event handlers"): у них есть очередь событий (которая наполняется событиями от разных функций из разных потоков; очередь необходимо защищать мьютексом), события из очереди выбираются одно за другим и обрабатываются в большом блоке `switch`(). Основное преимущество использования отдельного потока, который обрабатывает запросы ввода/вывода, то, что он может блокироваться по мере необходимости. Это, несомненно, привлекательно, но должно быть хорошо обдумано. Блокирование - хорошо и удобно, но может существенно снизить производительность преобразований данных в системе GEOM. Особо требовательные к производительности классы могут делать всю работу в функции `.start`(), уделяя особое внимание ошибкам при работе с памятью. Еще одно преимущество потока "обработчика событий" это сериализация всех запросов и ответов, приходящих с разных потоков geom в один поток. Это также удобно, но может быть медленным. В большинстве случаев, обработка запросов функцией `.done`() может быть оставлена потоку `g_up`. У мьютексов в ядре FreeBSD (man:mutex[9]) есть одно различие с их аналогами из пространства пользовательских процессов - во время удержания мьютекса в коде не должно быть блокировки. Если в коде необходимо блокирование, то лучше использовать man:sx[9]. С другой стороны, если вся ваша работа выполняется в одном потоке, вы можете обойтись вообще без мьютексов. diff --git a/documentation/content/ru/articles/geom-class/_index.po b/documentation/content/ru/articles/geom-class/_index.po index 0fd7cf563b..7e1f8f0ba0 100644 --- a/documentation/content/ru/articles/geom-class/_index.po +++ b/documentation/content/ru/articles/geom-class/_index.po @@ -1,1388 +1,1396 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-09-20 13:16+0300\n" -"PO-Revision-Date: 2025-07-05 04:45+0000\n" +"POT-Creation-Date: 2025-11-10 20:57+0300\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/articles/geom-class/_index.adoc:1 #, no-wrap msgid "A guide to GEOM internals, and writing your own GEOM class" msgstr "Руководство по внутреннему устройству GEOM и созданию собственного класса GEOM" #. type: Title = #: documentation/content/en/articles/geom-class/_index.adoc:1 #: documentation/content/en/articles/geom-class/_index.adoc:11 #, no-wrap msgid "Writing a GEOM Class" msgstr "Создание класса GEOM" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:47 msgid "" "This text documents some starting points in developing GEOM classes, and " "kernel modules in general. It is assumed that the reader is familiar with C " "userland programming." msgstr "" "Эта статья документирует некоторые начальные выкладки в разработке GEOM-" "классов, а также модулей ядра в общем. Предполагается, что читатель близко " "знаком с программированием на Си в контексте пространства пользовательских " "процессов (userland)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:49 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/geom-class/_index.adoc:53 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:56 #, no-wrap msgid "Documentation" msgstr "Documentation" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:60 msgid "" "Documentation on kernel programming is scarce - it is one of few areas where " "there is nearly nothing in the way of friendly tutorials, and the phrase " "\"use the source!\" really holds true. However, there are some bits and " "pieces (some of them seriously outdated) floating around that should be " "studied before beginning to code:" msgstr "" "Документация по программированию для ядра скудная, это одна из немногих " "областей программирования, где почти нет хороших учебных пособий, и совет " "\"читай исходники!\" - сохраняет свою справедливость. Однако, существует " "несколько статей и книг разной актуальности, которые рекомендуются к " "изучению перед тем, как начать программировать:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:62 msgid "" "The extref:{developers-handbook}[FreeBSD Developer's Handbook] - part of the " "documentation project, it does not contain anything specific to kernel " "programming, but rather some general useful information." msgstr "" "extref:{developers-handbook}[Руководство FreeBSD для разработчиков] - часть " "Проекта Документации FreeBSD, ничего специфичного о программировании ядра в " "нем нет, зато есть немного общей полезной информации." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:63 msgid "" "The extref:{arch-handbook}[FreeBSD Architecture Handbook] - also from the " "documentation project, contains descriptions of several low-level facilities " "and procedures. The most important chapter is 13, extref:{arch-handbook}" "[Writing FreeBSD device drivers, driverbasics]." msgstr "" "extref:{arch-handbook}[Руководство по Архитектуре FreeBSD] - также является " "частью Проекта Документации FreeBSD, содержит описания некоторых " "низкоуровневых средств и процедур. Уделите внимание разделу номер 13 - " "extref:{arch-handbook}[Написание драйверов устройств для FreeBSD, " "driverbasics]." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:64 msgid "" "The Blueprints section of http://www.freebsddiary.org[FreeBSD Diary] web " "site - contains several interesting articles on kernel facilities." msgstr "" "Несколько интересных статей об устройстве ядра можно найти на сайте http://" "www.freebsddiary.com[FreeBSD Diary]." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:65 msgid "" "The man pages in section 9 - for important documentation on kernel functions." msgstr "" "Страницы из раздела номер 9 системного справочника, содержат важную " "документацию по функциям ядра." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:66 msgid "" "The man:geom[4] man page and http://phk.freebsd.dk/pubs/[PHK's GEOM slides] " "- for general introduction of the GEOM subsystem." msgstr "" "Страница справочника man:geom[4], а также http://phk.freebsd.dk/pubs/[слайды " "Пола-Хеннинга Кампа ] - общее представление о подсистеме GEOM." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:67 msgid "" "Man pages man:g_bio[9], man:g_event[9], man:g_data[9], man:g_geom[9], " "man:g_provider[9], man:g_consumer[9], man:g_access[9] & others linked from " "those, for documentation on specific functionalities." msgstr "" "Страницы справочника man:g_bio[9], man:g_event[9], man:g_data[9], " "man:g_geom[9], man:g_provider[9], man:g_consumer[9], man:g_access[9], а " "также другие, связанные с вышеупомянутыми и раскрывающие специфический " "функционал подсистемы GEOM." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:68 msgid "" "The man:style[9] man page - for documentation on the coding-style " "conventions which must be followed for any code which is to be committed to " "the FreeBSD tree." msgstr "" "Страница справочника man:style[9] - документирует соглашения о стиле " "оформления кода, которые обязаны быть соблюдены если вы планируете передать " "ваш код в Subversion репозиторий FreeBSD." #. type: Title == #: documentation/content/en/articles/geom-class/_index.adoc:70 #, no-wrap msgid "Preliminaries" msgstr "Подготовка" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:77 msgid "" "The best way to do kernel development is to have (at least) two separate " "computers. One of these would contain the development environment and " "sources, and the other would be used to test the newly written code by " "network-booting and network-mounting filesystems from the first one. This " "way if the new code contains bugs and crashes the machine, it will not mess " "up the sources (and other \"live\" data). The second system does not even " "require a proper display. Instead, it could be connected with a serial " "cable or KVM to the first one." msgstr "" "Для того, чтоб заниматься разработками для ядра, желательно иметь два " "отдельных компьютера. Один из них предназначен для среды разработки и " "исходных кодов, а второй - для запуска тестов отлаживаемого кода. Второму " "компьютеру для работы достаточно иметь возможность выполнять начальную " "загрузку по сети и монтирование файловых систем по сети. В этой ситуации, " "если отлаживаемый код содержит ошибки и вызовет аварийную остановку системы, " "то это не повлечет порчу или утерю исходного кода . Второму компьютеру даже " "не потребуется иметь свой монитор, достаточно будет соединения асинхронных " "портов кабелем RS-232 или соединения при помощи KVM-устройства." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:80 msgid "" "But, since not everybody has two or more computers handy, there are a few " "things that can be done to prepare an otherwise \"live\" system for " "developing kernel code. This setup is also applicable for developing in a " "http://www.vmware.com/[VMWare] or http://www.qemu.org/[QEmu] virtual machine " "(the next best thing after a dedicated development machine)." msgstr "" "Но так как далеко не у каждого есть два или более компьютеров под рукой, " "есть пара способов подготовить иную \"живую\" систему для разработки кода " "для ядра. Один из них - это разработка в http://www.vmware.com/[VMWare] или " "http://www.qemu.org/[QEmu] виртуальной машине (это лучшее из доступного, " "после, конечно-же, выделенного для тестов компьютера)." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:82 #, no-wrap msgid "Modifying a System for Development" msgstr "Настройка системы для разработки" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:85 msgid "" "For any kernel programming a kernel with `INVARIANTS` enabled is a must-" "have. So enter these in your kernel configuration file:" msgstr "" "Прежде всего необходимо иметь в ядре поддержку `INVARIANTS`. Добавьте " "следующие строки в файл конфигурации ядра:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:90 #, no-wrap msgid "" "options INVARIANT_SUPPORT\n" "options INVARIANTS\n" msgstr "" "options INVARIANT_SUPPORT\n" "options INVARIANTS\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:93 msgid "" "For more debugging you should also include WITNESS support, which will alert " "you of mistakes in locking:" msgstr "" "Для большей информативности при отладке включите поддержку WITNESS, которая " "будет предупреждать вас в случае возникновения взаимоблокировок:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:98 #, no-wrap msgid "" "options WITNESS_SUPPORT\n" "options WITNESS\n" msgstr "" "options WITNESS_SUPPORT\n" "options WITNESS\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:101 msgid "For debugging crash dumps, a kernel with debug symbols is needed:" msgstr "" "Также включите отладочные символы, если планируете выполнять отладку по " "дампам аварийных отказов:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:105 #, no-wrap msgid " makeoptions DEBUG=-g\n" msgstr " makeoptions DEBUG=-g\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:110 msgid "" "With the usual way of installing the kernel (`make installkernel`) the debug " "kernel will not be automatically installed. It is called " "[.filename]#kernel.debug# and located in [.filename]#/usr/obj/usr/src/sys/" "KERNELNAME/#. For convenience it should be copied to [.filename]#/boot/" "kernel/#." msgstr "" "Установка отладочного ядра обычным способом (`make installkernel`) не даст " "привычного результата: файл ядра будет называться [.filename]#kernel.debug# " "и будет находиться в [.filename]#/usr/obj/usr/src/sys/KERNELNAME/#. Для " "удобства, отладочное ядро необходимо скопировать в [.filename]#/boot/kernel/" "#." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:113 msgid "" "Another convenience is enabling the kernel debugger so you can examine a " "kernel panic when it happens. For this, enter the following lines in your " "kernel configuration file:" msgstr "" "Также удобно иметь включенный отладчик ядра, так вы сможете исследовать " "паники сразу-же после их возникновения. Для включения отладчика добавьте " "следующие строки в файл конфигурации ядра:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:119 #, no-wrap msgid "" "options KDB\n" "options DDB\n" "options KDB_TRACE\n" msgstr "" "options KDB\n" "options DDB\n" "options KDB_TRACE\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:122 msgid "" "For this to work you might need to set a sysctl (if it is not on by default):" msgstr "" "Для автоматического запуска отладчика ядра после возникновения паники может " "понадобиться установить переменную sysctl:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:126 #, no-wrap msgid " debug.debugger_on_panic=1\n" msgstr " debug.debugger_on_panic=1\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:134 msgid "" "Kernel panics will happen, so care should be taken with the filesystem " "cache. In particular, having softupdates might mean the latest file version " "could be lost if a panic occurs before it is committed to storage. " "Disabling softupdates yields a great performance hit, and still does not " "guarantee data consistency. Mounting filesystem with the \"sync\" option is " "needed for that. For a compromise, the softupdates cache delays can be " "shortened. There are three sysctl's that are useful for this (best to be " "set in [.filename]#/etc/sysctl.conf#):" msgstr "" "Паники системы будут происходить, поэтому уделите внимание кэшу файловой " "системы. Обычно, при включенном механизме softupdates, последняя версия " "файла может быть утеряна если паника произошла раньше сбрасывания кэша на " "устройство хранения. Выключение механизма softupdates (посредством " "монтирования файловой системы с опцией \"sync\") значительно сказывается на " "производительности и, опять-же, не гарантирует целостности данных. Как " "компромисс, можно сократить задержки сбрасывания кэша механизма softupdates. " "Есть три переменных sysctl, значения которых необходимо изменить (лучше " "всего - прописав их в [.filename]#/etc/sysctl.conf#):" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:140 #, no-wrap msgid "" "kern.filedelay=5\n" "kern.dirdelay=4\n" "kern.metadelay=3\n" msgstr "" "kern.filedelay=5\n" "kern.dirdelay=4\n" "kern.metadelay=3\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:143 msgid "The numbers represent seconds." msgstr "Значения этих переменных - секунды." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:151 msgid "" "For debugging kernel panics, kernel core dumps are required. Since a kernel " "panic might make filesystems unusable, this crash dump is first written to a " "raw partition. Usually, this is the swap partition. This partition must be " "at least as large as the physical RAM in the machine. On the next boot, the " "dump is copied to a regular file. This happens after filesystems are " "checked and mounted, and before swap is enabled. This is controlled with " "two [.filename]#/etc/rc.conf# variables:" msgstr "" "Для отладки паник ядра необходимы дампы памяти. Так как паника ядра может " "\"сломать\" файловую систему, дамп сначала сохраняется в \"сырой\" раздел. " "Обычно, это своп-раздел. Поэтому, размер своп-раздела должен быть не меньше " "размера ОЗУ компьютера. При последующей загрузке дамп копируется в обычный " "файл. Это происходит сразу-же после проверки и монтирования файловых систем, " "но перед активированием раздела свопа. Такое поведение контролируется " "следующими переменными [.filename]#/etc/rc.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:156 #, no-wrap msgid "" "dumpdev=\"/dev/ad0s4b\"\n" -"dumpdir=\"/usr/core\n" +"dumpdir=\"/usr/core\"\n" msgstr "" "dumpdev=\"/dev/ad0s4b\"\n" -"dumpdir=\"/usr/core\n" +"dumpdir=\"/usr/core\"\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:159 msgid "" "The `dumpdev` variable specifies the swap partition and `dumpdir` tells the " "system where in the filesystem to relocate the core dump on reboot." msgstr "" "Переменная `dumpdev` указывает на раздел подкачки, а `dumpdir` сообщает " "системе куда перемещать дамп ядра при следующей загрузке." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:162 msgid "" "Writing kernel core dumps is slow and takes a long time so if you have lots " "of memory (>256M) and lots of panics it could be frustrating to sit and wait " "while it is done (twice - first to write it to swap, then to relocate it to " "filesystem). It is convenient then to limit the amount of RAM the system " "will use via a [.filename]#/boot/loader.conf# tunable:" msgstr "" "Сохранение дампа ядра - процесс медленный, и, если у вашего компьютера много " "оперативной памяти (>256M) и если паники случаются часто, то ожидание " "сохранения дампов может начать раздражать (вспомним, что над дампом " "происходит две операции: сохранение в своп-файл и перемещение на файловую " "систему). В таком случае может оказаться удобным ограничивание объема " "используемой системой памяти путем установки переменной в [.filename]#/boot/" "loader.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:166 #, no-wrap msgid " hw.physmem=\"256M\"\n" msgstr " hw.physmem=\"256M\"\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:169 msgid "" "If the panics are frequent and filesystems large (or you simply do not trust " "softupdates+background fsck) it is advisable to turn background fsck off via " "[.filename]#/etc/rc.conf# variable:" msgstr "" "Если паники случаются часто и размер файловых систем большой (или же вы " "просто не доверяете softupdates и фоновой проверке файловых систем), " "рекомендуется отключить фоновую проверку файловых систем посредством " "установки переменной в [.filename]#/etc/rc.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:173 #, no-wrap msgid " background_fsck=\"NO\"\n" msgstr " background_fsck=\"NO\"\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:178 msgid "" "This way, the filesystems will always get checked when needed. Note that " "with background fsck, a new panic could happen while it is checking the " "disks. Again, the safest way is not to have many local filesystems by using " "another computer as an NFS server." msgstr "" "В этом случае файловые системы будут проверяться только при необходимости. " "Также заметьте, что в случае использования фоновой проверки, новая паника " "может случиться в то время, когда проверяются диски. Другими словами, " "наиболее безопасный способ - не иметь много локальных файловых систем, а " "использовать второй компьютер в качестве NFS-сервера." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:180 #, no-wrap msgid "Starting the Project" msgstr "Начало проекта" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:184 msgid "" "For the purpose of creating a new GEOM class, an empty subdirectory has to " "be created under an arbitrary user-accessible directory. You do not have to " "create the module directory under [.filename]#/usr/src#." msgstr "" "Для написания нового класса GEOM необходимо создать поддиректорию в любой " "доступной пользователю директории. Совсем не обязательно, чтоб ваш модуль " "изначально размещался в [.filename]#/usr/src#." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:186 #, no-wrap msgid "The Makefile" msgstr "Makefile" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:189 msgid "" "It is good practice to create [.filename]#Makefiles# for every nontrivial " "coding project, which of course includes kernel modules." msgstr "" "Правилом хорошего тона является создание [.filename]#Makefile#-ов для " "каждого нетривиального проекта, примером которого конечно-же является " "создание модулей ядра." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:192 msgid "" "Creating the [.filename]#Makefile# is simple thanks to an extensive set of " "helper routines provided by the system. In short, here is how a minimal " "[.filename]#Makefile# looks for a kernel module:" msgstr "" "Создание [.filename]#Makefile# - дело не сложное благодаря исчерпывающему " "набору вспомогательных средств, предоставляемых системой. В вкратце, вот как " "должен выглядеть [.filename]#Makefile# для модуля ядра:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:197 #, no-wrap msgid "" "SRCS=g_journal.c\n" "KMOD=geom_journal\n" msgstr "" "SRCS=g_journal.c\n" "KMOD=geom_journal\n" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:199 #, no-wrap msgid ".include \n" msgstr ".include \n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:203 msgid "" "This [.filename]#Makefile# (with changed filenames) will do for any kernel " "module, and a GEOM class can reside in just one kernel module. If more than " "one file is required, list it in the `SRCS` variable, separated with " "whitespace from other filenames." msgstr "" "Этот [.filename]#Makefile# (с измененными именами файлов) подойдет к любому " "модулю ядра. Класс GEOM может размещаться в одном единственном модуле ядра. " "Если для сборки вашего модуля требуется больше, чем один файл, то " "перечислите их имена, разделенные пробельными символами, в переменной `SRCS`." #. type: Title == #: documentation/content/en/articles/geom-class/_index.adoc:205 #, no-wrap msgid "On FreeBSD Kernel Programming" msgstr "Программирование в ядре FreeBSD" #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:208 #, no-wrap msgid "Memory Allocation" msgstr "Выделение памяти" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:213 msgid "" "See man:malloc[9]. Basic memory allocation is only slightly different than " "its userland equivalent. Most notably, `malloc`() and `free`() accept " "additional parameters as is described in the man page." msgstr "" "Прочитайте man:malloc[9] - выделение памяти лишь немного отличается от " "своего эквивалента, используемого в пространстве пользовательских процессов " "(userland). Наиболее приметно то, что `malloc`() и `free`() принимают " "дополнительные параметры, которые описаны в странице справочника." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:215 msgid "" "A \"malloc type\" must be declared in the declaration section of a source " "file, like this:" msgstr "" "Тип \"malloc_type\" необходимо объявить в секции деклараций файла с исходным " "кодом, например:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:219 #, no-wrap msgid " static MALLOC_DEFINE(M_GJOURNAL, \"gjournal data\", \"GEOM_JOURNAL Data\");\n" msgstr " static MALLOC_DEFINE(M_GJOURNAL, \"gjournal data\", \"GEOM_JOURNAL Data\");\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:222 msgid "" "To use this macro, [.filename]#sys/param.h#, [.filename]#sys/kernel.h# and " "[.filename]#sys/malloc.h# headers must be included." msgstr "" "Для того, чтобы можно было использовать этот макрос, необходимо включить " "следующие заголовочные файлы: [.filename]#sys/param.h#, [.filename]#sys/" "kernel.h# и [.filename]#sys/malloc.h#." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:225 msgid "" "There is another mechanism for allocating memory, the UMA (Universal Memory " "Allocator). See man:uma[9] for details, but it is a special type of " "allocator mainly used for speedy allocation of lists comprised of same-sized " "items (for example, dynamic arrays of structs)." msgstr "" "Существует еще один механизм выделения памяти - UMA (Universal Memory " "Allocator), описанный в man:uma[9]. Это специфический метод, преимущественно " "предназначенный для быстрого выделения памяти под списки, состоящие из " "элементов одинакового размера (например, динамические массивы структур)." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:227 #, no-wrap msgid "Lists and Queues" msgstr "Очереди и списки" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:234 msgid "" "See man:queue[3]. There are a LOT of cases when a list of things needs to " "be maintained. Fortunately, this data structure is implemented (in several " "ways) by C macros included in the system. The most used list type is TAILQ " "because it is the most flexible. It is also the one with largest memory " "requirements (its elements are doubly-linked) and also the slowest (although " "the speed variation is on the order of several CPU instructions more, so it " "should not be taken seriously)." msgstr "" "Ознакомьтесь с man:queue[3] Во множестве случаев вам необходимо будет " "организовывать и управлять такой структурой данных, как списки. К счастью, " "эта структура данных реализована несколькими способами в виде макросов на " "Си, а также включена в систему. Наиболее гибкий и часто употребляемый тип " "списка - TAILQ. Этот тип списка также один из наиболее требовательных к " "памяти (его элементы - с двойными связями), а также - наиболее медленный " "(однако счет идет на несколько инструкций ЦПУ, поэтому последнее утверждение " "не следует воспринимать в всерьез)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:236 msgid "" "If data retrieval speed is very important, see man:tree[3] and " "man:hashinit[9]." msgstr "" "Если важна скорость получения данных, то возьмите на вооружение man:tree[3] " "и man:hashinit[9]." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:238 #, no-wrap msgid "BIOs" msgstr "BIOs" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:242 msgid "" "Structure `bio` is used for any and all Input/Output operations concerning " "GEOM. It basically contains information about what device ('provider') " "should satisfy the request, request type, offset, length, pointer to a " "buffer, and a bunch of \"user-specific\" flags and fields that can help " "implement various hacks." msgstr "" "Структура `bio` используется для всех операций ввода/вывода, касающихся " "GEOM. Она содержит информацию о том, какое устройство ('поставщик geom') " "должно ответить на запрос, тип запроса, смещение, длину и указатель на " "буфер, а также набор \"определенных пользователем\" флагов и полей ." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:246 msgid "" "The important thing here is that ``bio``s are handled asynchronously. That " "means that, in most parts of the code, there is no analogue to userland's " "man:read[2] and man:write[2] calls that do not return until a request is " "done. Rather, a developer-supplied function is called as a notification " "when the request gets completed (or results in error)." msgstr "" "Важным моментом является то, что `bio` обрабатываются асинхронно. Это " "значит, что во многих частях кода нет аналога к man:read[2] и man:write[2] " "функциям из пространства пользовательских процессов, которые не возвращают " "управление пока не выполнится системный вызов. Скорее, по завершении " "обработки запроса (или в случае ошибки при обработке) как извещение " "вызывается определенная пользователем функция." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:250 msgid "" "The asynchronous programming model (also called \"event-driven\") is " "somewhat harder than the much more used imperative one used in userland (at " "least it takes a while to get used to it). In some cases the helper " "routines `g_write_data`() and `g_read_data`() can be used, but __not " "always__. In particular, they cannot be used when a mutex is held; for " "example, the GEOM topology mutex or the internal mutex held during the " "`.start`() and `.stop`() functions." msgstr "" "Асинхронная модель программирования в чем-то сложней, нежели чаще " "используемая императивная модель, используемая в пространстве " "пользовательских процессов; в любом случае, привыкание займет некоторое " "время. В некоторых случаях могут быть использованы вспомогательные функции " "`g_write_data`() и `g_read_data`(), но __далеко не всегда__. В частности, " "эти функции не могут использоваться когда захвачен мьютекс; например, " "мьютекс GEOM-топологии или внутренний мьютекс, удерживаемый в ходе " "выполнения `.start`() или `.stop`()." #. type: Title == #: documentation/content/en/articles/geom-class/_index.adoc:252 #, no-wrap msgid "On GEOM Programming" msgstr "Программирование в системе GEOM" #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:255 #, no-wrap msgid "Ggate" msgstr "Ggate" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:259 msgid "" "If maximum performance is not needed, a much simpler way of making a data " "transformation is to implement it in userland via the ggate (GEOM gate) " "facility. Unfortunately, there is no easy way to convert between, or even " "share code between the two approaches." msgstr "" "Если максимальная производительность не требуется, то более простой способ " "совершать преобразования данных - это выполнять их в пространстве " "пользовательских процессов посредством ggate (GEOM gate). К недостаткам " "следует отнести невозможность простого переноса кода в ядро." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:261 #, no-wrap msgid "GEOM Class" msgstr "Класс GEOM" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:266 msgid "" "GEOM classes are transformations on the data. These transformations can be " "combined in a tree-like fashion. Instances of GEOM classes are called " "__geoms__." msgstr "" "Класс GEOM выполняет преобразования данных. Эти преобразования могут быть " "скомпонованы друг с другом в виде дерева. Экземпляр класса GEOM называют " "__geom__." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:268 msgid "" "Each GEOM class has several \"class methods\" that get called when there is " "no geom instance available (or they are simply not bound to a single " "instance):" msgstr "" "В каждом классе GEOM есть несколько \"методов класса\", которые вызываются " "когда экземпляра класса нет в наличии (или же они не привязаны к конкретному " "экземпляру класса):" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:270 msgid "" "`.init` is called when GEOM becomes aware of a GEOM class (when the kernel " "module gets loaded.)" msgstr "" "`.init` вызывается тогда, когда системе GEOM становится известно о классе " "GEOM (например, когда загружается модуль ядра)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:271 msgid "" "`.fini` gets called when GEOM abandons the class (when the module gets " "unloaded)" msgstr "" "`.fini` будет вызван в случае отказа GEOM системы от класса (например, при " "выгрузке модуля)" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:272 msgid "" "`.taste` is called next, once for each provider the system has available. If " "applicable, this function will usually create and start a geom instance." msgstr "" "`.taste` вызывается, когда в системе появляется новый класс или поставщик " "geom (\"provider\"). Если соответствие найдено, то эта функция обычно " "создает и запускает экземпляр geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:273 msgid "`.destroy_geom` is called when the geom should be disbanded" msgstr "`.destroy_geom` вызывается при необходимости разрушить экземпляр geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:274 msgid "" "`.ctlconf` is called when user requests reconfiguration of existing geom" msgstr "" "`.ctlconf` будет вызван, когда пользователь запросит изменение конфигурации " "существующего экземпляра geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:276 msgid "" "Also defined are the GEOM event functions, which will get copied to the geom " "instance." msgstr "" "Также определены функции событий GEOM, которые копируются в экземпляр geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:278 msgid "" "Field `.geom` in the `g_class` structure is a LIST of geoms instantiated " "from the class." msgstr "" "Поле `.geom` в структуре `g_class` - это список (LIST) экземпляров geom, " "реализованных из класса." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:280 msgid "These functions are called from the g_event kernel thread." msgstr "Эти функции вызываются из g_event потока ядра." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:282 #, no-wrap msgid "Softc" msgstr "Softc" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:288 msgid "" "The name \"softc\" is a legacy term for \"driver private data\". The name " "most probably comes from the archaic term \"software control block\". In " "GEOM, it is a structure (more precise: pointer to a structure) that can be " "attached to a geom instance to hold whatever data is private to the geom " "instance. Most GEOM classes have the following members:" msgstr "" "\"softc\" - это устаревший термин для \"приватных данных драйвера\" " "(\"driver private data\"). Название вероятней всего происходит от " "устаревшего термина \"software control block\". В системе GEOM softc это " "структура (точнее: указатель на структуру) которая может быть присоединена к " "экземпляру geom и может содержать приватные данные экземпляра. У большинства " "классов GEOM есть следующие члены:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:290 msgid "`struct g_provider *provider` : The \"provider\" this geom instantiates" msgstr "" "`struct g_provider *provider` : \"поставщик geom\" предоставляемый данным " "экземпляром geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:291 msgid "`uint16_t n_disks` : Number of consumer this geom consumes" msgstr "" "`uint16_t n_disks` : Количество потребителей geom (\"consumer\"), " "обслуживаемых данным экземпляром geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:292 msgid "" "`struct g_consumer \\**disks` : Array of `struct g_consumer*`. (It is not " "possible to use just single indirection because struct g_consumer* are " "created on our behalf by GEOM)." msgstr "" "`struct g_consumer \\**disks` : Массив `struct g_consumer*`. (Невозможно " "обойтись одинарным указателем, потому что система GEOM создает для нас " "структуры struct g_consumer)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:295 msgid "" "The `softc` structure contains all the state of geom instance. Every geom " "instance has its own softc." msgstr "" "Структура `softc` содержит состояние экземпляра geom. У каждого экземпляра " "есть свой softc." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:297 #, no-wrap msgid "Metadata" msgstr "Метаданные" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:300 msgid "" "Format of metadata is more-or-less class-dependent, but MUST start with:" msgstr "" "Формат метаданных в той или иной мере зависит от конкретного класса, но " "_обязан_ начинаться с:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:302 msgid "16 byte buffer for null-terminated signature (usually the class name)" msgstr "" "16-байтного буфера для подписи - строки с завершающим нулем (обычно это имя " "класса)" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:303 msgid "uint32 version ID" msgstr "uint32 идентификатора версии" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:305 msgid "" "It is assumed that geom classes know how to handle metadata with version " "ID's lower than theirs." msgstr "" "Подразумевается, что классы geom знают как обращаться с метаданными с " "идентификаторами версий ниже, чем их собственные." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:307 msgid "" "Metadata is located in the last sector of the provider (and thus must fit in " "it)." msgstr "" "Метаданные размещаются в последнем секторе поставщика geom (поэтому обязаны " "целиком умещаться в нем)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:309 msgid "" "(All this is implementation-dependent but all existing code works like that, " "and it is supported by libraries.)" msgstr "" "(Все это зависит от реализации, но весь существующий код работает подобно " "описанному и поддерживается библиотеками.)" #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:311 #, no-wrap msgid "Labeling/creating a GEOM" msgstr "Маркирование/создание экземпляра geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:314 msgid "The sequence of events is:" msgstr "Последовательность событий следующая:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:316 msgid "user calls man:geom[8] utility (or one of its hardlinked friends)" msgstr "пользователь запускает служебную программу man:geom[8]" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:317 msgid "" "the utility figures out which geom class it is supposed to handle and " "searches for [.filename]#geom_CLASSNAME.so# library (usually in [.filename]#/" "lib/geom#)." msgstr "" "программа решает каким классом geom ей придется управлять и ищет библиотеку " "[.filename]#geom_CLASSNAME.so# (которая обычно находится в [.filename]#/lib/" "geom#)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:318 msgid "" "it man:dlopen[3]-s the library, extracts the definitions of command-line " "parameters and helper functions." msgstr "" "она открывает библиотеку при помощи man:dlopen[3], извлекает вспомогательные " "функции и определения параметров командной строки." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:320 msgid "In the case of creating/labeling a new geom, this is what happens:" msgstr "Вот так происходит создание/маркирование нового экземпляра geom:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:322 msgid "" "man:geom[8] looks in the command-line argument for the command (usually " "`label`), and calls a helper function." msgstr "" "man:geom[8] ищет команду в аргументах командной строки (обычно это `label`) " "и вызывает вспомогательную функцию." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:323 msgid "" "The helper function checks parameters and gathers metadata, which it " "proceeds to write to all concerned providers." msgstr "" "Вспомогательная функция проверяет параметры и собирает метаданные, которые " "записываются во все вовлеченные поставщики geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:324 msgid "" "This \"spoils\" existing geoms (if any) and initializes a new round of " "\"tasting\" of the providers. The intended geom class recognizes the " "metadata and brings the geom up." msgstr "" "Это \"повреждает (spoil)\" существующие экземпляры geom (если они были) и " "порождает новый виток \"тестирования\" поставщиков geom. Целевой класс geom " "опознает метаданные и активирует экземпляр geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:326 msgid "" "(The above sequence of events is implementation-dependent but all existing " "code works like that, and it is supported by libraries.)" msgstr "" "(Приведенная выше последовательность событий зависит от конкретной " "реализации, но весь существующий код работает подобно описанному и " "поддерживается библиотеками.)" #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:328 #, no-wrap msgid "GEOM Command Structure" msgstr "Структура команд geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:332 msgid "" "The helper [.filename]#geom_CLASSNAME.so# library exports `class_commands` " "structure, which is an array of `struct g_command` elements. Commands are " "of uniform format and look like:" msgstr "" "Вспомогательная библиотека [.filename]#geom_CLASSNAME.so# экспортирует " "структуру `class_commands`, которая является массивом элементов `struct " "g_command`. Эти команды одинакового формата и выглядят следующим образом:" #. type: delimited block . 4 #: documentation/content/en/articles/geom-class/_index.adoc:336 #, no-wrap msgid " verb [-options] geomname [other]\n" msgstr " verb [-options] geomname [other]\n" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:339 msgid "Common verbs are:" msgstr "Общими командами являются:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:341 msgid "" "label - to write metadata to devices so they can be recognized at tasting " "and brought up in geoms" msgstr "" "label - записать метаданные в устройства, чтобы они могли быть опознаны в " "процессе тестирования и использованы в соответствующих экземплярах geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:342 msgid "destroy - to destroy metadata, so the geoms get destroyed" msgstr "" "destroy - разрушить метаданные, за которым последует разрушение экземпляров " "geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:344 msgid "Common options are:" msgstr "Общие опции:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:346 msgid "`-v` : be verbose" msgstr "`-v` : детальный вывод" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:347 msgid "`-f` : force" msgstr "`-f` : принудить" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:351 msgid "" "Many actions, such as labeling and destroying metadata can be performed in " "userland. For this, `struct g_command` provides field `gc_func` that can be " "set to a function (in the same [.filename]#.so#) that will be called to " "process a verb. If `gc_func` is NULL, the command will be passed to kernel " "module, to `.ctlreq` function of the geom class." msgstr "" "Некоторые операции, к примеру маркирование метаданными и разрушение " "метаданных могут быть выполнены из пространства пользовательских процессов. " "Для этого, структура `g_command` содержит поле `gc_func`, которое может быть " "установлено на функцию (в том-же [.filename]#.so#), которая будет вызвана " "для обработки команды. В случае, когда `gc_func` равно NULL, команда будет " "передана модулю ядра: функции `.ctlreq` класса GEOM." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:353 #, no-wrap msgid "Geoms" msgstr "Экземпляры geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:357 msgid "" "Geoms are instances of GEOM classes. They have internal data (a softc " "structure) and some functions with which they respond to external events." msgstr "" "У экземпляров классов GEOM есть внутренние данные, которые хранятся в " "структурах softc, а также есть некоторые функции, посредством которых они " "реагируют на внешние события." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:359 msgid "The event functions are:" msgstr "Функции событий:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:361 msgid "`.access` : calculates permissions (read/write/exclusive)" msgstr "" "`.access` : просчитывает права доступа (чтение/запись/исключительный доступ)" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:362 msgid "`.dumpconf` : returns XML-formatted information about the geom" msgstr "`.dumpconf` : возвращает информацию о экземпляре geom; формат XML" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:363 msgid "`.orphan` : called when some underlying provider gets disconnected" msgstr "" "`.orphan` : вызывается, когда отсоединяется любой из низлежащих поставщиков " "geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:364 msgid "`.spoiled` : called when some underlying provider gets written to" msgstr "" "`.spoiled` : вызывается, когда производится запись в низлежащий поставщик " "geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:365 msgid "`.start` : handles I/O" msgstr "`.start` : обрабатывает ввод/вывод" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:367 msgid "" "These functions are called from the `g_down` kernel thread and there can be " "no sleeping in this context, (see definition of sleeping elsewhere) which " "limits what can be done quite a bit, but forces the handling to be fast." msgstr "" "Эти функции вызываются из ядерного потока `g_down` и в этом контексте не " "может быть блокировок (поищите определение \"блокировка\" в других " "источниках), что немного ограничивает свободу действий, но способствует " "быстроте обработки." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:369 msgid "" "Of these, the most important function for doing actual useful work is the " "`.start`() function, which is called when a BIO request arrives for a " "provider managed by a instance of geom class." msgstr "" "Из вышеупомянутых, наиболее важной и выполняющей полезную работу функцией " "является `.start`(), которая вызывается всякий раз, когда поставщику geom, " "управляемому экземпляром класса, приходит запрос BIO." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:371 #, no-wrap msgid "GEOM Threads" msgstr "Потоки выполнения системы geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:374 msgid "There are three kernel threads created and run by the GEOM framework:" msgstr "" "Системой GEOM в ядре ОС создаются и используются три потока выполнения " "(kernel threads):" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:376 msgid "" "`g_down` : Handles requests coming from high-level entities (such as a " "userland request) on the way to physical devices" msgstr "" "`g_down` : Обрабатывает запросы, приходящие от высокоуровневых сущностей " "(таких, как запросы из пространства пользовательских процессов) на пути к " "физическим устройствам" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:377 msgid "" "`g_up` : Handles responses from device drivers to requests made by higher-" "level entities" msgstr "" "`g_up` : Обрабатывает ответы от драйверов устройств на запросы, выполненные " "высокоуровневыми сущностями" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:378 msgid "" "`g_event` : Handles all other cases: creation of geom instances, access " "counting, \"spoil\" events, etc." msgstr "" "`g_event` : Отрабатывает в остальных случаях, как-то создание экземпляра " "geom, просчитывание прав доступа, события \"повреждения\" и т.п." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:380 msgid "" "When a user process issues \"read data X at offset Y of a file\" request, " "this is what happens:" msgstr "" "Когда пользовательский процесс запрашивает \"прочитать данные X по смещению " "Y файла\", происходит следующее:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:382 msgid "" "The filesystem converts the request into a struct bio instance and passes it " "to the GEOM subsystem. It knows what geom instance should handle it because " "filesystems are hosted directly on a geom instance." msgstr "" "Файловая система преобразует запрос в экземпляр структуры bio и передает его " "системе GEOM. Файловая система \"знает\", что экземпляр geom должен " "обработать запрос, так как файловые системы размещаются непосредственно над " "экземпляром geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:383 msgid "" "The request ends up as a call to the `.start`() function made on the g_down " "thread and reaches the top-level geom instance." msgstr "" "Запрос завершается вызовом функции `.start`() в потоке g_down и достигает " "верхнего экземпляра geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:384 msgid "" "This top-level geom instance (for example the partition slicer) determines " "that the request should be routed to a lower-level instance (for example the " "disk driver). It makes a copy of the bio request (bio requests _ALWAYS_ need " "to be copied between instances, with `g_clone_bio`()!), modifies the data " "offset and target provider fields and executes the copy with `g_io_request`()" msgstr "" "Верхний экземпляр geom (например, это секционировщик разделов (partition " "slicer)) определяет, что запрос должен быть переадресован нижестоящему " "экземпляру geom (к примеру, драйверу диска). Вышестоящий экземпляр geom " "создает копию запроса bio (запросы bio _ВСЕГДА_ копируются при передаче " "между экземплярами geom при помощи `g_clone_bio`()!), изменяет поля смещения " "и целевого поставщика geom и запускает на обработку копию при помощи функции " "`g_io_request`()" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:385 msgid "" "The disk driver gets the bio request also as a call to `.start`() on the " "`g_down` thread. It talks to hardware, gets the data back, and calls " "`g_io_deliver`() on the bio." msgstr "" "Драйвер диска также получает запрос bio, как вызов функции `.start`() в " "потоке `g_down`. Драйвер обращается к контроллеру диска, получает блок " "данных и вызывает функцию `g_io_deliver`() используя копию запроса bio." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:386 msgid "" "Now, the notification of bio completion \"bubbles up\" in the `g_up` thread. " "First the partition slicer gets `.done`() called in the `g_up` thread, it " "uses information stored in the bio to free the cloned `bio` structure (with " "`g_destroy_bio`()) and calls `g_io_deliver`() on the original request." msgstr "" "Теперь, извещение о завершении bio \"всплывает\" в потоке `g_up`. Сначала в " "потоке `g_up` вызывается функция `.done`() секционировщика разделов, " "последний использует полученную информацию, разрушает клонированный " "экземпляр структуры bio посредством `g_destroy_bio`() и вызывает " "`g_io_deliver`() используя первоначальный запрос." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:387 msgid "The filesystem gets the data and transfers it to userland." msgstr "" "Файловая система получает данные и передает их пользовательскому процессу." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:389 msgid "" "See man:g_bio[9] man page for information how the data is passed back and " "forth in the `bio` structure (note in particular the `bio_parent` and " "`bio_children` fields and how they are handled)." msgstr "" "За информацией о том, как данные передаются в структуре `bio` между " "экземплярами geom, смотрите man:g_bio[9] (обратите внимание на использование " "полей `bio_parent` и `bio_children`)." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:392 msgid "" "One important feature is: __THERE CAN BE NO SLEEPING IN G_UP AND G_DOWN " "THREADS__. This means that none of the following things can be done in " "those threads (the list is of course not complete, but only informative):" msgstr "" "Важный момент в том, что __НЕЛЬЗЯ ДОПУСКАТЬ БЛОКИРОВОК В ПОТОКАХ G_UP И " "G_DOWN__. Вот неполный перечень того, что нельзя делать в этих потоках:" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:394 msgid "Calls to `msleep`() and `tsleep`(), obviously." msgstr "Вызывать функции `msleep`() или `tsleep`()." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:395 msgid "" "Calls to `g_write_data`() and `g_read_data`(), because these sleep between " "passing the data to consumers and returning." msgstr "" "Использовать функции `g_write_data`() и `g_read_data`(), так как они " "блокируются в момент обмена данными с потребителями geom." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:396 msgid "Waiting for I/O." msgstr "Ожидать ввод/вывод." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:397 msgid "Calls to man:malloc[9] and `uma_zalloc`() with `M_WAITOK` flag set" msgstr "" "Вызывать man:malloc[9] и `uma_zalloc`() с установленным флагом `M_WAITOK`" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:398 msgid "sx and other sleepable locks" msgstr "Использовать man:sx[9]" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:402 msgid "" "This restriction is here to stop GEOM code clogging the I/O request path, " "since sleeping is usually not time-bound and there can be no guarantees on " "how long will it take (there are some other, more technical reasons also). " "It also means that there is not much that can be done in those threads; for " "example, almost any complex thing requires memory allocation. Fortunately, " "there is a way out: creating additional kernel threads." msgstr "" "Это ограничение на код GEOM призвано избежать от \"засорения\" пути запроса " "ввода/вывода, так как блокировки обычно не имеют четких временных границ, и " "нет гарантий на занимаемое время (также на то есть и другие технические " "причины). Это также значит, что в вышеупомянутых потоках сколь-нибудь " "сложные операции выполнить нельзя, например: любое сложное преобразование " "требует выделения памяти. К счастью решение есть: создание дополнительных " "ядерных потоков." #. type: Title === #: documentation/content/en/articles/geom-class/_index.adoc:404 #, no-wrap msgid "Kernel Threads for Use in GEOM Code" msgstr "Ядерные потоки выполнения, предназначенные для использования в коде geom" #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:407 msgid "" "Kernel threads are created with man:kthread_create[9] function, and they are " "sort of similar to userland threads in behavior, only they cannot return to " "caller to signify termination, but must call man:kthread_exit[9]." msgstr "" "Ядерные потоки выполнения создаются функцией man:kthread_create[9], в своем " "поведении они схожи с потоками, созданными в пространстве пользовательских " "процессов, но есть одно отличие: они не могут известить вызвавший их поток о " "своем завершении; по завершению - необходимо вызывать man:kthread_exit[9]." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:410 msgid "" "In GEOM code, the usual use of threads is to offload processing of requests " "from `g_down` thread (the `.start`() function). These threads look like " "\"event handlers\": they have a linked list of event associated with them " "(on which events can be posted by various functions in various threads so it " "must be protected by a mutex), take the events from the list one by one and " "process them in a big `switch`() statement." msgstr "" "В коде GEOM обычное назначение этих потоков - разгрузить поток `g_down` " "(функцию `.start`() ) от обработки запросов. Эти потоки подобны " "\"обработчикам событий\" (\"event handlers\"): у них есть очередь событий " "(которая наполняется событиями от разных функций из разных потоков; очередь " "необходимо защищать мьютексом), события из очереди выбираются одно за другим " "и обрабатываются в большом блоке `switch`()." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:415 msgid "" "The main benefit of using a thread to handle I/O requests is that it can " "sleep when needed. Now, this sounds good, but should be carefully thought " "out. Sleeping is well and very convenient but can very effectively destroy " "performance of the geom transformation. Extremely performance-sensitive " "classes probably should do all the work in `.start`() function call, taking " "great care to handle out-of-memory and similar errors." msgstr "" "Основное преимущество использования отдельного потока, который обрабатывает " "запросы ввода/вывода, то, что он может блокироваться по мере необходимости. " "Это, несомненно, привлекательно, но должно быть хорошо обдумано. " "Блокирование - хорошо и удобно, но может существенно снизить " "производительность преобразований данных в системе GEOM. Особо " "требовательные к производительности классы могут делать всю работу в функции " "`.start`(), уделяя особое внимание ошибкам при работе с памятью." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:419 msgid "" "The other benefit of having a event-handler thread like that is to serialize " "all the requests and responses coming from different geom threads into one " "thread. This is also very convenient but can be slow. In most cases, " "handling of `.done`() requests can be left to the `g_up` thread." msgstr "" "Еще одно преимущество потока \"обработчика событий\" это сериализация всех " "запросов и ответов, приходящих с разных потоков geom в один поток. Это также " "удобно, но может быть медленным. В большинстве случаев, обработка запросов " "функцией `.done`() может быть оставлена потоку `g_up`." #. type: Plain text #: documentation/content/en/articles/geom-class/_index.adoc:422 msgid "" "Mutexes in FreeBSD kernel (see man:mutex[9]) have one distinction from their " "more common userland cousins - the code cannot sleep while holding a " "mutex). If the code needs to sleep a lot, man:sx[9] locks may be more " "appropriate. On the other hand, if you do almost everything in a single " "thread, you may get away with no mutexes at all." msgstr "" "У мьютексов в ядре FreeBSD (man:mutex[9]) есть одно различие с их аналогами " "из пространства пользовательских процессов - во время удержания мьютекса в " "коде не должно быть блокировки. Если в коде необходимо блокирование, то " "лучше использовать man:sx[9]. С другой стороны, если вся ваша работа " "выполняется в одном потоке, вы можете обойтись вообще без мьютексов." + +#, no-wrap +#~ msgid "" +#~ "dumpdev=\"/dev/ad0s4b\"\n" +#~ "dumpdir=\"/usr/core\n" +#~ msgstr "" +#~ "dumpdev=\"/dev/ad0s4b\"\n" +#~ "dumpdir=\"/usr/core\"\n" diff --git a/documentation/content/ru/articles/hubs/_index.adoc b/documentation/content/ru/articles/hubs/_index.adoc index a5e3f51098..aeda83c9b4 100644 --- a/documentation/content/ru/articles/hubs/_index.adoc +++ b/documentation/content/ru/articles/hubs/_index.adoc @@ -1,336 +1,336 @@ --- authors: - author: 'Jun Kuriyama' email: kuriyama@FreeBSD.org - author: 'Valentino Vaschetto' email: logo@FreeBSD.org - author: 'Daniel Lang' email: dl@leo.org - author: 'Ken Smith' email: kensmith@FreeBSD.org description: 'Полное руководство по зеркалированию веб-сайта FreeBSD, FTP-серверов и многого другого' tags: ["Mirroring", "FreeBSD", "Hub"] title: 'Поддержка зеркал FreeBSD' trademarks: ["freebsd", "general"] --- = Поддержка зеркал FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/hubs/ 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::[] [NOTE] ==== На текущий момент заявки на подключение новых зеркал не принимаются. ==== [[mirror-contact]] == Контактная информация Координаторы системы зеркал доступны по электронной почте по адресу mailto:mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org]. Помимо этого, существует {freebsd-hubs}. [[mirror-requirements]] == Требования к зеркалам FreeBSD [[mirror-diskspace]] === Дисковое пространство Одним из наиболее важных требований является дисковое пространство. В зависимости от набора релизов, архитектур и степени полноты зеркала вам может потребоваться огромный объем диска. Не лишним будет помнить, что _официальное_ зеркало, скорее всего, должно быть полным. Веб-страницы всегда должны зеркалироваться полностью. Кроме того, учтите, что приводимые оценки объема относятся к состоянию на момент последнего редактирования данной статьи ({rel120-current}-RELEASE/{rel113-current}-RELEASE). Дальнейший процесс разработки и последующие релизы только увеличат требуемый объем. Кроме того, разумно будет зарезервировать некоторое (10-20%) дополнительное пространство спокойствия ради. Вот некоторые оценки объема: * Полное зеркало FTP: 1.4 TB * Комплект изменений CTM: 10 GB * Веб-страницы: 1 GB Текущее использование диска зеркалом FTP можно посмотреть на link:ftp://ftp.FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/dir.sizes]. [[mirror-bandwidth]] === Требования к сетевой связности и пропускной способности Разумеется, у вас должно быть подключение к интернет. Требуемая пропускная способность ваших каналов зависит от предполагаемого профиля использования вашего зеркала. Если вы собираетесь копировать некоторые части FreeBSD для локального использования на вашей машине или в интранете, требования могут быть много мягче, чем для публичного зеркала. Для официального зеркала необходимая пропускная способность увеличивается еще больше. Мы можем дать лишь очень грубые оценки: * Зеркало для локального доступа: фактически минимум не определен, но канал шириной менее 2 Mbps может сделать процесс обновления мучительно медленным. * Неофициальное публичное зеркало: 34 Mbps выглядит неплохо для начала. * Официальное зеркало: рекомендуется канал шириной более 100 Mbps; кроме того, ваша машина должна стоять как можно ближе к граничным маршрутизаторам вашей сети. [[mirror-system]] === Системные требования, процессор и память Эти требования в первую очередь определяются максимальным ожидаемым количеством клиентов (устанавливается администратором сервера). Также, на требуемые ресурсы влияет список сервисов, которые вы будете предоставлять. Зеркала FTP и/или HTTP не требуют особенно много ресурсов. Будьте на чеку, если планируете предоставлять rsync. Выбор rsync может иметь огромное влияние на требования к аппаратным ресурсам, поскольку rsync признан "прожорливым" по памяти. Вот некоторые советы по конфигурации аппаратной части сервера. Для умеренно посещаемого сайта, предоставляющего rsync, можно использовать процессор с частотой 800MHz - 1 GHz и по крайней мере 512MB памяти. Скорее всего, данная конфигурация может считаться минимальной для _официального_ зеркала. Для регулярно посещаемого сайта вам потребуется больше памяти (хорошим стартом будет 2GB) и больше процессорной мощности, что может означать требование многопроцессорной (SMP) платформы. Кроме того, вам потребуется быстрая дисковая подсистема, в первую очередь, для работы с репозиторием SVN (крайне рекомендуем RAID). Контроллер SCSI, оборудованный собственной памятью, также может ощутимо ускорить процесс, поскольку большая часть сервисов связана с большим количеством дисковых запросов небольшого размера. [[mirror-services]] === Предоставляемые сервисы Всякое зеркало должно предоставлять набор основных сервисов. Помимо требуемого минимального набора, существуют дополнительные сервисы, которые администратор сервера может пожелать предоставлять. Этот раздел описывает, какие сервисы вы можете предоставлять, и какие действия для этого потребуются от вас. [[mirror-serv-ftp]] ==== FTP (требуется для FTP зеркала) Это один из наиболее базовых сервисов; его предоставление требуется для каждого зеркала, распространяющего файлы FreeBSD по FTP. Доступ по FTP должен быть анонимным, и не должны применяться какие-либо ограничения по соотношению объема передано/принято (что вообще является, на наш взгляд, странным подходом). Закачка (upload) файлов на сервер не требуется (и _должна_ быть запрещена в разделе FreeBSD). Кроме того, архив файлов FreeBSD должен быть доступен с путем [.filename]#/pub/FreeBSD#. Для предоставления анонимного FTP доступа может быть использован целый ряд программ (перечислены в алфавитном порядке). * `/usr/libexec/ftpd`: базовый FTP-даемон FreeBSD. Не забудьте прочитать man:ftpd[8]. * package:ftp/ncftpd[]: коммерческий пакет, свободен для использования в учебных целях. * package:ftp/oftpd[]: FTP-даемон, написанный в основном с точки зрения защищенности. * package:ftp/proftpd[]: Модульный и очень гибкий FTP-даемон. * package:ftp/pure-ftpd[]: Еще один FTP-даемон, разработанный с позиций защищенности. * package:ftp/twoftpd[]: См. предыдущий пункт. * package:ftp/vsftpd[]: "очень защищенный" ("very secure") ftpd. ftpd, proftpd и, возможно, ncftpd являются наиболее часто встречающимися FTP серверами. Прочие распространены среди существующих зеркал в существенно меньшей степени. Дополнительным поводом для рассмотрения может являться возможность гибко ограничивать количество одновременных соединений, что поможет вам удержать в нужных рамках потребление пропускной способности ваших каналов и машинные ресурсы. [[mirror-serv-rsync]] ==== Rsync (необязательный сервис для FTP зеркала) rsync часто используется для предоставления доступа к FTP-области FreeBSD, чтобы другие зеркала могли синхронизироваться по вашему. Протокол rsync во многом отличается от FTP, в частности, он гораздо гуманнее с точки зрения пропускной способности каналов, поскольку не требует передачи измененного файла целиком (передаются лишь различия). Взамен rsync требует значительных объемов памяти. Размер каждого процесса зависит от размера синхронизируемого модуля (в основном от количества директорий и файлов). rsync может использовать в качестве транспортного протокола `rsh` или `ssh` (по умолчанию); также, может использоваться внутренний протокол rsync (этот метод предпочтителен для публичных rsync-серверов). Поддерживается авторизация клиентов и различные ограничения. Для протокола rsync существует единственный пакет: * package:net/rsync[] [[mirror-serv-http]] ==== HTTP (требуется для веб-страниц, дополнителен для FTP зеркал) Если вы хотите поддерживать зеркало веб-страниц FreeBSD, вам потребуется установить веб-сервер. Дополнительно, вы можете предоставлять HTTP доступ к FTP-набору файлов FreeBSD. Выбор веб-сервера остается на усмотрение администратора зеркала. Некоторые из наиболее популярных веб-серверов перечислены ниже: * package:www/apache24[]: Apache - самый широко распространённый в Интернете веб-сервер, активно используемый проектом FreeBSD. * package:www/boa[]: Boa - это однозадачный HTTP-сервер. В отличие от традиционных веб-серверов, он не создает отдельные процессы для каждого входящего соединения и не запускает множество копий самого себя для обработки множества соединений. Тем не менее, он должен обеспечивать значительно более высокую производительность для чисто статического контента. * package:www/cherokee[]: Cherokee — это очень быстрый, гибкий и простой в настройке веб-сервер. Он поддерживает распространённые современные технологии: FastCGI, SCGI, PHP, CGI, SSL/TLS-шифрование соединений, виртуальные хосты, аутентификацию пользователей, динамическое кодирование и балансировку нагрузки. Также он генерирует журналы, совместимые с Apache. * package:www/lighttpd[]: lighttpd — это безопасный, быстрый, совместимый и очень гибкий веб-сервер, оптимизированный для высокопроизводительных сред. По сравнению с другими веб-серверами, он имеет очень низкое потребление памяти и эффективно распределяет нагрузку на процессор. * package:www/nginx[]: nginx — это высокопроизводительный веб-сервер с низким потреблением памяти и ключевыми функциями для построения современной и эффективной веб-инфраструктуры. Возможности включают HTTP-сервер, обратный прокси для HTTP и почты, кэширование, балансировку нагрузки, сжатие, ограничение запросов, мультиплексирование и повторное использование соединений, выгрузку SSL и потоковую передачу HTTP-медиа. * package:www/thttpd[]: Если вам необходимо обслуживать большое количество статического контента, вы можете обнаружить, что использование приложения, такого как thttpd, более эффективно по сравнению с другими. Оно также оптимизировано для отличной производительности в FreeBSD. [[mirror-howto]] == Как вести зеркало FreeBSD Теперь вам известно, какая потребуется машина и как предоставлять сервисы, но не как получить их самому. :-) В этом разделе описывается процесс ведения зеркала и поддержания его в актуальном состоянии, в том числе какие инструменты использовать и какие сайты выбирать в качестве источников для синхронизации. [[mirror-ftp-rsync]] === Зеркалирование FTP-области Файлы, доступные по FTP, составляют большую часть зеркала. Они включают __дистрибутивные наборы__, необходимые для установки по сети, __ветви (branches)__, в которых отражено текущее состояние исходных текстов, _образы ISO_ для записи компакт-дисков с дистрибутивами для установки, образами "живых" файловых систем и пакетами, дерево портов, исходные дистрибутивы для сборки портов и кучу готовых пакетов. И, разумеется, все вышеописанное - для разных версий FreeBSD и различных архитектур. Наиболее эффективным будет синхронизация FTP-области при помощи rsync. Для этого следует установить пакет package:net/rsync[], который был описан в разделе <>. Поскольку доступ по протоколу rsync не является обязательным, выбранный вами сайт может его не поддерживать. Возможно, вам придется немного поискать в сетевой окрестности зеркало, поддерживающее rsync. [NOTE] ==== Поскольку от количества клиентов rsync ощутимо зависит загрузка сервера, большинство администраторов вводят ограничения доступа. Для поддержания зеркала вам следует связаться с администратором сайта, с которым вы будете синхронизироваться, для уточнения локальных правил и, возможно, для внесения в них исключения для вас (поскольку вы также поддерживаете зеркало). ==== Строка для синхронизации FreeBSD по rsync выглядит примерно так: [source, shell] .... % rsync -vaHz --delete rsync://ftp4.de.FreeBSD.org/FreeBSD/ /pub/FreeBSD/ .... Загляните в документацию по rsync, также доступную по адресу http://rsync.samba.org/[http://rsync.samba.org/] за дополнительной информацией по различным опциям rsync. Обратите внимание, что в случае синхронизации модуля целиком (а не отдельного каталога) необходимо явно указать результирующий каталог, потому что каталог с именем модуля (в данном случае "FreeBSD") не создается. Для поддержания актуальности вам потребуется создать скрипт для запуска подобной команды из man:cron[8]. [[mirror-www]] === Зеркалирование страниц WWW [WARNING] ==== После перевода документации на Hugo/Asciidoctor 2021-01-25, зеркалирование веб-сайта с помощью rsync больше не работает. ==== Ведутся исследования по реализации зеркала веб-сайта с использованием extref:{handbook}mirrors/[официальной инфраструктуры]. Для прежних зеркал веб-сайтов способ достичь зеркалирования сегодня — это собрать веб-сайт локально с соответствующим адресом, на котором он будет размещён. [source, shell] .... % cd website && env HUGO_baseURL="https://www.XX.freebsd.org/" make .... Проверьте дополнительные сведения о инструментах сборки в extref:{fdp-primer}overview/[Проект документации FreeBSD: введение для новых участников, overview-quick-start]. //// [source,shell] .... % rsync -vaHz --delete rsync://bit0.us-west.freebsd.org/FreeBSD-www-data/ /usr/local/www/ .... //// [NOTE] ==== Обратите внимание, что сайт был разделён на www.FreeBSD.org и docs.FreeBSD.org, и между ними есть ссылки; кроме того, на данный момент переменная `HUGO_baseURL` не охватывает все ссылки, поэтому зеркалирование сайта не рекомендуется. ==== [[mirror-pkgs]] === Зеркалирование пакетов Из-за очень высоких требований к пропускной способности, хранилищу и администрированию проект FreeBSD принял решение не разрешать публичные зеркала пакетов. Для сайтов с большим количеством машин может быть выгодно запустить кэширующий HTTP-прокси для процесса man:pkg[8]. Или конкретные пакеты и их зависимости можно загрузить, выполнив что-то вроде следующего: [source, shell] .... % pkg fetch -d -o /usr/local/mirror vim .... После загрузки этих пакетов необходимо сгенерировать метаданные репозитория, выполнив: [source, shell] .... % pkg repo /usr/local/mirror .... После загрузки пакетов и генерации метаданных репозитория предоставьте пакеты клиентским машинам через HTTP. Дополнительную информацию можно найти на man-страницах man:pkg[8], в частности на странице man:pkg-repo[8]. [[mirror-how-often]] === Как часто синхронизироваться? Каждое зеркало должно обновляться как минимум раз в день. Конечно, потребуется скрипт с блокировкой, чтобы предотвратить одновременный запуск нескольких копий, который будет запускаться из man:cron[8]. Поскольку почти каждый администратор делает это по-своему, конкретные инструкции предоставить невозможно. Это может работать примерно так: [.procedure] ==== . Создайте скрипт с командой, которая запустит нужное приложение для обновления зеркала. Рекомендуем использовать скрипт на языке обычного `/bin/sh`. . Добавьте команд перенаправления вывода, чтобы записать диагностику работы в файл. . Попробуйте, как ваш скрипт работает. По завершении проверьте журналы. . При помощи утилиты man:crontab[1] добавьте ваш скрипт в таблицу регулярных заданий man:crontab[5] соответствующего пользователя. Это должен быть пользователь, отличный от пользователя FTP-даемона, чтобы файлы в FTP-области без атрибута "чтение для всех" не были доступны анонимным FTP-пользователям. Данное свойство используется для тестирования перед выходом новых релизов, для того чтобы удостовериться, что все официальные зеркала содержат все необходимые файлы к моменту официального объявления релиза. ==== Некоторые рекомендуемые установки частоты обновления: * FTP-набор: раз в сутки * WWW-страницы: раз в сутки [[mirror-where]] == С какого сервера синхронизироваться Это важный вопрос, так что мы попытаемся пояснить, откуда берутся ответы. Для начала повторим еще несколько раз: _никогда не синхронизируйтесь с ftp.FreeBSD.org_. [[mirror-where-organization]] === Организация системы зеркал Зеркала организуются по странам. Имена хостов всех официальных зеркал построены по принципу `ftpN.CC.FreeBSD.org`, где _CC_ (country code) - домен верхнего уровня страны, где расположено зеркало, _N_ - номер зеркала в данной стране. Этот же принцип применим к именам хостов `wwwN.CC.FreeBSD.org` и т.п. Кроме того, есть зеркала без доменной части, обозначающей страну. Все они имеют очень хорошие внешние каналы и обслуживают большое число одновременных соединений. Имя `ftp.FreeBSD.org` на самом деле указывает на две машины, одна из которых в настоящее время находится в Дании, а другая в США. Ни одна из этих машин _НЕ_ является основным сайтом, и потому не должна использоваться для синхронизации. Масса документации для "живых" пользователей указывает на `ftp.FreeBSD.org`, так что автоматическим системам ведения зеркал следует выбирать другие источники синхронизации. Кроме того, существует иерархия зеркал в терминах их удаленности от центра, или __слоях__. Основные сайты могут быть описаны как __Зеркала нулевого слоя__. Зеркала, синхронизирующиеся по ним, считаются __слоем 1__, следующие - _слоем 2_ и т.д. Официальные сайты приглашаются на низкие слои, однако следует помнить, что чем меньше номер слоя, тем выше требования к зеркалу, как было описано в <>. Помимо того, доступ к зеркалам 1 слоя может быть ограничен; безусловно ограничен доступ к основным сайтам. Иерархия _слоев_ не отражается в DNS и, вообще говоря, нигде (кроме мастер-сайтов) не документирована. Тем не менее, официальные зеркала с малыми (1-4, как правило) номерами обычно представляют первый слой. (Это грубая оценка, и ни в коем случае не правило). [[mirror-where-where]] === Так откуда же мне синхронизироваться? Главное - НЕ с `ftp.FreeBSD.org`. Короткий ответ: с зеркала, которое расположено недалеко от вас в терминах Интернет, и/или доступ к которому наилучший. [[mirror-where-simple]] ==== Я хочу получить копию зеркала хоть откуда-нибудь! Если у вас нет особых намерений или требований, применимо утверждение в crossref:hubs[mirror-where-where, Так откуда же мне синхронизироваться?]. Это означает: [.procedure] ==== . Выберите те из них, с которыми вам работать быстрее всего (меньшее число промежуточных узлов и время отклика), и которые предоставляют нужные вам сервисы (такие как rsync). . Свяжитесь с администраторами выбранного сервера, опишите ваши запросы и уточните их правила. . Сконфигурируйте ваше зеркало, как описывалось выше. ==== [[mirror-where-official]] ==== Я поддерживаю официальное зеркало, какой сайт мне выбрать? В основном, правила, описанные в crossref:hubs[mirror-where-simple, Я хочу получить копию зеркала хоть откуда-нибудь!], применимы. Дополнительно можно убедиться, что выбранный сайт принадлежит низкому слою. Другие соображения относительно _официальных_ зеркал описаны в <>. [[mirror-where-master]] ==== Мне нужен доступ к основным сайтам! При наличии достаточных причин вы можете получить доступ к одному из основных сайтов. Доступ к ним ограничен; существуют специальные правила их использования. Наличие у вас статуса _официального_ зеркала, безусловно, является хорошим подспорьем. В противном случае убедитесь, что ваша страна действительно нуждается еще в одном зеркале. Если их уже три или более, сначала свяжитесь с администратором соответствующей зоны DNS (mailto:hostmaster@CC.FreeBSD.org[hostmaster@CC.FreeBSD.org]) или напишите в {freebsd-hubs}. Тот, кто помог вам стать _официальным_ зеркалом, должен был помочь вам получить доступ к соответствующему вышестоящему хосту — либо к одному из основных сайтов, либо к подходящему сайту уровня Tier-1. Если этого не произошло, вы можете отправить письмо по адресу mailto:mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org], чтобы запросить помощь в этом вопросе. Существует один основной сайт для синхронизации набора файлов FTP. [[mirror-where-master-ftp]] ===== ftp-master.FreeBSD.org Это основной сервер для синхронизации FTP набора. В дополнение к FTP, `ftp-master.FreeBSD.org` поддерживает доступ по rsync. Использование этих протоколов описано в crossref:hubs[mirror-ftp-rsync, Mirroring the FTP Site]. Приветствуется предоставление зеркалами _1 уровня_ доступа к FTP-области по протоколу rsync. [[mirror-official]] == Официальные зеркала Официальные зеркала обладают следующим свойствами * a) имеют запись в домене `FreeBSD.org` (обычно типа CNAME). * b) присутствуют в списке официальных зеркал в Руководстве по FreeBSD и другой документации. На настоящий момент это все, что отличает их от прочих зеркал. Официальные зеркала не обязательно принадлежат к __Первому уровню__, однако, вряд ли можно найти зеркало __уровня 1__, не являющееся официальным. [[mirror-official-requirements]] === Отдельные требования к официальным зеркалам 1 уровня Описать требования для всех официальных зеркал не так просто, поскольку проект FreeBSD достаточно мягок в этом отношении. Несколько проще указать, что требуется от __официальных зеркал уровня 1__. Прочие официальные зеркала должны рассматривать этот список как __настойчивые пожелания__. Зеркала 1 уровня должны: * поддерживать полный список файлов * предоставлять доступ для других зеркал * обеспечивать доступ по протоколам ftp и rsync -Кроме того, администратор такого зеркала должен быть подписан на {freebsd-hubs}. См. extref:{handbook}[здесь, eresources-mail] для дополнительной информации о подписке. +Кроме того, администратор такого зеркала должен быть подписан на {freebsd-hubs}. См. extref:{handbook}eresources[здесь, eresources-mail] для дополнительной информации о подписке. [IMPORTANT] ==== Очень важно для администратора хаба, особенно администраторов хаба уровня Tier-1, проверять https://www.FreeBSD.org/releng/[график выпусков] следующего релиза FreeBSD. Это важно, потому что это позволит вам узнать, когда запланирован выход следующего релиза, и, таким образом, даст вам время подготовиться к большому всплеску трафика, который последует за ним. Кроме того, важно поддерживать актуальность зеркал (в особенности зеркал уровня 1). Если Зеркало1 не синхронизировалось в течение длительного времени, то зеркала следующего уровня будут синхронизироваться по устаревшей информации и т.д. Поддерживайте актуальность ваших зеркал! ==== [[mirror-official-become]] === Как стать официальным зеркалом? Обратитесь к администраторам кластера, как указано в документации по адресу https://www.FreeBSD.org/administration/#t-clusteradm. [[mirror-statpages]] == Статистика некоторых зеркал Вот ссылки на страницы статистики ваших любимых зеркал (иначе говоря, единственных, кто предоставляет такую статистику). [[mirror-statpagesftp]] === Статистика FTP сайтов * ftp.is.FreeBSD.org - mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD.org] - http://www.rhnet.is/status/draupnir/draupnir.html[ (Bandwidth)] http://www.rhnet.is/status/ftp/ftp-notendur.html[(FTP processes)] http://www.rhnet.is/status/ftp/http-notendur.html[(HTTP processes)] * ftp2.ru.FreeBSD.org - mailto:mirror@macomnet.ru[mirror@macomnet.ru] - http://mirror.macomnet.net/mrtg/mirror.macomnet.net_195.128.64.25.html[(Bandwidth)] http://mirror.macomnet.net/mrtg/mirror.macomnet.net_proc.html[(HTTP and FTP users)] diff --git a/documentation/content/ru/articles/hubs/_index.po b/documentation/content/ru/articles/hubs/_index.po index c5238938d7..f800b6c7d2 100644 --- a/documentation/content/ru/articles/hubs/_index.po +++ b/documentation/content/ru/articles/hubs/_index.po @@ -1,1212 +1,1209 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-02 23:15+0300\n" -"PO-Revision-Date: 2025-09-26 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/articles/hubs/_index.adoc:1 #, no-wrap msgid "The all in one guide for mirroring the FreeBSD website, FTP servers, and more" msgstr "Полное руководство по зеркалированию веб-сайта FreeBSD, FTP-серверов и многого другого" #. type: Title = #: documentation/content/en/articles/hubs/_index.adoc:1 #: documentation/content/en/articles/hubs/_index.adoc:17 #, no-wrap msgid "Mirroring FreeBSD" msgstr "Поддержка зеркал FreeBSD" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:50 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:52 msgid "" "An in-progress article on how to mirror FreeBSD, aimed at hub administrators." msgstr "" "Рабочий вариант статьи, описывающей процесс создания и поддержки зеркала " "FreeBSD и адресованной администраторам зеркал." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:54 msgid "'''" msgstr "'''" #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:60 msgid "We are not accepting new community mirrors at this time." msgstr "На текущий момент заявки на подключение новых зеркал не принимаются." #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:63 #, no-wrap msgid "Contact Information" msgstr "Контактная информация" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:67 msgid "" "The Mirror System Coordinators can be reached through email at mailto:mirror-" "admin@FreeBSD.org[mirror-admin@FreeBSD.org]. There is also a {freebsd-hubs}." msgstr "" -"Координаторы системы зеркал доступны по электронной почте по адресу " -"mailto:mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org]. Помимо этого, " -"существует {freebsd-hubs}." +"Координаторы системы зеркал доступны по электронной почте по адресу mailto:" +"mirror-admin@FreeBSD.org[mirror-admin@FreeBSD.org]. Помимо этого, существует " +"{freebsd-hubs}." #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:69 #, no-wrap msgid "Requirements for FreeBSD Mirrors" msgstr "Требования к зеркалам FreeBSD" #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:72 #, no-wrap msgid "Disk Space" msgstr "Дисковое пространство" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:82 msgid "" "Disk space is one of the most important requirements. Depending on the set " "of releases, architectures, and degree of completeness you want to mirror, a " "huge amount of disk space may be consumed. Also keep in mind that " "_official_ mirrors are probably required to be complete. The web pages " "should always be mirrored completely. Also note that the numbers stated " "here are reflecting the current state (at {rel120-current}-RELEASE/{rel113-" "current}-RELEASE). Further development and releases will only increase the " "required amount. Also make sure to keep some (ca. 10-20%) extra space " "around just to be sure. Here are some approximate figures:" msgstr "" "Одним из наиболее важных требований является дисковое пространство. В " "зависимости от набора релизов, архитектур и степени полноты зеркала вам " "может потребоваться огромный объем диска. Не лишним будет помнить, что " "_официальное_ зеркало, скорее всего, должно быть полным. Веб-страницы всегда " "должны зеркалироваться полностью. Кроме того, учтите, что приводимые оценки " "объема относятся к состоянию на момент последнего редактирования данной " "статьи ({rel120-current}-RELEASE/{rel113-current}-RELEASE). Дальнейший " "процесс разработки и последующие релизы только увеличат требуемый объем. " "Кроме того, разумно будет зарезервировать некоторое (10-20%) дополнительное " "пространство спокойствия ради. Вот некоторые оценки объема:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:84 msgid "Full FTP Distribution: 1.4 TB" msgstr "Полное зеркало FTP: 1.4 TB" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:85 msgid "CTM deltas: 10 GB" msgstr "Комплект изменений CTM: 10 GB" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:86 msgid "Web pages: 1GB" msgstr "Веб-страницы: 1 GB" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:88 msgid "" -"The current disk usage of FTP Distribution can be found at link:ftp://" -"ftp.FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/" -"dir.sizes]." +"The current disk usage of FTP Distribution can be found at link:ftp://ftp." +"FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/dir." +"sizes]." msgstr "" -"Текущее использование диска зеркалом FTP можно посмотреть на link:ftp://" -"ftp.FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/" -"dir.sizes]." +"Текущее использование диска зеркалом FTP можно посмотреть на link:ftp://ftp." +"FreeBSD.org/pub/FreeBSD/dir.sizes[ftp://ftp.FreeBSD.org/pub/FreeBSD/dir." +"sizes]." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:90 #, no-wrap msgid "Network Connection/Bandwidth" msgstr "Требования к сетевой связности и пропускной способности" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:97 msgid "" "Of course, you need to be connected to the Internet. The required bandwidth " "depends on your intended use of the mirror. If you just want to mirror some " "parts of FreeBSD for local use at your site/intranet, the demand may be much " "smaller than if you want to make the files publicly available. If you " "intend to become an official mirror, the bandwidth required will be even " "higher. We can only give rough estimates here:" msgstr "" "Разумеется, у вас должно быть подключение к интернет. Требуемая пропускная " "способность ваших каналов зависит от предполагаемого профиля использования " "вашего зеркала. Если вы собираетесь копировать некоторые части FreeBSD для " "локального использования на вашей машине или в интранете, требования могут " "быть много мягче, чем для публичного зеркала. Для официального зеркала " "необходимая пропускная способность увеличивается еще больше. Мы можем дать " "лишь очень грубые оценки:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:99 msgid "" "Local site, no public access: basically no minimum, but < 2 Mbps could make " "syncing too slow." msgstr "" "Зеркало для локального доступа: фактически минимум не определен, но канал " "шириной менее 2 Mbps может сделать процесс обновления мучительно медленным." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:100 msgid "Unofficial public site: 34 Mbps is probably a good start." msgstr "Неофициальное публичное зеркало: 34 Mbps выглядит неплохо для начала." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:101 msgid "" "Official site: > 100 Mbps is recommended, and your host should be connected " "as close as possible to your border router." msgstr "" "Официальное зеркало: рекомендуется канал шириной более 100 Mbps; кроме того, " "ваша машина должна стоять как можно ближе к граничным маршрутизаторам вашей " "сети." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:103 #, no-wrap msgid "System Requirements, CPU, RAM" msgstr "Системные требования, процессор и память" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:111 msgid "" "One thing this depends on the expected number of clients, which is " "determined by the server's policy. It is also affected by the types of " "services you want to offer. Plain FTP or HTTP services may not require a " "huge amount of resources. Watch out if you provide rsync. This can have a " "huge impact on CPU and memory requirements as it is considered a memory " "hog. The following are just examples to give you a very rough hint." msgstr "" "Эти требования в первую очередь определяются максимальным ожидаемым " "количеством клиентов (устанавливается администратором сервера). Также, на " "требуемые ресурсы влияет список сервисов, которые вы будете предоставлять. " "Зеркала FTP и/или HTTP не требуют особенно много ресурсов. Будьте на чеку, " "если планируете предоставлять rsync. Выбор rsync может иметь огромное " "влияние на требования к аппаратным ресурсам, поскольку rsync признан " "\"прожорливым\" по памяти. Вот некоторые советы по конфигурации аппаратной " "части сервера." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:114 msgid "" "For a moderately visited site that offers rsync, you might consider a " "current CPU with around 800MHz - 1 GHz, and at least 512MB RAM. This is " "probably the minimum you want for an _official_ site." msgstr "" "Для умеренно посещаемого сайта, предоставляющего rsync, можно использовать " "процессор с частотой 800MHz - 1 GHz и по крайней мере 512MB памяти. Скорее " "всего, данная конфигурация может считаться минимальной для _официального_ " "зеркала." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:116 msgid "" "For a frequently used site you definitely need more RAM (consider 2GB as a " "good start) and possibly more CPU, which could also mean that you need to go " "for a SMP system." msgstr "" "Для регулярно посещаемого сайта вам потребуется больше памяти (хорошим " "стартом будет 2GB) и больше процессорной мощности, что может означать " "требование многопроцессорной (SMP) платформы." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:120 msgid "" "You also want to consider a fast disk subsystem. Operations on the SVN " "repository require a fast disk subsystem (RAID is highly advised). A SCSI " "controller that has a cache of its own can also speed up things since most " "of these services incur a large number of small modifications to the disk." msgstr "" "Кроме того, вам потребуется быстрая дисковая подсистема, в первую очередь, " "для работы с репозиторием SVN (крайне рекомендуем RAID). Контроллер SCSI, " "оборудованный собственной памятью, также может ощутимо ускорить процесс, " "поскольку большая часть сервисов связана с большим количеством дисковых " "запросов небольшого размера." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:122 #, no-wrap msgid "Services to Offer" msgstr "Предоставляемые сервисы" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:127 msgid "" "Every mirror site is required to have a set of core services available. In " "addition to these required services, there are a number of optional services " "that server administrators may choose to offer. This section explains which " "services you can provide and how to go about implementing them." msgstr "" "Всякое зеркало должно предоставлять набор основных сервисов. Помимо " "требуемого минимального набора, существуют дополнительные сервисы, которые " "администратор сервера может пожелать предоставлять. Этот раздел описывает, " "какие сервисы вы можете предоставлять, и какие действия для этого " "потребуются от вас." #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:129 #, no-wrap msgid "FTP (required for FTP Fileset)" msgstr "FTP (требуется для FTP зеркала)" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:135 msgid "" "This is one of the most basic services, and it is required for each mirror " "offering public FTP distributions. FTP access must be anonymous, and no " "upload/download ratios are allowed (a ridiculous thing anyway). Upload " "capability is not required (and _must_ never be allowed for the FreeBSD file " -"space). Also the FreeBSD archive should be available under the path " -"[.filename]#/pub/FreeBSD#." +"space). Also the FreeBSD archive should be available under the path [." +"filename]#/pub/FreeBSD#." msgstr "" "Это один из наиболее базовых сервисов; его предоставление требуется для " "каждого зеркала, распространяющего файлы FreeBSD по FTP. Доступ по FTP " "должен быть анонимным, и не должны применяться какие-либо ограничения по " "соотношению объема передано/принято (что вообще является, на наш взгляд, " "странным подходом). Закачка (upload) файлов на сервер не требуется (и " "_должна_ быть запрещена в разделе FreeBSD). Кроме того, архив файлов FreeBSD " "должен быть доступен с путем [.filename]#/pub/FreeBSD#." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:137 msgid "" "There is a lot of software available which can be set up to allow anonymous " "FTP (in alphabetical order)." msgstr "" "Для предоставления анонимного FTP доступа может быть использован целый ряд " "программ (перечислены в алфавитном порядке)." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:139 msgid "" -"`/usr/libexec/ftpd`: FreeBSD's own ftpd can be used. Be sure to read " -"man:ftpd[8]." +"`/usr/libexec/ftpd`: FreeBSD's own ftpd can be used. Be sure to read man:" +"ftpd[8]." msgstr "" -"`/usr/libexec/ftpd`: базовый FTP-даемон FreeBSD. Не забудьте прочитать " -"man:ftpd[8]." +"`/usr/libexec/ftpd`: базовый FTP-даемон FreeBSD. Не забудьте прочитать man:" +"ftpd[8]." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:140 msgid "package:ftp/ncftpd[]: A commercial package, free for educational use." msgstr "" "package:ftp/ncftpd[]: коммерческий пакет, свободен для использования в " "учебных целях." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:141 msgid "package:ftp/oftpd[]: An ftpd designed with security as a main focus." msgstr "" "package:ftp/oftpd[]: FTP-даемон, написанный в основном с точки зрения " "защищенности." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:142 msgid "package:ftp/proftpd[]: A modular and very flexible ftpd." msgstr "package:ftp/proftpd[]: Модульный и очень гибкий FTP-даемон." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:143 msgid "package:ftp/pure-ftpd[]: Another ftpd developed with security in mind." msgstr "" "package:ftp/pure-ftpd[]: Еще один FTP-даемон, разработанный с позиций " "защищенности." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:144 msgid "package:ftp/twoftpd[]: As above." msgstr "package:ftp/twoftpd[]: См. предыдущий пункт." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:145 msgid "package:ftp/vsftpd[]: The \"very secure\" ftpd." msgstr "package:ftp/vsftpd[]: \"очень защищенный\" (\"very secure\") ftpd." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:149 msgid "" "FreeBSD's `ftpd`, `proftpd` and maybe `ncftpd` are among the most commonly " "used FTPds. The others do not have a large userbase among mirror sites. " "One thing to consider is that you may need flexibility in limiting how many " "simultaneous connections are allowed, thus limiting how much network " "bandwidth and system resources are consumed." msgstr "" "ftpd, proftpd и, возможно, ncftpd являются наиболее часто встречающимися FTP " "серверами. Прочие распространены среди существующих зеркал в существенно " "меньшей степени. Дополнительным поводом для рассмотрения может являться " "возможность гибко ограничивать количество одновременных соединений, что " "поможет вам удержать в нужных рамках потребление пропускной способности " "ваших каналов и машинные ресурсы." #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:151 #, no-wrap msgid "Rsync (optional for FTP Fileset)" msgstr "Rsync (необязательный сервис для FTP зеркала)" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:161 msgid "" "Rsync is often offered for access to the contents of the FTP area of " "FreeBSD, so other mirror sites can use your system as their source. The " "protocol is different from FTP in many ways. It is much more bandwidth " "friendly, as only differences between files are transferred instead of whole " "files when they change. Rsync does require a significant amount of memory " "for each instance. The size depends on the size of the synced module in " "terms of the number of directories and files. Rsync can use `rsh` and `ssh` " "(now default) as a transport, or use its own protocol for stand-alone access " "(this is the preferred method for public rsync servers). Authentication, " "connection limits, and other restrictions may be applied. There is just one " "software package available:" msgstr "" "rsync часто используется для предоставления доступа к FTP-области FreeBSD, " "чтобы другие зеркала могли синхронизироваться по вашему. Протокол rsync во " "многом отличается от FTP, в частности, он гораздо гуманнее с точки зрения " "пропускной способности каналов, поскольку не требует передачи измененного " "файла целиком (передаются лишь различия). Взамен rsync требует значительных " "объемов памяти. Размер каждого процесса зависит от размера синхронизируемого " "модуля (в основном от количества директорий и файлов). rsync может " "использовать в качестве транспортного протокола `rsh` или `ssh` (по " "умолчанию); также, может использоваться внутренний протокол rsync (этот " "метод предпочтителен для публичных rsync-серверов). Поддерживается " "авторизация клиентов и различные ограничения. Для протокола rsync существует " "единственный пакет:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:163 msgid "package:net/rsync[]" msgstr "package:net/rsync[]" #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:165 #, no-wrap msgid "HTTP (required for Web Pages, Optional for FTP Fileset)" msgstr "HTTP (требуется для веб-страниц, дополнителен для FTP зеркал)" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:171 msgid "" "If you want to offer the FreeBSD web pages, you will need to install a web " "server. You may optionally offer the FTP fileset via HTTP. The choice of " "web server software is left up to the mirror administrator. Some of the " "most popular choices are:" msgstr "" "Если вы хотите поддерживать зеркало веб-страниц FreeBSD, вам потребуется " "установить веб-сервер. Дополнительно, вы можете предоставлять HTTP доступ к " "FTP-набору файлов FreeBSD. Выбор веб-сервера остается на усмотрение " "администратора зеркала. Некоторые из наиболее популярных веб-серверов " "перечислены ниже:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:173 msgid "" "package:www/apache24[]: Apache is still one of the most widely deployed web " "servers on the Internet. It is used extensively by the FreeBSD Project." msgstr "" "package:www/apache24[]: Apache - самый широко распространённый в Интернете " "веб-сервер, активно используемый проектом FreeBSD." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:174 msgid "" "package:www/boa[]: Boa is a single-tasking HTTP server. Unlike traditional " "web servers, it does not fork for each incoming connection, nor does it fork " "many copies of itself to handle multiple connections. Although, it should " "provide considerably great performance for purely static content." msgstr "" "package:www/boa[]: Boa - это однозадачный HTTP-сервер. В отличие от " "традиционных веб-серверов, он не создает отдельные процессы для каждого " "входящего соединения и не запускает множество копий самого себя для " "обработки множества соединений. Тем не менее, он должен обеспечивать " "значительно более высокую производительность для чисто статического контента." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:175 msgid "" "package:www/cherokee[]: Cherokee is a very fast, flexible and easy to " "configure web server. It supports the widespread technologies nowadays: " "FastCGI, SCGI, PHP, CGI, SSL/TLS encrypted connections, vhosts, users " "authentication, on the fly encoding and load balancing. It also generates " "Apache compatible log files." msgstr "" "package:www/cherokee[]: Cherokee — это очень быстрый, гибкий и простой в " "настройке веб-сервер. Он поддерживает распространённые современные " "технологии: FastCGI, SCGI, PHP, CGI, SSL/TLS-шифрование соединений, " "виртуальные хосты, аутентификацию пользователей, динамическое кодирование и " "балансировку нагрузки. Также он генерирует журналы, совместимые с Apache." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:176 msgid "" "package:www/lighttpd[]: lighttpd is a secure, fast, compliant and very " "flexible web server which has been optimized for high-performance " "environments. It has a very low memory footprint compared to other web " "servers and takes care of cpu-load." msgstr "" "package:www/lighttpd[]: lighttpd — это безопасный, быстрый, совместимый и " "очень гибкий веб-сервер, оптимизированный для высокопроизводительных сред. " "По сравнению с другими веб-серверами, он имеет очень низкое потребление " "памяти и эффективно распределяет нагрузку на процессор." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:177 msgid "" "package:www/nginx[]: nginx is a high performance edge web server with a low " "memory footprint and key features to build a modern and efficient web " "infrastructure. Features include a HTTP server, HTTP and mail reverse proxy, " "caching, load balancing, compression, request throttling, connection " "multiplexing and reuse, SSL offload and HTTP media streaming." msgstr "" "package:www/nginx[]: nginx — это высокопроизводительный веб-сервер с низким " "потреблением памяти и ключевыми функциями для построения современной и " "эффективной веб-инфраструктуры. Возможности включают HTTP-сервер, обратный " "прокси для HTTP и почты, кэширование, балансировку нагрузки, сжатие, " "ограничение запросов, мультиплексирование и повторное использование " "соединений, выгрузку SSL и потоковую передачу HTTP-медиа." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:178 msgid "" "package:www/thttpd[]: If you are going to be serving a large amount of " "static content you may find that using an application such as thttpd is more " "efficient than others. It is also optimized for excellent performance on " "FreeBSD." msgstr "" "package:www/thttpd[]: Если вам необходимо обслуживать большое количество " "статического контента, вы можете обнаружить, что использование приложения, " "такого как thttpd, более эффективно по сравнению с другими. Оно также " "оптимизировано для отличной производительности в FreeBSD." #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:180 #, no-wrap msgid "How to Mirror FreeBSD" msgstr "Как вести зеркало FreeBSD" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:184 msgid "" "Ok, now you know the requirements and how to offer the services, but not how " "to get it. :-) This section explains how to actually mirror the various " "parts of FreeBSD, what tools to use, and where to mirror from." msgstr "" "Теперь вам известно, какая потребуется машина и как предоставлять сервисы, " "но не как получить их самому. :-) В этом разделе описывается процесс ведения " "зеркала и поддержания его в актуальном состоянии, в том числе какие " "инструменты использовать и какие сайты выбирать в качестве источников для " "синхронизации." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:186 #, no-wrap msgid "Mirroring the FTP Site" msgstr "Зеркалирование FTP-области" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:191 msgid "" "The FTP area is the largest amount of data that needs to be mirrored. It " "includes the _distribution sets_ required for network installation, the " "_branches_ which are actually snapshots of checked-out source trees, the " "_ISO Images_ to write CD-ROMs with the installation distribution, a live " "file system, and a snapshot of the ports tree. All of course for various " "FreeBSD versions, and various architectures." msgstr "" "Файлы, доступные по FTP, составляют большую часть зеркала. Они включают " "__дистрибутивные наборы__, необходимые для установки по сети, __ветви " "(branches)__, в которых отражено текущее состояние исходных текстов, _образы " "ISO_ для записи компакт-дисков с дистрибутивами для установки, образами " "\"живых\" файловых систем и пакетами, дерево портов, исходные дистрибутивы " "для сборки портов и кучу готовых пакетов. И, разумеется, все вышеописанное - " "для разных версий FreeBSD и различных архитектур." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:197 msgid "" "The best way to mirror the FTP area is rsync. You can install the port " "package:net/rsync[] and then use rsync to sync with your upstream host. " "rsync is already mentioned in crossref:hubs[mirror-serv-rsync, Rsync " "(optional for FTP Fileset)]. Since rsync access is not required, your " "preferred upstream site may not allow it. You may need to hunt around a " "little bit to find a site that allows rsync access." msgstr "" "Наиболее эффективным будет синхронизация FTP-области при помощи rsync. Для " "этого следует установить пакет package:net/rsync[], который был описан в " "разделе <>. Поскольку доступ по протоколу rsync не " "является обязательным, выбранный вами сайт может его не поддерживать. " "Возможно, вам придется немного поискать в сетевой окрестности зеркало, " "поддерживающее rsync." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:202 msgid "" "Since the number of rsync clients will have a significant impact on the " "server machine, most admins impose limitations on their server. For a " "mirror, you should ask the site maintainer you are syncing from about their " "policy, and maybe an exception for your host (since you are a mirror)." msgstr "" "Поскольку от количества клиентов rsync ощутимо зависит загрузка сервера, " "большинство администраторов вводят ограничения доступа. Для поддержания " "зеркала вам следует связаться с администратором сайта, с которым вы будете " "синхронизироваться, для уточнения локальных правил и, возможно, для внесения " "в них исключения для вас (поскольку вы также поддерживаете зеркало)." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:205 msgid "A command line to mirror FreeBSD might look like:" msgstr "Строка для синхронизации FreeBSD по rsync выглядит примерно так:" #. type: delimited block . 4 #: documentation/content/en/articles/hubs/_index.adoc:209 #, no-wrap msgid "% rsync -vaHz --delete rsync://ftp4.de.FreeBSD.org/FreeBSD/ /pub/FreeBSD/\n" msgstr "% rsync -vaHz --delete rsync://ftp4.de.FreeBSD.org/FreeBSD/ /pub/FreeBSD/\n" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:213 msgid "" -"Consult the documentation for rsync, which is also available at http://" -"rsync.samba.org/[http://rsync.samba.org/], about the various options to be " -"used with rsync. If you sync the whole module (unlike subdirectories), be " -"aware that the module-directory (here \"FreeBSD\") will not be created, so " -"you cannot omit the target directory. Also you might want to set up a script " +"Consult the documentation for rsync, which is also available at http://rsync." +"samba.org/[http://rsync.samba.org/], about the various options to be used " +"with rsync. If you sync the whole module (unlike subdirectories), be aware " +"that the module-directory (here \"FreeBSD\") will not be created, so you " +"cannot omit the target directory. Also you might want to set up a script " "framework that calls such a command via man:cron[8]." msgstr "" -"Загляните в документацию по rsync, также доступную по адресу http://" -"rsync.samba.org/[http://rsync.samba.org/] за дополнительной информацией по " +"Загляните в документацию по rsync, также доступную по адресу http://rsync." +"samba.org/[http://rsync.samba.org/] за дополнительной информацией по " "различным опциям rsync. Обратите внимание, что в случае синхронизации модуля " "целиком (а не отдельного каталога) необходимо явно указать результирующий " "каталог, потому что каталог с именем модуля (в данном случае \"FreeBSD\") не " "создается. Для поддержания актуальности вам потребуется создать скрипт для " "запуска подобной команды из man:cron[8]." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:215 #, no-wrap msgid "Mirroring the WWW Pages" msgstr "Зеркалирование страниц WWW" #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:220 msgid "" "Since doc migration to Hugo/Asciidoctor on 2021-01-25, mirroring the website " "with rsync no longer works." msgstr "" "После перевода документации на Hugo/Asciidoctor 2021-01-25, зеркалирование " "веб-сайта с помощью rsync больше не работает." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:223 msgid "" "There are ongoing studies to implement a website mirror with the extref:" "{handbook}mirrors/[official infrastructure]." msgstr "" "Ведутся исследования по реализации зеркала веб-сайта с использованием extref:" "{handbook}mirrors/[официальной инфраструктуры]." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:225 msgid "" "For the former website mirrors, a way to achieve mirroring the website today " "is building the website locally with the corresponding address it will be " "hosted." msgstr "" "Для прежних зеркал веб-сайтов способ достичь зеркалирования сегодня — это " "собрать веб-сайт локально с соответствующим адресом, на котором он будет " "размещён." #. type: delimited block . 4 #: documentation/content/en/articles/hubs/_index.adoc:229 #, no-wrap msgid "% cd website && env HUGO_baseURL=\"https://www.XX.freebsd.org/\" make\n" msgstr "% cd website && env HUGO_baseURL=\"https://www.XX.freebsd.org/\" make\n" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:232 msgid "" "Check for more details about the build tools on extref:{fdp-primer}overview/" "[FreeBSD Documentation Project Primer for New Contributors, overview-quick-" "start] book." msgstr "" "Проверьте дополнительные сведения о инструментах сборки в extref:{fdp-primer}" "overview/[Проект документации FreeBSD: введение для новых участников, " "overview-quick-start]." #. [source,shell] #. .... #. % rsync -vaHz --delete rsync://bit0.us-west.freebsd.org/FreeBSD-www-data/ /usr/local/www/ #. .... #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:243 msgid "" "Notice the website was split into www.FreeBSD.org and docs.FreeBSD.org, and " "there are links between them; plus, at this moment, `HUGO_baseURL` variable " "won't cover all links, this way, mirroring the website is discouraged." msgstr "" -"Обратите внимание, что сайт был разделён на www.FreeBSD.org и " -"docs.FreeBSD.org, и между ними есть ссылки; кроме того, на данный момент " -"переменная `HUGO_baseURL` не охватывает все ссылки, поэтому зеркалирование " -"сайта не рекомендуется." +"Обратите внимание, что сайт был разделён на www.FreeBSD.org и docs.FreeBSD." +"org, и между ними есть ссылки; кроме того, на данный момент переменная " +"`HUGO_baseURL` не охватывает все ссылки, поэтому зеркалирование сайта не " +"рекомендуется." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:246 #, no-wrap msgid "Mirroring Packages" msgstr "Зеркалирование пакетов" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:251 msgid "" "Due to very high requirements of bandwidth, storage and administration the " "FreeBSD Project has decided not to allow public mirrors of packages. For " "sites with lots of machines, it might be advantagous to run a caching HTTP " "proxy for the man:pkg[8] process. Alternatively specific packages and their " "dependencies can be fetched by running something like the following:" msgstr "" "Из-за очень высоких требований к пропускной способности, хранилищу и " "администрированию проект FreeBSD принял решение не разрешать публичные " "зеркала пакетов. Для сайтов с большим количеством машин может быть выгодно " "запустить кэширующий HTTP-прокси для процесса man:pkg[8]. Или конкретные " "пакеты и их зависимости можно загрузить, выполнив что-то вроде следующего:" #. type: delimited block . 4 #: documentation/content/en/articles/hubs/_index.adoc:255 #, no-wrap msgid "% pkg fetch -d -o /usr/local/mirror vim\n" msgstr "% pkg fetch -d -o /usr/local/mirror vim\n" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:258 msgid "" "Once those packages have been fetched, the repository metadata must be " "generated by running:" msgstr "" "После загрузки этих пакетов необходимо сгенерировать метаданные репозитория, " "выполнив:" #. type: delimited block . 4 #: documentation/content/en/articles/hubs/_index.adoc:262 #, no-wrap msgid "% pkg repo /usr/local/mirror\n" msgstr "% pkg repo /usr/local/mirror\n" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:266 msgid "" "Once the packages have been fetched and the metadata for the repository has " "been generated, serve the packages up to the client machines via HTTP. For " "additional information see the man pages for man:pkg[8], specifically the " "man:pkg-repo[8] page." msgstr "" "После загрузки пакетов и генерации метаданных репозитория предоставьте " "пакеты клиентским машинам через HTTP. Дополнительную информацию можно найти " "на man-страницах man:pkg[8], в частности на странице man:pkg-repo[8]." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:268 #, no-wrap msgid "How Often Should I Mirror?" msgstr "Как часто синхронизироваться?" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:274 msgid "" "Every mirror should be updated at a minimum of once per day. Certainly a " "script with locking to prevent multiple runs happening at the same time will " "be needed to run from man:cron[8]. Since nearly every admin does this in " "their own way, specific instructions cannot be provided. It could work " "something like this:" msgstr "" "Каждое зеркало должно обновляться как минимум раз в день. Конечно, " "потребуется скрипт с блокировкой, чтобы предотвратить одновременный запуск " "нескольких копий, который будет запускаться из man:cron[8]. Поскольку почти " "каждый администратор делает это по-своему, конкретные инструкции " "предоставить невозможно. Это может работать примерно так:" #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:278 msgid "" "Put the command to run your mirroring application in a script. Use of a " "plain `/bin/sh` script is recommended." msgstr "" "Создайте скрипт с командой, которая запустит нужное приложение для " "обновления зеркала. Рекомендуем использовать скрипт на языке обычного `/bin/" "sh`." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:279 msgid "" "Add some output redirections so diagnostic messages are logged to a file." msgstr "" "Добавьте команд перенаправления вывода, чтобы записать диагностику работы в " "файл." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:280 msgid "Test if your script works. Check the logs." msgstr "Попробуйте, как ваш скрипт работает. По завершении проверьте журналы." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:281 msgid "" -"Use man:crontab[1] to add the script to the appropriate user's " -"man:crontab[5]. This should be a different user than what your FTP daemon " -"runs as so that if file permissions inside your FTP area are not world-" -"readable those files cannot be accessed by anonymous FTP. This is used to " -"\"stage\" releases - making sure all of the official mirror sites have all " -"of the necessary release files on release day." +"Use man:crontab[1] to add the script to the appropriate user's man:" +"crontab[5]. This should be a different user than what your FTP daemon runs " +"as so that if file permissions inside your FTP area are not world-readable " +"those files cannot be accessed by anonymous FTP. This is used to \"stage\" " +"releases - making sure all of the official mirror sites have all of the " +"necessary release files on release day." msgstr "" "При помощи утилиты man:crontab[1] добавьте ваш скрипт в таблицу регулярных " "заданий man:crontab[5] соответствующего пользователя. Это должен быть " "пользователь, отличный от пользователя FTP-даемона, чтобы файлы в FTP-" "области без атрибута \"чтение для всех\" не были доступны анонимным FTP-" "пользователям. Данное свойство используется для тестирования перед выходом " "новых релизов, для того чтобы удостовериться, что все официальные зеркала " "содержат все необходимые файлы к моменту официального объявления релиза." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:284 msgid "Here are some recommended schedules:" msgstr "Некоторые рекомендуемые установки частоты обновления:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:286 msgid "FTP fileset: daily" msgstr "FTP-набор: раз в сутки" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:287 msgid "WWW pages: daily" msgstr "WWW-страницы: раз в сутки" #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:289 #, no-wrap msgid "Where to Mirror From" msgstr "С какого сервера синхронизироваться" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:294 msgid "" "This is an important issue. So this section will spend some effort to " "explain the backgrounds. We will say this several times: under no " "circumstances should you mirror from `ftp.FreeBSD.org`." msgstr "" "Это важный вопрос, так что мы попытаемся пояснить, откуда берутся ответы. " -"Для начала повторим еще несколько раз: _никогда не синхронизируйтесь с " -"ftp.FreeBSD.org_." +"Для начала повторим еще несколько раз: _никогда не синхронизируйтесь с ftp." +"FreeBSD.org_." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:296 #, no-wrap msgid "A few Words About the Organization" msgstr "Организация системы зеркал" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:307 msgid "" "Mirrors are organized by country. All official mirrors have a DNS entry of " "the form `ftpN.CC.FreeBSD.org`. _CC_ (i.e., country code) is the _top level " "domain_ (TLD) of the country where this mirror is located. _N_ is a number, " "telling that the host would be the _Nth_ mirror in that country. (Same " "applies to `wwwN.CC.FreeBSD.org`, etc.) There are mirrors with no _CC_ " "part. These are the mirror sites that are very well connected and allow a " "large number of concurrent users. `ftp.FreeBSD.org` is actually two " "machines, one currently located in Denmark and the other in the United " "States. It is _NOT_ a master site and should never be used to mirror from. " "Lots of online documentation leads \"interactive\"users to `ftp.FreeBSD.org` " "so automated mirroring systems should find a different machine to mirror " "from." msgstr "" "Зеркала организуются по странам. Имена хостов всех официальных зеркал " "построены по принципу `ftpN.CC.FreeBSD.org`, где _CC_ (country code) - домен " "верхнего уровня страны, где расположено зеркало, _N_ - номер зеркала в " -"данной стране. Этот же принцип применим к именам хостов " -"`wwwN.CC.FreeBSD.org` и т.п. Кроме того, есть зеркала без доменной части, " -"обозначающей страну. Все они имеют очень хорошие внешние каналы и " -"обслуживают большое число одновременных соединений. Имя `ftp.FreeBSD.org` на " -"самом деле указывает на две машины, одна из которых в настоящее время " -"находится в Дании, а другая в США. Ни одна из этих машин _НЕ_ является " -"основным сайтом, и потому не должна использоваться для синхронизации. Масса " -"документации для \"живых\" пользователей указывает на `ftp.FreeBSD.org`, так " -"что автоматическим системам ведения зеркал следует выбирать другие источники " +"данной стране. Этот же принцип применим к именам хостов `wwwN.CC.FreeBSD." +"org` и т.п. Кроме того, есть зеркала без доменной части, обозначающей " +"страну. Все они имеют очень хорошие внешние каналы и обслуживают большое " +"число одновременных соединений. Имя `ftp.FreeBSD.org` на самом деле " +"указывает на две машины, одна из которых в настоящее время находится в " +"Дании, а другая в США. Ни одна из этих машин _НЕ_ является основным сайтом, " +"и потому не должна использоваться для синхронизации. Масса документации для " +"\"живых\" пользователей указывает на `ftp.FreeBSD.org`, так что " +"автоматическим системам ведения зеркал следует выбирать другие источники " "синхронизации." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:317 msgid "" "Additionally there exists a hierarchy of mirrors, which is described in " "terms of __tiers__. The master sites are not referred to but can be " "described as __Tier-0__. Mirrors that mirror from these sites can be " "considered __Tier-1__, mirrors of __Tier-1__-mirrors, are __Tier-2__, etc. " "Official sites are encouraged to be of a low __tier__, but the lower the " -"tier the higher the requirements in terms as described in " -"crossref:hubs[mirror-requirements, Requirements for FreeBSD Mirrors]. Also " -"access to low-tier-mirrors may be restricted, and access to master sites is " -"definitely restricted. The __tier__-hierarchy is not reflected by DNS and " -"generally not documented anywhere except for the master sites. However, " -"official mirrors with low numbers like 1-4, are usually _Tier-1_ (this is " -"just a rough hint, and there is no rule)." +"tier the higher the requirements in terms as described in crossref:" +"hubs[mirror-requirements, Requirements for FreeBSD Mirrors]. Also access to " +"low-tier-mirrors may be restricted, and access to master sites is definitely " +"restricted. The __tier__-hierarchy is not reflected by DNS and generally " +"not documented anywhere except for the master sites. However, official " +"mirrors with low numbers like 1-4, are usually _Tier-1_ (this is just a " +"rough hint, and there is no rule)." msgstr "" "Кроме того, существует иерархия зеркал в терминах их удаленности от центра, " "или __слоях__. Основные сайты могут быть описаны как __Зеркала нулевого " "слоя__. Зеркала, синхронизирующиеся по ним, считаются __слоем 1__, следующие " "- _слоем 2_ и т.д. Официальные сайты приглашаются на низкие слои, однако " "следует помнить, что чем меньше номер слоя, тем выше требования к зеркалу, " "как было описано в <>. Помимо того, доступ к зеркалам 1 " "слоя может быть ограничен; безусловно ограничен доступ к основным сайтам. " "Иерархия _слоев_ не отражается в DNS и, вообще говоря, нигде (кроме мастер-" "сайтов) не документирована. Тем не менее, официальные зеркала с малыми (1-4, " "как правило) номерами обычно представляют первый слой. (Это грубая оценка, и " "ни в коем случае не правило)." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:319 #, no-wrap msgid "Ok, but Where Should I get the Stuff Now?" msgstr "Так откуда же мне синхронизироваться?" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:323 msgid "" "Under no circumstances should you mirror from `ftp.FreeBSD.org`. The short " "answer is: from the site that is closest to you in Internet terms, or gives " "you the fastest access." msgstr "" "Главное - НЕ с `ftp.FreeBSD.org`. Короткий ответ: с зеркала, которое " "расположено недалеко от вас в терминах Интернет, и/или доступ к которому " "наилучший." #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:325 #, no-wrap msgid "I Just Want to Mirror from Somewhere!" msgstr "Я хочу получить копию зеркала хоть откуда-нибудь!" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:330 msgid "" -"If you have no special intentions or requirements, the statement in " -"crossref:hubs[mirror-where-where, Ok, but Where Should I get the Stuff Now?] " +"If you have no special intentions or requirements, the statement in crossref:" +"hubs[mirror-where-where, Ok, but Where Should I get the Stuff Now?] " "applies. This means:" msgstr "" "Если у вас нет особых намерений или требований, применимо утверждение в " "crossref:hubs[mirror-where-where, Так откуда же мне синхронизироваться?]. " "Это означает:" #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:334 msgid "" "Check for those which provide fastest access (number of hops, round-trip-" "times) and offer the services you intend to use (like rsync)." msgstr "" "Выберите те из них, с которыми вам работать быстрее всего (меньшее число " "промежуточных узлов и время отклика), и которые предоставляют нужные вам " "сервисы (такие как rsync)." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:335 msgid "" "Contact the administrators of your chosen site stating your request, and " "asking about their terms and policies." msgstr "" "Свяжитесь с администраторами выбранного сервера, опишите ваши запросы и " "уточните их правила." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:336 msgid "Set up your mirror as described above." msgstr "Сконфигурируйте ваше зеркало, как описывалось выше." #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:339 #, no-wrap msgid "I am an Official Mirror, What is the Right Site for Me?" msgstr "Я поддерживаю официальное зеркало, какой сайт мне выбрать?" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:345 msgid "" "In general the description in crossref:hubs[mirror-where-simple, I Just Want " "to Mirror from Somewhere!] still applies. Of course you may want to put " "some weight on the fact that your upstream should be of a low tier. There " "are some other considerations about _official_ mirrors that are described in " "crossref:hubs[mirror-official, Official Mirrors]." msgstr "" "В основном, правила, описанные в crossref:hubs[mirror-where-simple, Я хочу " "получить копию зеркала хоть откуда-нибудь!], применимы. Дополнительно можно " "убедиться, что выбранный сайт принадлежит низкому слою. Другие соображения " "относительно _официальных_ зеркал описаны в <>." #. type: Title ==== #: documentation/content/en/articles/hubs/_index.adoc:347 #, no-wrap msgid "I Want to Access the Master Sites!" msgstr "Мне нужен доступ к основным сайтам!" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:354 msgid "" "If you have good reasons and good prerequisites, you may want and get access " "to one of the master sites. Access to these sites is generally restricted, " "and there are special policies for access. If you are already an _official_ " "mirror, this certainly helps you getting access. In any other case make " "sure your country really needs another mirror. If it already has three or " -"more, ask the \"zone administrator\" " -"(mailto:hostmaster@CC.FreeBSD.org[hostmaster@CC.FreeBSD.org]) or {freebsd-" -"hubs} first." +"more, ask the \"zone administrator\" (mailto:hostmaster@CC.FreeBSD." +"org[hostmaster@CC.FreeBSD.org]) or {freebsd-hubs} first." msgstr "" "При наличии достаточных причин вы можете получить доступ к одному из " "основных сайтов. Доступ к ним ограничен; существуют специальные правила их " "использования. Наличие у вас статуса _официального_ зеркала, безусловно, " "является хорошим подспорьем. В противном случае убедитесь, что ваша страна " "действительно нуждается еще в одном зеркале. Если их уже три или более, " -"сначала свяжитесь с администратором соответствующей зоны DNS " -"(mailto:hostmaster@CC.FreeBSD.org[hostmaster@CC.FreeBSD.org]) или напишите в " +"сначала свяжитесь с администратором соответствующей зоны DNS (mailto:" +"hostmaster@CC.FreeBSD.org[hostmaster@CC.FreeBSD.org]) или напишите в " "{freebsd-hubs}." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:357 msgid "" "Whoever helped you become, an _official_ should have helped you gain access " "to an appropriate upstream host, either one of the master sites or a " "suitable Tier-1 site. If not, you can send email to mailto:mirror-" "admin@FreeBSD.org[mirror-admin@FreeBSD.org] to request help with that." msgstr "" "Тот, кто помог вам стать _официальным_ зеркалом, должен был помочь вам " "получить доступ к соответствующему вышестоящему хосту — либо к одному из " "основных сайтов, либо к подходящему сайту уровня Tier-1. Если этого не " -"произошло, вы можете отправить письмо по адресу mailto:mirror-" -"admin@FreeBSD.org[mirror-admin@FreeBSD.org], чтобы запросить помощь в этом " -"вопросе." +"произошло, вы можете отправить письмо по адресу mailto:mirror-admin@FreeBSD." +"org[mirror-admin@FreeBSD.org], чтобы запросить помощь в этом вопросе." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:359 msgid "There is one master site for the FTP fileset." msgstr "Существует один основной сайт для синхронизации набора файлов FTP." #. type: Title ===== #: documentation/content/en/articles/hubs/_index.adoc:361 #, no-wrap msgid "ftp-master.FreeBSD.org" msgstr "ftp-master.FreeBSD.org" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:364 msgid "This is the master site for the FTP fileset." msgstr "Это основной сервер для синхронизации FTP набора." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:367 msgid "" "`ftp-master.FreeBSD.org` provides rsync access, in addition to FTP. Refer " "to crossref:hubs[mirror-ftp-rsync, Mirroring the FTP Site]." msgstr "" "В дополнение к FTP, `ftp-master.FreeBSD.org` поддерживает доступ по rsync. " "Использование этих протоколов описано в crossref:hubs[mirror-ftp-rsync, " "Mirroring the FTP Site]." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:369 msgid "" "Mirrors are also encouraged to allow rsync access for the FTP contents, " "since they are __Tier-1__-mirrors." msgstr "" "Приветствуется предоставление зеркалами _1 уровня_ доступа к FTP-области по " "протоколу rsync." #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:371 #, no-wrap msgid "Official Mirrors" msgstr "Официальные зеркала" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:374 msgid "Official mirrors are mirrors that" msgstr "Официальные зеркала обладают следующим свойствами" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:376 msgid "a) have a `FreeBSD.org` DNS entry (usually a CNAME)." msgstr "a) имеют запись в домене `FreeBSD.org` (обычно типа CNAME)." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:377 msgid "" "b) are listed as an official mirror in the FreeBSD documentation (like " "handbook)." msgstr "" "b) присутствуют в списке официальных зеркал в Руководстве по FreeBSD и " "другой документации." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:380 msgid "" "So far to distinguish official mirrors. Official mirrors are not necessarily " "__Tier-1__-mirrors. However you probably will not find a __Tier-1__-mirror, " "that is not also official." msgstr "" "На настоящий момент это все, что отличает их от прочих зеркал. Официальные " "зеркала не обязательно принадлежат к __Первому уровню__, однако, вряд ли " "можно найти зеркало __уровня 1__, не являющееся официальным." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:382 #, no-wrap msgid "Special Requirements for Official (tier-1) Mirrors" msgstr "Отдельные требования к официальным зеркалам 1 уровня" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:387 msgid "" "It is not so easy to state requirements for all official mirrors, since the " "project is sort of tolerant here. It is more easy to say, what _official " "tier-1 mirrors_ are required to. All other official mirrors can consider " "this a big __should__." msgstr "" "Описать требования для всех официальных зеркал не так просто, поскольку " "проект FreeBSD достаточно мягок в этом отношении. Несколько проще указать, " "что требуется от __официальных зеркал уровня 1__. Прочие официальные зеркала " "должны рассматривать этот список как __настойчивые пожелания__." #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:389 msgid "Tier-1 mirrors are required to:" msgstr "Зеркала 1 уровня должны:" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:391 msgid "carry the complete fileset" msgstr "поддерживать полный список файлов" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:392 msgid "allow access to other mirror sites" msgstr "предоставлять доступ для других зеркал" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:393 msgid "provide FTP and rsync access" msgstr "обеспечивать доступ по протоколам ftp и rsync" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:396 msgid "" "Furthermore, admins should be subscribed to the {freebsd-hubs}. See extref:" -"{handbook}[this link, eresources-mail] for details, how to subscribe." +"{handbook}eresources[this link, eresources-mail] for details, how to " +"subscribe." msgstr "" "Кроме того, администратор такого зеркала должен быть подписан на {freebsd-" -"hubs}. См. extref:{handbook}[здесь, eresources-mail] для дополнительной " -"информации о подписке." +"hubs}. См. extref:{handbook}eresources[здесь, eresources-mail] для " +"дополнительной информации о подписке." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:401 msgid "" "It is _very_ important for a hub administrator, especially Tier-1 hub " "admins, to check the https://www.FreeBSD.org/releng/[release schedule] for " "the next FreeBSD release. This is important because it will tell you when " "the next release is scheduled to come out, and thus giving you time to " "prepare for the big spike of traffic which follows it." msgstr "" "Очень важно для администратора хаба, особенно администраторов хаба уровня " "Tier-1, проверять https://www.FreeBSD.org/releng/[график выпусков] " "следующего релиза FreeBSD. Это важно, потому что это позволит вам узнать, " "когда запланирован выход следующего релиза, и, таким образом, даст вам время " "подготовиться к большому всплеску трафика, который последует за ним." #. type: delimited block = 4 #: documentation/content/en/articles/hubs/_index.adoc:404 msgid "" "It is also important that hub administrators try to keep their mirrors as up-" "to-date as possible (again, even more crucial for Tier-1 mirrors). If " "Mirror1 does not update for a while, lower tier mirrors will begin to mirror " "old data from Mirror1 and thus begins a downward spiral... Keep your mirrors " "up to date!" msgstr "" "Кроме того, важно поддерживать актуальность зеркал (в особенности зеркал " "уровня 1). Если Зеркало1 не синхронизировалось в течение длительного " "времени, то зеркала следующего уровня будут синхронизироваться по устаревшей " "информации и т.д. Поддерживайте актуальность ваших зеркал!" #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:407 #, no-wrap msgid "How to Become Official Then?" msgstr "Как стать официальным зеркалом?" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:410 msgid "" -"Please contact the Cluster Administrators as documented at https://" -"www.FreeBSD.org/administration/#t-clusteradm." +"Please contact the Cluster Administrators as documented at https://www." +"FreeBSD.org/administration/#t-clusteradm." msgstr "" "Обратитесь к администраторам кластера, как указано в документации по адресу " "https://www.FreeBSD.org/administration/#t-clusteradm." #. type: Title == #: documentation/content/en/articles/hubs/_index.adoc:412 #, no-wrap msgid "Some Statistics from Mirror Sites" msgstr "Статистика некоторых зеркал" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:415 msgid "" "Here are links to the stat pages of your favorite mirrors (aka the only ones " "who feel like providing stats)." msgstr "" "Вот ссылки на страницы статистики ваших любимых зеркал (иначе говоря, " "единственных, кто предоставляет такую статистику)." #. type: Title === #: documentation/content/en/articles/hubs/_index.adoc:417 #, no-wrap msgid "FTP Site Statistics" msgstr "Статистика FTP сайтов" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:420 msgid "" -"ftp.is.FreeBSD.org - " -"mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD.org] - http://" -"www.rhnet.is/status/draupnir/draupnir.html[ (Bandwidth)] http://www.rhnet.is/" -"status/ftp/ftp-notendur.html[(FTP processes)] http://www.rhnet.is/status/ftp/" -"http-notendur.html[(HTTP processes)]" -msgstr "" -"ftp.is.FreeBSD.org - " -"mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD.org] - http://" -"www.rhnet.is/status/draupnir/draupnir.html[ (Bandwidth)] http://www.rhnet.is/" -"status/ftp/ftp-notendur.html[(FTP processes)] http://www.rhnet.is/status/ftp/" -"http-notendur.html[(HTTP processes)]" +"ftp.is.FreeBSD.org - mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD." +"org] - http://www.rhnet.is/status/draupnir/draupnir.html[ (Bandwidth)] " +"http://www.rhnet.is/status/ftp/ftp-notendur.html[(FTP processes)] http://www." +"rhnet.is/status/ftp/http-notendur.html[(HTTP processes)]" +msgstr "" +"ftp.is.FreeBSD.org - mailto:hostmaster@is.FreeBSD.org[hostmaster@is.FreeBSD." +"org] - http://www.rhnet.is/status/draupnir/draupnir.html[ (Bandwidth)] " +"http://www.rhnet.is/status/ftp/ftp-notendur.html[(FTP processes)] http://www." +"rhnet.is/status/ftp/http-notendur.html[(HTTP processes)]" #. type: Plain text #: documentation/content/en/articles/hubs/_index.adoc:420 msgid "" "ftp2.ru.FreeBSD.org - mailto:mirror@macomnet.ru[mirror@macomnet.ru] - http://" "mirror.macomnet.net/mrtg/mirror.macomnet.net_195.128.64.25.html[(Bandwidth)] " "http://mirror.macomnet.net/mrtg/mirror.macomnet.net_proc.html[(HTTP and FTP " "users)]" msgstr "" "ftp2.ru.FreeBSD.org - mailto:mirror@macomnet.ru[mirror@macomnet.ru] - http://" "mirror.macomnet.net/mrtg/mirror.macomnet.net_195.128.64.25.html[(Bandwidth)] " "http://mirror.macomnet.net/mrtg/mirror.macomnet.net_proc.html[(HTTP and FTP " "users)]" diff --git a/documentation/content/ru/articles/ipsec-must/_index.adoc b/documentation/content/ru/articles/ipsec-must/_index.adoc index 0ed3a91901..7dea417d9f 100644 --- a/documentation/content/ru/articles/ipsec-must/_index.adoc +++ b/documentation/content/ru/articles/ipsec-must/_index.adoc @@ -1,278 +1,278 @@ --- authors: - author: 'David Honig' email: honig@sprynet.com description: 'Независимое исследование работы IPsec во FreeBSD' tags: ["IPsec", "verification", "FreeBSD"] title: 'Независимое исследование работы IPsec во FreeBSD' trademarks: ["freebsd", "opengroup", "general"] --- = Независимое исследование работы IPsec во FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/ipsec-must/ 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] Аннотация Вы только что установили и настроили IPsec, и оно, кажется, заработало. Как это можно проверить? Я опишу метод экспериментальной проверки правильного функционирования IPsec. ''' toc::[] [[problem]] == Постановка задачи Для начала предположим, что Вы crossref::ipsec-must[ipsec-install, установили IPsec]. Как Вы узнаете, что IPsec crossref::ipsec-must[caveat, надо учитывать предостережение]? Несомненно, соединения не будет, если Вы неверно его сконфигурировали. И оно, конечно, появится в выводе команды man:netstat[1], когда Вы всё сделаете верно. Но можно ли как-то подтвердить сам факт функционирования IPsec? [[solution]] == Решение Для начала немножко криптографической теории: . Шифрованные данные равномерно распределены по области определения, то есть каждый символ имеет максимальную энтропию; . "Сырые" и несжатые данные как правило избыточны, то есть их энтропия меньше максимально возможной. Предположим, что у Вас имеется возможность измерить энтропию входящего и исходящего трафика на сетевом интерфейсе. В этом случае Вы сможете легко отличить зашифрованные данные от открытых, причём даже в том случае, когда часть данных в "режиме шифрования" передаётся в открытом виде, к примеру внешние заголовки IP, которые используются для маршрутизации. [[MUST]] === MUST "Универсальный Статистический Тест для Генераторов Случайных Чисел" Уэли Маурера (Ueli Maurer's Universal Statistical Test for Random Bit Generators), сокращённо http://www.geocities.com/SiliconValley/Code/4704/universal.pdf[MUST], позволяет быстро измерить энтропию последовательного набора данных. Используемый алгоритм похож на алгоритм сжатия. В разделе crossref::ipsec-must[code, Универсальный Статистический Тест Маурера (размер блока - 8 бит))] приведён исходный код, позволяющий измерять энтропию последовательных кусков данных размером около четверти мегабайта. [[tcpdump]] === Tcpdump Ещё нам нужен способ сохранения информации, проходящей через интерфейс. Программа man:tcpdump[1] позволяет сделать это в случае, если у Вас ядро crossref::ipsec-must[kernel,src/sys/i386/conf/KERNELNAME] с поддержкой __Пакетного Фильтра Беркли (Berkeley Packet Filter)__. Команда: [source, shell] .... tcpdump -c 4000 -s 10000 -w dumpfile.bin .... сохранит 4000 пакетов в файл _dumpfile.bin_. В данном примере объём записываемой информации в каждом пакете не может превышать 10,000 байтов. [[experiment]] == Эксперимент Повторите следующие шаги эксперимента: [.procedure] ==== . Откройте два окна терминала и свяжитесь в одном из них с каким-нибудь компьютером через канал IPsec, а в другом - с обычным, "незащищённым" компьютером. . Теперь запустите crossref::ipsec-must[tcpdump, Tcpdump]. . В "шифрованном" окне запустите команду UNIX(R) man:yes[1], которая будет выдавать бесконечный поток символов `y`. Немножко подождите и завершите её. Затем переключитесь в обычное окно (не использующее канал IPsec) и сделайте то же самое. . Заключительный этап: запустите crossref::ipsec-must[code, Универсальный Статистический Тест Маурера (размер блока - 8 бит)], передав ему для обработки только что сохранённые пакеты через командную строку. Вы должны увидеть что-то вроде изображённого чуть ниже. Заметьте, что безопасное соединение имеет 93% (6,7) от ожидаемого значения (7,18), а обычное соединение - всего лишь 29% (2,1). + [source, shell] .... % tcpdump -c 4000 -s 10000 -w ipsecdemo.bin % uliscan ipsecdemo.bin Uliscan 21 Dec 98 L=8 256 258560 Measuring file ipsecdemo.bin Init done Expected value for L=8 is 7.1836656 6.9396 -------------------------------------------------------- 6.6177 ----------------------------------------------------- 6.4100 --------------------------------------------------- 2.1101 ----------------- 2.0838 ----------------- 2.0983 ----------------- .... ==== [[caveat]] == Предостережение Этот эксперимент показывает, что IPsec _действительно_ распределяет передаваемые байты по области определения __равномерно__, как и любое другое шифрование. Однако этот метод _не может_ обнаружить множество других изъянов в системе (хотя я таковых не знаю). Для примера можно привести плохие алгоритмы генерации или обмена ключами, нарушение конфиденциальности данных или ключей, использование слабых в криптографическом смысле алгоритмов, взлом ядра и т. д. Изучайте исходный код, узнавайте, что там происходит. [[IPsec]] == IPsec — определение IPsec представляет собой протокол безопасного обмена информацией по Internet. Существует в виде расширения к IPv4; является неотъемлемой частью IPv6. Содержит в себе протокол шифрования и аутентификации на уровне IP (межмашинное "host-to-host" взаимодействие). SSL защищает только лишь конкретный прикладной сокет; SSH защищает вход на машину; PGP защищает определённый файл или письмо. IPsec шифрует всю информацию, передаваемую между двумя машинами. [[ipsec-install]] == Установка IPsec Большинство современных версий FreeBSD уже имеют поддержку IPsec. Вероятно, Вы должны будете лишь добавить опцию `IPSEC` в конфигурационный файл ядра, и после сборки и инсталляции нового ядра, сконфигурировать соединение IPsec с помощью команды man:setkey[8]. -Более подробно о том, как запустить IPsec во FreeBSD можно прочесть в extref:{handbook}[Руководстве пользователя, ipsec]. +Более подробно о том, как запустить IPsec во FreeBSD можно прочесть в extref:{vpn-ipsec}[VPN через IPsec]. [[kernel]] == src/sys/i386/conf/KERNELNAME Для того, чтобы захватывать сетевой трафик при помощи man:tcpdump[1], следующие строки должны присутствовать в конфигурационном файле ядра. Не забудьте после модификации запустить man:config[8], и, как обычно, пересобрать и установить новое ядро. [.programlisting] .... device bpf .... [[code]] == Универсальный Статистический Тест Маурера (размер блока - 8 бит) Оригинал нижеприведённого кода находится по https://web.archive.org/web/20031204230654/http://www.geocities.com:80/SiliconValley/Code/4704/uliscanc.txt[ этому адресу]. [.programlisting] .... /* ULISCAN.c ---blocksize of 8 1 Oct 98 1 Dec 98 21 Dec 98 uliscan.c derived from ueli8.c This version has // comments removed for Sun cc This implements Ueli M Maurer's "Universal Statistical Test for Random Bit Generators" using L=8 Accepts a filename on the command line; writes its results, with other info, to stdout. Handles input file exhaustion gracefully. Ref: J. Cryptology v 5 no 2, 1992 pp 89-105 also on the web somewhere, which is where I found it. -David Honig honig@sprynet.com Usage: ULISCAN filename outputs to stdout */ #define L 8 #define V (1< #include int main(argc, argv) int argc; char **argv; { FILE *fptr; int i,j; int b, c; int table[V]; double sum = 0.0; int iproduct = 1; int run; extern double log(/* double x */); printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP); if (argc < 2) { printf("Usage: Uliscan filename\n"); exit(-1); } else { printf("Measuring file %s\n", argv[1]); } fptr = fopen(argv[1],"rb"); if (fptr == NULL) { printf("Can't find %s\n", argv[1]); exit(-1); } for (i = 0; i < V; i++) { table[i] = 0; } for (i = 0; i < Q; i++) { b = fgetc(fptr); table[b] = i; } printf("Init done\n"); printf("Expected value for L=8 is 7.1836656\n"); run = 1; while (run) { sum = 0.0; iproduct = 1; if (run) for (i = Q; run && i < Q + K; i++) { j = i; b = fgetc(fptr); if (b < 0) run = 0; if (run) { if (table[b] > j) j += K; sum += log((double)(j-table[b])); table[b] = i; } } if (!run) printf("Premature end of file; read %d blocks.\n", i - Q); sum = (sum/((double)(i - Q))) / log(2.0); printf("%4.4f ", sum); for (i = 0; i < (int)(sum*8.0 + 0.50); i++) printf("-"); printf("\n"); /* refill initial table */ if (0) { for (i = 0; i < Q; i++) { b = fgetc(fptr); if (b < 0) { run = 0; } else { table[b] = i; } } } } } .... diff --git a/documentation/content/ru/articles/ipsec-must/_index.po b/documentation/content/ru/articles/ipsec-must/_index.po index 762f8315b1..71f2e77707 100644 --- a/documentation/content/ru/articles/ipsec-must/_index.po +++ b/documentation/content/ru/articles/ipsec-must/_index.po @@ -1,757 +1,744 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2024-12-29 08:30-0500\n" -"PO-Revision-Date: 2025-08-21 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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: Title = #: documentation/content/en/articles/ipsec-must/_index.adoc:1 #: documentation/content/en/articles/ipsec-must/_index.adoc:11 #, no-wrap msgid "Independent Verification of IPsec Functionality in FreeBSD" msgstr "Независимое исследование работы IPsec во FreeBSD" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:47 msgid "" "You installed IPsec and it seems to be working. How do you know? I describe " "a method for experimentally verifying that IPsec is working." msgstr "" "Вы только что установили и настроили IPsec, и оно, кажется, заработало. Как " "это можно проверить? Я опишу метод экспериментальной проверки правильного " "функционирования IPsec." #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:49 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:53 #, no-wrap msgid "The Problem" msgstr "Постановка задачи" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:58 msgid "" "First, lets assume you have crossref::ipsec-must[ipsec-install, Installing " "IPsec]. How do you know it is crossref::ipsec-must[caveat, Caveat]? Sure, " "your connection will not work if it is misconfigured, and it will work when " "you finally get it right. man:netstat[1] will list it. But can you " "independently confirm it?" msgstr "" "Для начала предположим, что Вы crossref::ipsec-must[ipsec-install, " "установили IPsec]. Как Вы узнаете, что IPsec crossref::ipsec-must[caveat, " "надо учитывать предостережение]? Несомненно, соединения не будет, если Вы " -"неверно его сконфигурировали. И оно, конечно, появится в выводе команды " -"man:netstat[1], когда Вы всё сделаете верно. Но можно ли как-то подтвердить " -"сам факт функционирования IPsec?" +"неверно его сконфигурировали. И оно, конечно, появится в выводе команды man:" +"netstat[1], когда Вы всё сделаете верно. Но можно ли как-то подтвердить сам " +"факт функционирования IPsec?" #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:60 #, no-wrap msgid "The Solution" msgstr "Решение" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:63 msgid "First, some crypto-relevant info theory:" msgstr "Для начала немножко криптографической теории:" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:65 msgid "" "Encrypted data is uniformly distributed, i.e., has maximal entropy per " "symbol;" msgstr "" "Шифрованные данные равномерно распределены по области определения, то есть " "каждый символ имеет максимальную энтропию;" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:66 msgid "" "Raw, uncompressed data is typically redundant, i.e., has sub-maximal entropy." msgstr "" "\"Сырые\" и несжатые данные как правило избыточны, то есть их энтропия " "меньше максимально возможной." #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:70 msgid "" "Suppose you could measure the entropy of the data to- and from- your network " "interface. Then you could see the difference between unencrypted data and " "encrypted data. This would be true even if some of the data in \"encrypted " "mode\" was not encrypted---as the outermost IP header must be if the packet " "is to be routable." msgstr "" "Предположим, что у Вас имеется возможность измерить энтропию входящего и " "исходящего трафика на сетевом интерфейсе. В этом случае Вы сможете легко " "отличить зашифрованные данные от открытых, причём даже в том случае, когда " "часть данных в \"режиме шифрования\" передаётся в открытом виде, к примеру " "внешние заголовки IP, которые используются для маршрутизации." #. type: Title === #: documentation/content/en/articles/ipsec-must/_index.adoc:72 #, no-wrap msgid "MUST" msgstr "MUST" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:77 msgid "" -"Ueli Maurer's \"Universal Statistical Test for Random Bit " -"Generators\"(https://web.archive.org/web/20011115002319/http://www.geocities." -"com/SiliconValley/Code/4704/universal.pdf[MUST]) quickly measures the " -"entropy of a sample. It uses a compression-like algorithm. crossref::ipsec-" -"must[code, Maurer's Universal Statistical Test (for block size8 bits)] for a " -"variant which measures successive (~quarter megabyte) chunks of a file." +"Ueli Maurer's \"Universal Statistical Test for Random Bit Generators" +"\"(https://web.archive.org/web/20011115002319/http://www.geocities.com/" +"SiliconValley/Code/4704/universal.pdf[MUST]) quickly measures the entropy of " +"a sample. It uses a compression-like algorithm. crossref::ipsec-must[code, " +"Maurer's Universal Statistical Test (for block size8 bits)] for a variant " +"which measures successive (~quarter megabyte) chunks of a file." msgstr "" "\"Универсальный Статистический Тест для Генераторов Случайных Чисел\" Уэли " -"Маурера (Ueli Maurer's Universal Statistical Test for Random Bit Generators)" -", сокращённо http://www.geocities.com/SiliconValley/Code/4704/universal." -"pdf[MUST], позволяет быстро измерить энтропию последовательного набора " -"данных. Используемый алгоритм похож на алгоритм сжатия. В разделе crossref" -"::ipsec-must[code, Универсальный Статистический Тест Маурера (размер блока - " -"8 бит))] приведён исходный код, позволяющий измерять энтропию " +"Маурера (Ueli Maurer's Universal Statistical Test for Random Bit " +"Generators), сокращённо http://www.geocities.com/SiliconValley/Code/4704/" +"universal.pdf[MUST], позволяет быстро измерить энтропию последовательного " +"набора данных. Используемый алгоритм похож на алгоритм сжатия. В разделе " +"crossref::ipsec-must[code, Универсальный Статистический Тест Маурера (размер " +"блока - 8 бит))] приведён исходный код, позволяющий измерять энтропию " "последовательных кусков данных размером около четверти мегабайта." #. type: Title === #: documentation/content/en/articles/ipsec-must/_index.adoc:79 #, no-wrap msgid "Tcpdump" msgstr "Tcpdump" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:84 msgid "" "We also need a way to capture the raw network data. A program called man:" "tcpdump[1] lets you do this, if you have enabled the _Berkeley Packet " "Filter_ interface in your crossref::ipsec-must[kernel,src/sys/i386/conf/" "KERNELNAME]." msgstr "" "Ещё нам нужен способ сохранения информации, проходящей через интерфейс. " "Программа man:tcpdump[1] позволяет сделать это в случае, если у Вас ядро " "crossref::ipsec-must[kernel,src/sys/i386/conf/KERNELNAME] с поддержкой " "__Пакетного Фильтра Беркли (Berkeley Packet Filter)__." #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:86 msgid "The command:" msgstr "Команда:" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:90 #, no-wrap msgid " tcpdump -c 4000 -s 10000 -w dumpfile.bin\n" msgstr " tcpdump -c 4000 -s 10000 -w dumpfile.bin\n" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:94 msgid "" "will capture 4000 raw packets to _dumpfile.bin_. Up to 10,000 bytes per " "packet will be captured in this example." msgstr "" "сохранит 4000 пакетов в файл _dumpfile.bin_. В данном примере объём " "записываемой информации в каждом пакете не может превышать 10,000 байтов." #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:96 #, no-wrap msgid "The Experiment" msgstr "Эксперимент" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:99 msgid "Here is the experiment:" msgstr "Повторите следующие шаги эксперимента:" #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:103 msgid "Open a window to an IPsec host and another window to an insecure host." msgstr "" "Откройте два окна терминала и свяжитесь в одном из них с каким-нибудь " "компьютером через канал IPsec, а в другом - с обычным, \"незащищённым\" " "компьютером." #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:104 msgid "Now start crossref::ipsec-must[tcpdump, Tcpdump]." msgstr "Теперь запустите crossref::ipsec-must[tcpdump, Tcpdump]." #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:105 msgid "" "In the \"secure\" window, run the UNIX(R) command man:yes[1], which will " "stream the `y` character. After a while, stop this. Switch to the insecure " "window, and repeat. After a while, stop." msgstr "" "В \"шифрованном\" окне запустите команду UNIX(R) man:yes[1], которая будет " "выдавать бесконечный поток символов `y`. Немножко подождите и завершите её. " "Затем переключитесь в обычное окно (не использующее канал IPsec) и сделайте " "то же самое." #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:106 msgid "" "Now run crossref::ipsec-must[code, Maurer's Universal Statistical Test (for " "block size8 bits)] on the captured packets. You should see something like " "the following. The important thing to note is that the secure connection has " "93% (6.7) of the expected value (7.18), and the \"normal\" connection has " "29% (2.1) of the expected value." msgstr "" "Заключительный этап: запустите crossref::ipsec-must[code, Универсальный " "Статистический Тест Маурера (размер блока - 8 бит)], передав ему для " "обработки только что сохранённые пакеты через командную строку. Вы должны " "увидеть что-то вроде изображённого чуть ниже. Заметьте, что безопасное " "соединение имеет 93% (6,7) от ожидаемого значения (7,18), а обычное " "соединение - всего лишь 29% (2,1)." #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:122 #, no-wrap msgid "" "% tcpdump -c 4000 -s 10000 -w ipsecdemo.bin\n" "% uliscan ipsecdemo.bin\n" "Uliscan 21 Dec 98\n" "L=8 256 258560\n" "Measuring file ipsecdemo.bin\n" "Init done\n" "Expected value for L=8 is 7.1836656\n" "6.9396 --------------------------------------------------------\n" "6.6177 -----------------------------------------------------\n" "6.4100 ---------------------------------------------------\n" "2.1101 -----------------\n" "2.0838 -----------------\n" "2.0983 -----------------\n" msgstr "" "% tcpdump -c 4000 -s 10000 -w ipsecdemo.bin\n" "% uliscan ipsecdemo.bin\n" "Uliscan 21 Dec 98\n" "L=8 256 258560\n" "Measuring file ipsecdemo.bin\n" "Init done\n" "Expected value for L=8 is 7.1836656\n" "6.9396 --------------------------------------------------------\n" "6.6177 -----------------------------------------------------\n" "6.4100 ---------------------------------------------------\n" "2.1101 -----------------\n" "2.0838 -----------------\n" "2.0983 -----------------\n" #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:126 #, no-wrap msgid "Caveat" msgstr "Предостережение" #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:132 msgid "" "This experiment shows that IPsec _does_ seem to be distributing the payload " "data __uniformly__, as encryption should. However, the experiment described " "here _cannot_ detect many possible flaws in a system (none of which do I " "have any evidence for). These include poor key generation or exchange, data " "or keys being visible to others, use of weak algorithms, kernel subversion, " "etc. Study the source; know the code." msgstr "" "Этот эксперимент показывает, что IPsec _действительно_ распределяет " "передаваемые байты по области определения __равномерно__, как и любое другое " "шифрование. Однако этот метод _не может_ обнаружить множество других изъянов " "в системе (хотя я таковых не знаю). Для примера можно привести плохие " "алгоритмы генерации или обмена ключами, нарушение конфиденциальности данных " "или ключей, использование слабых в криптографическом смысле алгоритмов, " "взлом ядра и т. д. Изучайте исходный код, узнавайте, что там происходит." #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:134 #, no-wrap msgid "IPsec---Definition" msgstr "IPsec — определение" #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:140 msgid "" "Internet Protocol security extensions to IPv4; required for IPv6. A " "protocol for negotiating encryption and authentication at the IP (host-to-" "host) level. SSL secures only one application socket; SSH secures only a " "login; PGP secures only a specified file or message. IPsec encrypts " "everything between two hosts." msgstr "" "IPsec представляет собой протокол безопасного обмена информацией по " "Internet. Существует в виде расширения к IPv4; является неотъемлемой частью " -"IPv6. Содержит в себе протокол шифрования и аутентификации на уровне IP (" -"межмашинное \"host-to-host\" взаимодействие). SSL защищает только лишь " +"IPv6. Содержит в себе протокол шифрования и аутентификации на уровне IP " +"(межмашинное \"host-to-host\" взаимодействие). SSL защищает только лишь " "конкретный прикладной сокет; SSH защищает вход на машину; PGP защищает " "определённый файл или письмо. IPsec шифрует всю информацию, передаваемую " "между двумя машинами." #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:142 #, no-wrap msgid "Installing IPsec" msgstr "Установка IPsec" #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:146 msgid "" "Most of the modern versions of FreeBSD have IPsec support in their base " "source. So you will need to include the `IPSEC` option in your kernel " "config and, after kernel rebuild and reinstall, configure IPsec connections " "using man:setkey[8] command." msgstr "" "Большинство современных версий FreeBSD уже имеют поддержку IPsec. Вероятно, " "Вы должны будете лишь добавить опцию `IPSEC` в конфигурационный файл ядра, и " "после сборки и инсталляции нового ядра, сконфигурировать соединение IPsec с " "помощью команды man:setkey[8]." #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:148 msgid "" -"A comprehensive guide on running IPsec on FreeBSD is provided in extref:" -"{handbook}[FreeBSD Handbook, ipsec]." +"A comprehensive guide on running IPsec on FreeBSD is provided in extref:{vpn-" +"ipsec}[VPN over IPsec]." msgstr "" -"Более подробно о том, как запустить IPsec во FreeBSD можно прочесть в " -"extref:{handbook}[Руководстве пользователя, ipsec]." +"Более подробно о том, как запустить IPsec во FreeBSD можно прочесть в extref" +":{vpn-ipsec}[VPN через IPsec]." #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:150 #, no-wrap msgid "src/sys/i386/conf/KERNELNAME" msgstr "src/sys/i386/conf/KERNELNAME" #. type: delimited block = 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:154 msgid "" "This needs to be present in the kernel config file to capture network data " "with man:tcpdump[1]. Be sure to run man:config[8] after adding this, and " "rebuild and reinstall." msgstr "" "Для того, чтобы захватывать сетевой трафик при помощи man:tcpdump[1], " "следующие строки должны присутствовать в конфигурационном файле ядра. Не " "забудьте после модификации запустить man:config[8], и, как обычно, " "пересобрать и установить новое ядро." #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:158 #, no-wrap msgid "device\tbpf\n" msgstr "device\tbpf\n" #. type: Title == #: documentation/content/en/articles/ipsec-must/_index.adoc:161 #, no-wrap msgid "Maurer's Universal Statistical Test (for block size=8 bits)" msgstr "Универсальный Статистический Тест Маурера (размер блока - 8 бит)" #. type: Plain text #: documentation/content/en/articles/ipsec-must/_index.adoc:164 msgid "" "You can find the same code at https://web.archive.org/web/20031204230654/" "http://www.geocities.com:80/SiliconValley/Code/4704/uliscanc.txt[this link]." msgstr "" -"Оригинал нижеприведённого кода находится по https://web.archive.org/web/" -"20031204230654/http://www.geocities.com:80/SiliconValley/Code/4704/uliscanc." -"txt[ этому адресу]." +"Оригинал нижеприведённого кода находится по https://web.archive.org/" +"web/20031204230654/http://www.geocities.com:80/SiliconValley/Code/4704/" +"uliscanc.txt[ этому адресу]." #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:169 #, no-wrap msgid "" "/*\n" " ULISCAN.c ---blocksize of 8\n" msgstr "" "/*\n" " ULISCAN.c ---blocksize of 8\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:173 #, no-wrap msgid "" " 1 Oct 98\n" " 1 Dec 98\n" " 21 Dec 98 uliscan.c derived from ueli8.c\n" msgstr "" " 1 Oct 98\n" " 1 Dec 98\n" " 21 Dec 98 uliscan.c derived from ueli8.c\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:175 #, no-wrap msgid " This version has // comments removed for Sun cc\n" msgstr " This version has // comments removed for Sun cc\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:178 #, no-wrap msgid "" " This implements Ueli M Maurer's \"Universal Statistical Test for Random\n" " Bit Generators\" using L=8\n" msgstr "" " This implements Ueli M Maurer's \"Universal Statistical Test for Random\n" " Bit Generators\" using L=8\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:181 #, no-wrap msgid "" " Accepts a filename on the command line; writes its results, with other\n" " info, to stdout.\n" msgstr "" " Accepts a filename on the command line; writes its results, with other\n" " info, to stdout.\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:183 #, no-wrap msgid " Handles input file exhaustion gracefully.\n" msgstr " Handles input file exhaustion gracefully.\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:186 #, no-wrap msgid "" " Ref: J. Cryptology v 5 no 2, 1992 pp 89-105\n" " also on the web somewhere, which is where I found it.\n" msgstr "" " Ref: J. Cryptology v 5 no 2, 1992 pp 89-105\n" " also on the web somewhere, which is where I found it.\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:189 #, no-wrap msgid "" " -David Honig\n" " honig@sprynet.com\n" msgstr "" " -David Honig\n" " honig@sprynet.com\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:194 #, no-wrap msgid "" " Usage:\n" " ULISCAN filename\n" " outputs to stdout\n" "*/\n" msgstr "" " Usage:\n" " ULISCAN filename\n" " outputs to stdout\n" "*/\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:200 #, no-wrap msgid "" "#define L 8\n" "#define V (1<\n" "#include \n" msgstr "" "#include \n" "#include \n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:215 #, no-wrap msgid "" "int main(argc, argv)\n" "int argc;\n" "char **argv;\n" "{\n" " FILE *fptr;\n" " int i,j;\n" " int b, c;\n" " int table[V];\n" " double sum = 0.0;\n" " int iproduct = 1;\n" " int run;\n" msgstr "" "int main(argc, argv)\n" "int argc;\n" "char **argv;\n" "{\n" " FILE *fptr;\n" " int i,j;\n" " int b, c;\n" " int table[V];\n" " double sum = 0.0;\n" " int iproduct = 1;\n" " int run;\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:217 #, no-wrap msgid " extern double log(/* double x */);\n" msgstr " extern double log(/* double x */);\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:219 #, no-wrap msgid " printf(\"Uliscan 21 Dec 98 \\nL=%d %d %d \\n\", L, V, MAXSAMP);\n" -msgstr "" -" printf(\"Uliscan 21 Dec 98 \\n" -"L=%d %d %d \\n" -"\", L, V, MAXSAMP);\n" +msgstr " printf(\"Uliscan 21 Dec 98 \\nL=%d %d %d \\n\", L, V, MAXSAMP);\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:226 #, no-wrap msgid "" " if (argc < 2) {\n" " printf(\"Usage: Uliscan filename\\n\");\n" " exit(-1);\n" " } else {\n" " printf(\"Measuring file %s\\n\", argv[1]);\n" " }\n" msgstr "" " if (argc < 2) {\n" -" printf(\"Usage: Uliscan filename\\n" -"\");\n" +" printf(\"Usage: Uliscan filename\\n\");\n" " exit(-1);\n" " } else {\n" -" printf(\"Measuring file %s\\n" -"\", argv[1]);\n" +" printf(\"Measuring file %s\\n\", argv[1]);\n" " }\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:228 #, no-wrap msgid " fptr = fopen(argv[1],\"rb\");\n" msgstr " fptr = fopen(argv[1],\"rb\");\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:233 #, no-wrap msgid "" " if (fptr == NULL) {\n" " printf(\"Can't find %s\\n\", argv[1]);\n" " exit(-1);\n" " }\n" msgstr "" " if (fptr == NULL) {\n" -" printf(\"Can't find %s\\n" -"\", argv[1]);\n" +" printf(\"Can't find %s\\n\", argv[1]);\n" " exit(-1);\n" " }\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:237 #, no-wrap msgid "" " for (i = 0; i < V; i++) {\n" " table[i] = 0;\n" " }\n" msgstr "" " for (i = 0; i < V; i++) {\n" " table[i] = 0;\n" " }\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:242 #, no-wrap msgid "" " for (i = 0; i < Q; i++) {\n" " b = fgetc(fptr);\n" " table[b] = i;\n" " }\n" msgstr "" " for (i = 0; i < Q; i++) {\n" " b = fgetc(fptr);\n" " table[b] = i;\n" " }\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:244 #, no-wrap msgid " printf(\"Init done\\n\");\n" -msgstr "" -" printf(\"Init done\\n" -"\");\n" +msgstr " printf(\"Init done\\n\");\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:246 #, no-wrap msgid " printf(\"Expected value for L=8 is 7.1836656\\n\");\n" -msgstr "" -" printf(\"Expected value for L=8 is 7.1836656\\n" -"\");\n" +msgstr " printf(\"Expected value for L=8 is 7.1836656\\n\");\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:248 #, no-wrap msgid " run = 1;\n" msgstr " run = 1;\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:252 #, no-wrap msgid "" " while (run) {\n" " sum = 0.0;\n" " iproduct = 1;\n" msgstr "" " while (run) {\n" " sum = 0.0;\n" " iproduct = 1;\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:257 #, no-wrap msgid "" " if (run)\n" " for (i = Q; run && i < Q + K; i++) {\n" " j = i;\n" " b = fgetc(fptr);\n" msgstr "" " if (run)\n" " for (i = Q; run && i < Q + K; i++) {\n" " j = i;\n" " b = fgetc(fptr);\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:260 #, no-wrap msgid "" " if (b < 0)\n" " run = 0;\n" msgstr "" " if (b < 0)\n" " run = 0;\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:264 #, no-wrap msgid "" " if (run) {\n" " if (table[b] > j)\n" " j += K;\n" msgstr "" " if (run) {\n" " if (table[b] > j)\n" " j += K;\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:266 #, no-wrap msgid " sum += log((double)(j-table[b]));\n" msgstr " sum += log((double)(j-table[b]));\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:270 #, no-wrap msgid "" " table[b] = i;\n" " }\n" " }\n" msgstr "" " table[b] = i;\n" " }\n" " }\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:273 #, no-wrap msgid "" " if (!run)\n" " printf(\"Premature end of file; read %d blocks.\\n\", i - Q);\n" msgstr "" " if (!run)\n" -" printf(\"Premature end of file; read %d blocks.\\n" -"\", i - Q);\n" +" printf(\"Premature end of file; read %d blocks.\\n\", i - Q);\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:276 #, no-wrap msgid "" " sum = (sum/((double)(i - Q))) / log(2.0);\n" " printf(\"%4.4f \", sum);\n" msgstr "" " sum = (sum/((double)(i - Q))) / log(2.0);\n" " printf(\"%4.4f \", sum);\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:279 #, no-wrap msgid "" " for (i = 0; i < (int)(sum*8.0 + 0.50); i++)\n" " printf(\"-\");\n" msgstr "" " for (i = 0; i < (int)(sum*8.0 + 0.50); i++)\n" " printf(\"-\");\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:281 #, no-wrap msgid " printf(\"\\n\");\n" -msgstr "" -" printf(\"\\n" -"\");\n" +msgstr " printf(\"\\n\");\n" #. type: delimited block . 4 #: documentation/content/en/articles/ipsec-must/_index.adoc:295 #, no-wrap msgid "" " /* refill initial table */\n" " if (0) {\n" " for (i = 0; i < Q; i++) {\n" " b = fgetc(fptr);\n" " if (b < 0) {\n" " run = 0;\n" " } else {\n" " table[b] = i;\n" " }\n" " }\n" " }\n" " }\n" "}\n" msgstr "" " /* refill initial table */\n" " if (0) {\n" " for (i = 0; i < Q; i++) {\n" " b = fgetc(fptr);\n" " if (b < 0) {\n" " run = 0;\n" " } else {\n" " table[b] = i;\n" " }\n" " }\n" " }\n" " }\n" "}\n" diff --git a/documentation/content/ru/articles/leap-seconds/_index.adoc b/documentation/content/ru/articles/leap-seconds/_index.adoc index 0d6e27a483..f951f82e6f 100644 --- a/documentation/content/ru/articles/leap-seconds/_index.adoc +++ b/documentation/content/ru/articles/leap-seconds/_index.adoc @@ -1,92 +1,92 @@ --- description: 'Краткое описание обработки високосных секунд (секунд координации) в FreeBSD' tags: ["Leap Seconds", "Support", "Verification", "FreeBSD"] title: 'Поддержка високосных секунд в FreeBSD' --- = Поддержка високосных секунд в FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/leap-seconds/ 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::[] [[leapseconds-definition]] == Введение _Секунда координации_ (високосная секунда) — это односекундная корректировка, вносимая в определённые моменты года в UTC для синхронизации атомных шкал времени с вариациями вращения Земли. В этой статье описано, как FreeBSD взаимодействует с секундами координации. На момент написания следующая високосная секунда будет добавлена 2015-Jun-30 23:59:60 UTC. Эта високосная секунда выпадет на рабочий день для Северной и Южной Америки, а также для региона Азии/Тихоокеанского региона. Секунды координации объявляются https://www.iers.org/IERS/EN/Home/home_node.html[IERS] в https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16.txt[Бюллетене C]. Стандартное поведение високосной секунды описано в https://datatracker.ietf.org/doc/html/rfc7164#section-3[RFC 7164]. Также см. man:time2posix[3]. [[leapseconds-posix]] == Обработка високосных секунд по умолчанию в FreeBSD -Самый простой способ обработки високосных секунд — использование правил времени POSIX, которые FreeBSD использует по умолчанию, в сочетании с extref:{handbook}[NTP, network-ntp]. Когда man:ntpd[8] работает и время синхронизировано с вышестоящими серверами NTP, которые корректно обрабатывают високосные секунды, високосная секунда приведёт к автоматическому повтору последней секунды дня в системном времени. Другие корректировки не требуются. +Самый простой способ обработки високосных секунд — использование правил времени POSIX, которые FreeBSD использует по умолчанию, в сочетании с extref:{handbook}network-servers[NTP, network-ntp]. Когда man:ntpd[8] работает и время синхронизировано с вышестоящими серверами NTP, которые корректно обрабатывают високосные секунды, високосная секунда приведёт к автоматическому повтору последней секунды дня в системном времени. Другие корректировки не требуются. Если вышестоящие серверы NTP не обрабатывают високосные секунды корректно, man:ntpd[8] изменит время на одну секунду после того, как ошибочный вышестоящий сервер заметит это и изменит своё время. Если NTP не используется, после високосной секунды потребуется ручная корректировка системных часов. [[leapseconds-cautions]] == Предупреждения Високосные секунды добавляются одновременно по всему миру: в полночь по UTC. В Японии это середина утра, в Тихоокеанском регионе — середина дня, в Америке — поздний вечер, а в Европе — ночь. Мы полагаем и ожидаем, что FreeBSD, при условии предоставления корректного и стабильного сервиса NTP, будет работать как задумано во время этой секунды координации, как это происходило во время предыдущих. Однако мы предупреждаем, что практически ни одно приложение никогда не запрашивало у ядра информацию о високосных секундах. Наш опыт показывает, что, как и задумано, високосные секунды по сути являются повторением секунды, предшествующей високосной, и это становится неожиданностью для большинства программистов. Другие операционные системы и компьютеры могут обрабатывать високосную секунду иначе, чем FreeBSD, а системы без корректной и стабильной службы NTP вообще не будут знать о високосных секундах. Нередко компьютеры выходят из строя из-за високосных секунд, и опыт показал, что значительная часть всех публичных NTP-серверов может обрабатывать и объявлять високосную секунду неправильно. Пожалуйста, постарайтесь убедиться, что из-за секунды координации не произойдет ничего ужасного. [[leapseconds-testing]] == Тестирование Возможно проверить, будет ли использована секунда координации. Из-за особенностей NTP, проверка может работать до 24 часов до введения секунды координации. Некоторые крупные источники эталонных часов объявляют о секундах координации всего за час до события. Запрос к демону NTP: [source, shell] .... % ntpq -c 'rv 0 leap' .... Вывод, включающий `leap_add_sec`, указывает на корректную поддержку секунды координации. До 24 часов перед наступлением секунды координации или после её прохождения будет отображаться `leap_none`. [[leapseconds-conclusion]] == Заключение На практике секунды координации обычно не представляют проблемы в FreeBSD. Мы надеемся, что этот обзор поможет прояснить, чего ожидать и как сделать обработку секунды координации более гладкой. diff --git a/documentation/content/ru/articles/leap-seconds/_index.po b/documentation/content/ru/articles/leap-seconds/_index.po index f730bbfc51..334f428bf0 100644 --- a/documentation/content/ru/articles/leap-seconds/_index.po +++ b/documentation/content/ru/articles/leap-seconds/_index.po @@ -1,256 +1,255 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2022-02-01 09:21-0300\n" -"PO-Revision-Date: 2025-09-23 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/leap-seconds/_index.adoc:1 #, no-wrap msgid "A short description of how leap seconds are handled on FreeBSD" -msgstr "" -"Краткое описание обработки високосных секунд (секунд координации) в FreeBSD" +msgstr "Краткое описание обработки високосных секунд (секунд координации) в FreeBSD" #. type: Title = #: documentation/content/en/articles/leap-seconds/_index.adoc:1 #: documentation/content/en/articles/leap-seconds/_index.adoc:7 #, no-wrap msgid "FreeBSD Support for Leap Seconds" msgstr "Поддержка високосных секунд в FreeBSD" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:39 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/leap-seconds/_index.adoc:43 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:47 msgid "" "A _leap second_ is an one second adjustment made at specific times of year " "to UTC to synchronize atomic time scales with variations in the rotation of " "the Earth. This article describes how FreeBSD interacts with leap seconds." msgstr "" "_Секунда координации_ (високосная секунда) — это односекундная " "корректировка, вносимая в определённые моменты года в UTC для синхронизации " "атомных шкал времени с вариациями вращения Земли. В этой статье описано, как " "FreeBSD взаимодействует с секундами координации." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:50 msgid "" "As of this writing, the next leap second will occur at 2015-Jun-30 23:59:60 " "UTC. This leap second will occur during a business day for North and South " "America and the Asia/Pacific region." msgstr "" "На момент написания следующая високосная секунда будет добавлена 2015-Jun-30 " "23:59:60 UTC. Эта високосная секунда выпадет на рабочий день для Северной и " "Южной Америки, а также для региона Азии/Тихоокеанского региона." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:52 msgid "" "Leap seconds are announced by https://www.iers.org/IERS/EN/Home/home_node." "html[IERS] on https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16." "txt[Bulletin C]." msgstr "" "Секунды координации объявляются https://www.iers.org/IERS/EN/Home/home_node." "html[IERS] в https://datacenter.iers.org/data/latestVersion/16_BULLETIN_C16." "txt[Бюллетене C]." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:55 msgid "" "Standard leap second behavior is described in https://datatracker.ietf.org/" "doc/html/rfc7164#section-3[RFC 7164]. Also see man:time2posix[3]." msgstr "" "Стандартное поведение високосной секунды описано в https://datatracker.ietf." "org/doc/html/rfc7164#section-3[RFC 7164]. Также см. man:time2posix[3]." #. type: Title == #: documentation/content/en/articles/leap-seconds/_index.adoc:57 #, no-wrap msgid "Default Leap Second Handling on FreeBSD" msgstr "Обработка високосных секунд по умолчанию в FreeBSD" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:62 msgid "" "The easiest way to handle leap seconds is with the POSIX time rules FreeBSD " -"uses by default, combined with extref:{handbook}[NTP, network-ntp]. When " -"man:ntpd[8] is running and the time is synchronized with upstream NTP " -"servers that handle leap seconds correctly, the leap second will cause the " -"system time to automatically repeat the last second of the day. No other " -"adjustments are necessary." +"uses by default, combined with extref:{handbook}network-servers[NTP, network-" +"ntp]. When man:ntpd[8] is running and the time is synchronized with " +"upstream NTP servers that handle leap seconds correctly, the leap second " +"will cause the system time to automatically repeat the last second of the " +"day. No other adjustments are necessary." msgstr "" "Самый простой способ обработки високосных секунд — использование правил " "времени POSIX, которые FreeBSD использует по умолчанию, в сочетании с " -"extref:{handbook}[NTP, network-ntp]. Когда man:ntpd[8] работает и время " -"синхронизировано с вышестоящими серверами NTP, которые корректно " -"обрабатывают високосные секунды, високосная секунда приведёт к " +"extref:{handbook}network-servers[NTP, network-ntp]. Когда man:ntpd[8] " +"работает и время синхронизировано с вышестоящими серверами NTP, которые " +"корректно обрабатывают високосные секунды, високосная секунда приведёт к " "автоматическому повтору последней секунды дня в системном времени. Другие " "корректировки не требуются." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:64 msgid "" "If the upstream NTP servers do not handle leap seconds correctly, man:" "ntpd[8] will step the time by one second after the errant upstream server " "has noticed and stepped itself." msgstr "" "Если вышестоящие серверы NTP не обрабатывают високосные секунды корректно, " "man:ntpd[8] изменит время на одну секунду после того, как ошибочный " "вышестоящий сервер заметит это и изменит своё время." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:66 msgid "" "If NTP is not being used, manual adjustment of the system clock will be " "required after the leap second has passed." msgstr "" "Если NTP не используется, после високосной секунды потребуется ручная " "корректировка системных часов." #. type: Title == #: documentation/content/en/articles/leap-seconds/_index.adoc:68 #, no-wrap msgid "Cautions" msgstr "Предупреждения" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:72 msgid "" "Leap seconds are inserted at the same instant all over the world: UTC " "midnight. In Japan that is mid-morning, in the Pacific mid-day, in the " "Americas late afternoon, and in Europe at night." msgstr "" "Високосные секунды добавляются одновременно по всему миру: в полночь по UTC. " "В Японии это середина утра, в Тихоокеанском регионе — середина дня, в " "Америке — поздний вечер, а в Европе — ночь." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:74 msgid "" "We believe and expect that FreeBSD, if provided correct and stable NTP " "service, will work as designed during this leap second, as it did during the " "previous ones." msgstr "" "Мы полагаем и ожидаем, что FreeBSD, при условии предоставления корректного и " "стабильного сервиса NTP, будет работать как задумано во время этой секунды " "координации, как это происходило во время предыдущих." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:77 msgid "" "However, we caution that practically no applications have ever asked the " "kernel about leap seconds. Our experience is that, as designed, leap " "seconds are essentially a replay of the second before the leap second, and " "this is a surprise to most application programmers." msgstr "" "Однако мы предупреждаем, что практически ни одно приложение никогда не " "запрашивало у ядра информацию о високосных секундах. Наш опыт показывает, " "что, как и задумано, високосные секунды по сути являются повторением " "секунды, предшествующей високосной, и это становится неожиданностью для " "большинства программистов." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:79 msgid "" "Other operating systems and other computers may or may not handle the leap-" "second the same way as FreeBSD, and systems without correct and stable NTP " "service will not know anything about leap seconds at all." msgstr "" "Другие операционные системы и компьютеры могут обрабатывать високосную " "секунду иначе, чем FreeBSD, а системы без корректной и стабильной службы NTP " "вообще не будут знать о високосных секундах." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:81 msgid "" "It is not unheard of for computers to crash because of leap seconds, and " "experience has shown that a large fraction of all public NTP servers might " "handle and announce the leap second incorrectly." msgstr "" "Нередко компьютеры выходят из строя из-за високосных секунд, и опыт показал, " "что значительная часть всех публичных NTP-серверов может обрабатывать и " "объявлять високосную секунду неправильно." #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:83 msgid "" "Please try to make sure nothing horrible happens because of the leap second." msgstr "" "Пожалуйста, постарайтесь убедиться, что из-за секунды координации не " "произойдет ничего ужасного." #. type: Title == #: documentation/content/en/articles/leap-seconds/_index.adoc:85 #, no-wrap msgid "Testing" msgstr "Тестирование" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:91 msgid "" "It is possible to test whether a leap second will be used. Due to the " "nature of NTP, the test might work up to 24 hours before the leap second. " "Some major reference clock sources only announce leap seconds one hour ahead " "of the event. Query the NTP daemon:" msgstr "" "Возможно проверить, будет ли использована секунда координации. Из-за " "особенностей NTP, проверка может работать до 24 часов до введения секунды " "координации. Некоторые крупные источники эталонных часов объявляют о " "секундах координации всего за час до события. Запрос к демону NTP:" #. type: delimited block . 4 #: documentation/content/en/articles/leap-seconds/_index.adoc:95 #, no-wrap msgid "% ntpq -c 'rv 0 leap'\n" msgstr "% ntpq -c 'rv 0 leap'\n" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:99 msgid "" "Output that includes `leap_add_sec` indicates proper support of the leap " "second. Before the 24 hours leading up to the leap second, or after the " "leap second has passed, `leap_none` will be shown." msgstr "" "Вывод, включающий `leap_add_sec`, указывает на корректную поддержку секунды " "координации. До 24 часов перед наступлением секунды координации или после её " "прохождения будет отображаться `leap_none`." #. type: Title == #: documentation/content/en/articles/leap-seconds/_index.adoc:101 #, no-wrap msgid "Conclusion" msgstr "Заключение" #. type: Plain text #: documentation/content/en/articles/leap-seconds/_index.adoc:104 msgid "" "In practice, leap seconds are usually not a problem on FreeBSD. We hope " "that this overview helps clarify what to expect and how to make the leap " "second event proceed more smoothly." msgstr "" "На практике секунды координации обычно не представляют проблемы в FreeBSD. " "Мы надеемся, что этот обзор поможет прояснить, чего ожидать и как сделать " "обработку секунды координации более гладкой." diff --git a/documentation/content/ru/articles/linux-users/_index.adoc b/documentation/content/ru/articles/linux-users/_index.adoc index 46c2b04b67..462219a7b2 100644 --- a/documentation/content/ru/articles/linux-users/_index.adoc +++ b/documentation/content/ru/articles/linux-users/_index.adoc @@ -1,337 +1,337 @@ --- authors: - author: 'John Ferrell' copyright: '2008 The FreeBSD Documentation Project' description: 'Этот документ предназначен для быстрого ознакомления с основами FreeBSD пользователей Linux® среднего и продвинутого уровня.' tags: ["Quickstart", "guide", "Linux", "FreeBSD"] title: 'Быстрое руководство по FreeBSD для пользователей Linux®' trademarks: ["freebsd", "intel", "redhat", "linux", "unix", "general"] --- = Быстрое руководство по FreeBSD для пользователей Linux(R) :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/linux-users/ 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 пользователей Linux(R) среднего и продвинутого уровня. ''' toc::[] [[intro]] == Введение В этом документе освещаются некоторые технические различия между FreeBSD и Linux(R), чтобы пользователи Linux(R) среднего и продвинутого уровней могли быстро ознакомиться с основами FreeBSD. -Этот документ предполагает, что FreeBSD уже установлена. Для получения помощи по процессу установки обратитесь к главе extref:{handbook}[Установка FreeBSD, bsdinstall] Руководства FreeBSD. +Этот документ предполагает, что FreeBSD уже установлена. Для получения помощи по процессу установки обратитесь к главе extref:{handbook}bsdinstall[Установка FreeBSD, bsdinstall] Руководства FreeBSD. [[shells]] == Стандартная оболочка Пользователи Linux(R) часто удивляются, обнаружив, что Bash не является оболочкой по умолчанию в FreeBSD. На самом деле, Bash не включён в стандартную установку. Вместо этого используется совместимая с Bourne shell оболочка man:sh[1] в качестве оболочки пользователя по умолчанию. Оболочка root — это man:tcsh[1] по умолчанию в FreeBSD 13 и более ранних версиях и man:sh[1] в FreeBSD 14 и позднее. Оболочка man:sh[1] очень похожа на Bash, но имеет гораздо меньший набор возможностей. Как правило, скрипты, написанные для man:sh[1], будут работать в Bash, но обратное не всегда верно. -Однако Bash и другие оболочки доступны для установки через extref:{handbook}[Коллекцию портов и пакетов FreeBSD, ports]. +Однако Bash и другие оболочки доступны для установки через extref:{handbook}ports[Коллекцию портов и пакетов FreeBSD, ports]. После установки другой оболочки используйте man:chsh[1], чтобы изменить оболочку пользователя по умолчанию. Рекомендуется оставить оболочку пользователя `root` без изменений, поскольку оболочки, не входящие в базовую поставку, устанавливаются в [.filename]#/usr/local/bin#. В случае возникновения проблемы файловая система, в которой находится [.filename]#/usr/local/bin#, может быть не смонтирована. В такой ситуации у `root` не будет доступа к своей оболочке по умолчанию, что помешает ему войти в систему и устранить проблему. [[software]] == Пакеты и порты: установка программ в FreeBSD FreeBSD предоставляет два метода установки приложений: бинарные пакеты и скомпилированные порты. Каждый метод имеет свои преимущества: .Бинарные пакеты * Быстрая установка по сравнению с компиляцией крупных приложений. * Не требует понимания того, как компилировать программное обеспечение. * Нет необходимости устанавливать компилятор. .Порты * Возможность настройки параметров установки. * Могут быть применены пользовательские патчи. Если установка приложения не требует дополнительной собственной настройки, достаточно установить пакет. Собирайте порт, если приложению требуется изменение параметров, заданных в пакетах по умолчанию. При необходимости собственный пакет можно собрать из портов с помощью `make package`. Полный список всех доступных портов и пакетов можно найти https://ports.freebsd.org[здесь]. [[packages]] === Пакеты Пакеты — это предварительно скомпилированные приложения, эквиваленты файлов [.filename]#.deb# в системах на основе Debian/Ubuntu и файлов [.filename]#.rpm# в системах на основе Red Hat/Fedora. Пакеты устанавливаются с помощью `pkg`. Например, следующая команда устанавливает Apache 2.4: [source, shell] .... # pkg install apache24 .... -Для получения дополнительной информации о пакетах обратитесь к разделу 4.4 Руководства FreeBSD: extref:{handbook}ports/[Использование pkg для управления бинарными пакетами, pkgng-intro]. +Для получения дополнительной информации о пакетах обратитесь к разделу 4.4 Руководства FreeBSD: extref:{handbook}ports[Использование pkg для управления бинарными пакетами, pkgng-intro]. [[ports]] === Порты Коллекция портов FreeBSD — это набор [.filename]#Makefile# и патчей, специально адаптированных для установки приложений из исходного кода в FreeBSD. При установке порта система загрузит исходный код, применит необходимые патчи, скомпилирует код и установит приложение вместе с требуемыми зависимостями. -Коллекция портов, иногда называемая деревом портов, может быть установлена в [.filename]#/usr/ports# с помощью link:{handbook}mirrors/#git[Git]. Подробные инструкции по установке Коллекции портов можно найти в extref:{handbook}ports/[разделе 4.5.1, ports-using-installation-methods] Руководства FreeBSD. +Коллекция портов, иногда называемая деревом портов, может быть установлена в [.filename]#/usr/ports# с помощью link:{handbook}mirrors/#git[Git]. Подробные инструкции по установке Коллекции портов можно найти в extref:{handbook}ports[разделе 4.5.1, ports-using-installation-methods] Руководства FreeBSD. Для сборки порта перейдите в его каталог и запустите процесс сборки. В следующем примере устанавливается Apache 2.4 из коллекции портов: [source, shell] .... # cd /usr/ports/www/apache24 # make install clean .... Преимущество использования портов для установки программного обеспечения заключается в возможности настройки параметров установки. В этом примере указано, что также должен быть установлен модуль mod_ldap: [source, shell] .... # cd /usr/ports/www/apache24 # make WITH_LDAP="YES" install clean .... -Обратитесь к extref:{handbook}ports/[Использование коллекции портов, ports-using] для получения дополнительной информации. +Обратитесь к extref:{handbook}ports[Использование коллекции портов, ports-using] для получения дополнительной информации. [[startup]] == Загрузка системы Многие дистрибутивы Linux(R) используют систему инициализации SysV, тогда как FreeBSD использует традиционный BSD-стиль man:init[8]. В BSD-стиле man:init[8] нет уровней запуска (run-levels), и файл [.filename]#/etc/inittab# отсутствует. Вместо этого запуск системы управляется сценариями man:rc[8]. При загрузке системы [.filename]#/etc/rc# читает [.filename]#/etc/rc.conf# и [.filename]#/etc/defaults/rc.conf#, чтобы определить, какие службы должны быть запущены. Указанные службы затем запускаются путем выполнения соответствующих сценариев инициализации, расположенных в [.filename]#/etc/rc.d/# и [.filename]#/usr/local/etc/rc.d/#. Эти сценарии аналогичны сценариям, расположенным в [.filename]#/etc/init.d/# в системах Linux(R). Скрипты, расположенные в [.filename]#/etc/rc.d/#, предназначены для приложений, входящих в "базовую" систему, таких как man:cron[8], man:sshd[8] и man:syslog[3]. Скрипты в [.filename]#/usr/local/etc/rc.d/# предназначены для пользовательских приложений, таких как Apache и Squid. -Поскольку FreeBSD разрабатывается как полноценная операционная система, пользовательские приложения не считаются частью «базовой» системы. Пользовательские приложения обычно устанавливаются с помощью extref:{handbook}ports/[Пакетов или Портов, ports-using]. Чтобы отделить их от базовой системы, пользовательские приложения устанавливаются в [.filename]#/usr/local/#. Таким образом, исполняемые файлы пользовательских приложений находятся в [.filename]#/usr/local/bin/#, конфигурационные файлы — в [.filename]#/usr/local/etc/# и так далее. +Поскольку FreeBSD разрабатывается как полноценная операционная система, пользовательские приложения не считаются частью «базовой» системы. Пользовательские приложения обычно устанавливаются с помощью extref:{handbook}ports[Пакетов или Портов, ports-using]. Чтобы отделить их от базовой системы, пользовательские приложения устанавливаются в [.filename]#/usr/local/#. Таким образом, исполняемые файлы пользовательских приложений находятся в [.filename]#/usr/local/bin/#, конфигурационные файлы — в [.filename]#/usr/local/etc/# и так далее. Сервисы включаются путем добавления соответствующей записи в файл [.filename]#/etc/rc.conf#. Системные параметры по умолчанию находятся в файле [.filename]#/etc/defaults/rc.conf#, а настройки по умолчанию переопределяются параметрами из файла [.filename]#/etc/rc.conf#. Подробнее о доступных параметрах можно узнать в man:rc.conf[5]. При установке дополнительных приложений ознакомьтесь с сообщением установки, чтобы определить, как включить связанные сервисы. Следующие записи в [.filename]#/etc/rc.conf# включают man:sshd[8], активируют Apache 2.4 и указывают, что Apache должен запускаться с SSL. [.programlisting] .... # enable SSHD sshd_enable="YES" # enable Apache with SSL apache24_enable="YES" apache24_flags="-DSSL" .... После включения службы в [.filename]#/etc/rc.conf# её можно запустить без перезагрузки системы: [source, shell] .... # service sshd start # service apache24 start .... Если служба не была включена, её можно запустить из командной строки с помощью `onestart`: [source, shell] .... # service sshd onestart .... [[network]] == Настройка сети Вместо общего идентификатора _ethX_, который используется в Linux(R) для обозначения сетевого интерфейса, FreeBSD использует имя драйвера с последующим числом. Следующий вывод из man:ifconfig[8] показывает два сетевых интерфейса Intel(R) Pro 1000 ([.filename]#em0# и [.filename]#em1#): [source, shell] .... % ifconfig em0: flags=8843 mtu 1500 options=b inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255 ether 00:50:56:a7:70:b2 media: Ethernet autoselect (1000baseTX ) status: active em1: flags=8843 mtu 1500 options=b inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255 ether 00:50:56:a7:03:2b media: Ethernet autoselect (1000baseTX ) status: active .... IP-адрес может быть назначен интерфейсу с помощью man:ifconfig[8]. Чтобы настройки сохранялись после перезагрузки, конфигурация IP должна быть указана в [.filename]#/etc/rc.conf#. Следующие записи в [.filename]#/etc/rc.conf# задают имя хоста, IP-адрес и шлюз по умолчанию: [.programlisting] .... hostname="server1.example.com" ifconfig_em0="inet 10.10.10.100 netmask 255.255.255.0" defaultrouter="10.10.10.1" .... Используйте следующие записи для настройки интерфейса через DHCP: [.programlisting] .... hostname="server1.example.com" ifconfig_em0="DHCP" .... [[firewall]] == Firewall FreeBSD не использует Linux(R) IPTABLES для своего межсетевого экрана. Вместо этого FreeBSD предлагает выбор из трёх межсетевых экранов на уровне ядра: -* extref:{handbook}[PF, firewalls-pf] -* extref:{handbook}[IPFILTER, firewalls-ipf] -* extref:{handbook}[IPFW, firewalls-ipfw] +* extref:{handbook}firewalls[PF, firewalls-pf] +* extref:{handbook}firewalls[IPFILTER, firewalls-ipf] +* extref:{handbook}firewalls[IPFW, firewalls-ipfw] PF разработан проектом OpenBSD и портирован в FreeBSD. PF был создан как замена для IPFILTER, и его синтаксис схож с синтаксисом IPFILTER. PF может использоваться совместно с man:altq[4] для обеспечения функций QoS. Этот пример записи PF разрешает входящий SSH: [.programlisting] .... pass in on $ext_if inet proto tcp from any to ($ext_if) port 22 .... IPFILTER — это приложение для межсетевого экрана, разработанное Дарреном Ридом. Оно не является специфичным для FreeBSD и было портировано на несколько операционных систем, включая NetBSD, OpenBSD, SunOS, HP/UX и Solaris. Синтаксис IPFILTER для разрешения входящего SSH: [.programlisting] .... pass in on $ext_if proto tcp from any to any port = 22 .... IPFW — это межсетевой экран, разработанный и поддерживаемый FreeBSD. Он может быть использован совместно с man:dummynet[4] для обеспечения возможностей управления трафиком и имитации различных типов сетевых соединений. Синтаксис IPFW для разрешения входящего SSH будет следующим: [.programlisting] .... ipfw add allow tcp from any to me 22 in via $ext_if .... [[updates]] == Обновление FreeBSD Существует два метода обновления системы FreeBSD: из исходного кода или бинарные обновления. Обновление из исходного кода — это наиболее сложный метод обновления, но он предоставляет наибольшую гибкость. Процесс включает синхронизацию локальной копии исходного кода FreeBSD с репозиторием FreeBSD Git. После того как локальный исходный код обновлён, можно скомпилировать новую версию ядра и пользовательского пространства. Двоичные обновления аналогичны использованию `yum` или `apt-get` для обновления системы Linux(R). В FreeBSD, man:freebsd-update[8] может быть использован для получения и установки новых двоичных обновлений. Эти обновления могут быть запланированы с помощью man:cron[8]. [NOTE] ==== При использовании man:cron[8] для планирования обновлений используйте `freebsd-update cron` в man:crontab[1], чтобы снизить вероятность одновременного скачивания обновлений большим количеством машин: [.programlisting] .... 0 3 * * * root /usr/sbin/freebsd-update cron .... ==== -Для получения дополнительной информации об обновлениях исходного кода и бинарных обновлениях обратитесь к extref:{handbook}cutting-edge/[главе об обновлениях, updating-upgrading-freebsdupdate] в Руководстве FreeBSD. +Для получения дополнительной информации об обновлениях исходного кода и бинарных обновлениях обратитесь к extref:{handbook}cutting-edge[главе об обновлениях, updating-upgrading-freebsdupdate] в Руководстве FreeBSD. [[procfs]] == procfs: ушёл, но не забыт В некоторых дистрибутивах Linux(R) можно посмотреть файл [.filename]#/proc/sys/net/ipv4/ip_forward#, чтобы определить, включена ли IP-маршрутизация. В FreeBSD вместо этого используется man:sysctl[8] для просмотра этого и других системных параметров. Например, используйте следующую команду, чтобы определить, включена ли IP-переадресация в системе FreeBSD: [source, shell] .... % sysctl net.inet.ip.forwarding net.inet.ip.forwarding: 0 .... Используйте `-a` для вывода всех системных настроек: [source, shell] .... % sysctl -a | more .... Если приложению требуется procfs, добавьте следующую запись в [.filename]#/etc/fstab#: [source, shell] .... proc /proc procfs rw,noauto 0 0 .... Добавление `noauto` предотвратит автоматическое монтирование [.filename]#/proc# при загрузке. Чтобы подключить файловую систему без перезагрузки: [source, shell] .... # mount /proc .... [[commands]] == Распространенные команды Некоторые эквиваленты распространённых команд приведены ниже: [.informaltable] [cols="1,1,1", frame="none", options="header"] |=== | Команда Linux(R) (Red Hat/Debian) | Эквивалент FreeBSD | Назначение |`yum install _package_` / `apt-get install _package_` |`pkg install _package_` |Установить пакет из удалённого репозитория |`rpm -ivh _package_` / `dpkg -i _package_` |`pkg add _package_` |Установить локальный пакет |`rpm -qa` / `dpkg -l` |`pkg info` |Список установленных пакетов |`lspci` |`pciconf` |Перечислить устройства PCI |`lsmod` |`kldstat` |Перечислить загруженные модули ядра |`modprobe` |`kldload` / `kldunload` |Загрузка/выгрузка модулей ядра |`strace` |`truss` |Трассировка системных вызовов |=== [[conclusion]] == Заключение Этот документ предоставил обзор FreeBSD. Для более детального изучения этих тем, а также многих других, не рассмотренных в данном документе, обратитесь к extref:{handbook}[Руководству FreeBSD]. diff --git a/documentation/content/ru/articles/linux-users/_index.po b/documentation/content/ru/articles/linux-users/_index.po index f431c57919..6c0b7ccaa7 100644 --- a/documentation/content/ru/articles/linux-users/_index.po +++ b/documentation/content/ru/articles/linux-users/_index.po @@ -1,990 +1,987 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2024-09-14 14:59-0300\n" -"PO-Revision-Date: 2025-08-06 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/linux-users/_index.adoc:1 #, no-wrap msgid "This document is intended to quickly familiarize intermediate to advanced Linux® users with the basics of FreeBSD." -msgstr "" -"Этот документ предназначен для быстрого ознакомления с основами FreeBSD " -"пользователей Linux® среднего и продвинутого уровня." +msgstr "Этот документ предназначен для быстрого ознакомления с основами FreeBSD пользователей Linux® среднего и продвинутого уровня." #. type: YAML Front Matter: title #: documentation/content/en/articles/linux-users/_index.adoc:1 #, no-wrap msgid "FreeBSD Quickstart Guide for Linux® Users" msgstr "Быстрое руководство по FreeBSD для пользователей Linux®" #. type: Title = #: documentation/content/en/articles/linux-users/_index.adoc:11 #, no-wrap msgid "FreeBSD Quickstart Guide for Linux(R) Users" msgstr "Быстрое руководство по FreeBSD для пользователей Linux(R)" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:46 msgid "" "This document is intended to quickly familiarize intermediate to advanced " "Linux(R) users with the basics of FreeBSD." msgstr "" "Этот документ предназначен для быстрого ознакомления с основами FreeBSD " "пользователей Linux(R) среднего и продвинутого уровня." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:48 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:52 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:55 msgid "" "This document highlights some of the technical differences between FreeBSD " "and Linux(R) so that intermediate to advanced Linux(R) users can quickly " "familiarize themselves with the basics of FreeBSD." msgstr "" "В этом документе освещаются некоторые технические различия между FreeBSD и " "Linux(R), чтобы пользователи Linux(R) среднего и продвинутого уровней могли " "быстро ознакомиться с основами FreeBSD." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:58 msgid "" "This document assumes that FreeBSD is already installed. Refer to the " -"extref:{handbook}[Installing FreeBSD, bsdinstall] chapter of the FreeBSD " -"Handbook for help with the installation process." +"extref:{handbook}bsdinstall[Installing FreeBSD, bsdinstall] chapter of the " +"FreeBSD Handbook for help with the installation process." msgstr "" "Этот документ предполагает, что FreeBSD уже установлена. Для получения " -"помощи по процессу установки обратитесь к главе extref:{handbook}[Установка " -"FreeBSD, bsdinstall] Руководства FreeBSD." +"помощи по процессу установки обратитесь к главе extref:{handbook}bsdinstall[" +"Установка FreeBSD, bsdinstall] Руководства FreeBSD." #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:60 #, no-wrap msgid "Default Shell" msgstr "Стандартная оболочка" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:68 msgid "" "Linux(R) users are often surprised to find that Bash is not the default " "shell in FreeBSD. In fact, Bash is not included in the default " "installation. Instead, the Bourne shell-compatible man:sh[1] as the default " "user shell. The root shell is man:tcsh[1] by default on FreeBSD 13 and " "earlier and man:sh[1] on FreeBSD 14 and later. man:sh[1] is very similar to " "Bash but with a much smaller feature-set. Generally shell scripts written " "for man:sh[1] will run in Bash, but the reverse is not always true." msgstr "" "Пользователи Linux(R) часто удивляются, обнаружив, что Bash не является " "оболочкой по умолчанию в FreeBSD. На самом деле, Bash не включён в " "стандартную установку. Вместо этого используется совместимая с Bourne shell " "оболочка man:sh[1] в качестве оболочки пользователя по умолчанию. Оболочка " "root — это man:tcsh[1] по умолчанию в FreeBSD 13 и более ранних версиях и " "man:sh[1] в FreeBSD 14 и позднее. Оболочка man:sh[1] очень похожа на Bash, " "но имеет гораздо меньший набор возможностей. Как правило, скрипты, " "написанные для man:sh[1], будут работать в Bash, но обратное не всегда верно." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:70 msgid "" "However, Bash and other shells are available for installation using the " -"FreeBSD extref:{handbook}[Packages and Ports Collection, ports]." +"FreeBSD extref:{handbook}ports[Packages and Ports Collection, ports]." msgstr "" -"Однако Bash и другие оболочки доступны для установки через extref:{handbook}[" -"Коллекцию портов и пакетов FreeBSD, ports]." +"Однако Bash и другие оболочки доступны для установки через " +"extref:{handbook}ports[Коллекцию портов и пакетов FreeBSD, ports]." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:75 msgid "" "After installing another shell, use man:chsh[1] to change a user's default " "shell. It is recommended that the `root` user's default shell remain " "unchanged since shells which are not included in the base distribution are " "installed to [.filename]#/usr/local/bin#. In the event of a problem, the " "file system where [.filename]#/usr/local/bin# is located may not be " "mounted. In this case, `root` would not have access to its default shell, " "preventing `root` from logging in and fixing the problem." msgstr "" "После установки другой оболочки используйте man:chsh[1], чтобы изменить " "оболочку пользователя по умолчанию. Рекомендуется оставить оболочку " "пользователя `root` без изменений, поскольку оболочки, не входящие в базовую " "поставку, устанавливаются в [.filename]#/usr/local/bin#. В случае " "возникновения проблемы файловая система, в которой находится [.filename]#/" "usr/local/bin#, может быть не смонтирована. В такой ситуации у `root` не " "будет доступа к своей оболочке по умолчанию, что помешает ему войти в " "систему и устранить проблему." #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:77 #, no-wrap msgid "Packages and Ports: Adding Software in FreeBSD" msgstr "Пакеты и порты: установка программ в FreeBSD" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:81 msgid "" "FreeBSD provides two methods for installing applications: binary packages " "and compiled ports. Each method has its own benefits:" msgstr "" "FreeBSD предоставляет два метода установки приложений: бинарные пакеты и " "скомпилированные порты. Каждый метод имеет свои преимущества:" #. type: Block title #: documentation/content/en/articles/linux-users/_index.adoc:82 #, no-wrap msgid "Binary Packages" msgstr "Бинарные пакеты" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:84 msgid "Faster installation as compared to compiling large applications." msgstr "Быстрая установка по сравнению с компиляцией крупных приложений." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:85 msgid "Does not require an understanding of how to compile software." msgstr "Не требует понимания того, как компилировать программное обеспечение." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:86 msgid "No need to install a compiler." msgstr "Нет необходимости устанавливать компилятор." #. type: Title === #: documentation/content/en/articles/linux-users/_index.adoc:87 #: documentation/content/en/articles/linux-users/_index.adoc:112 #, no-wrap msgid "Ports" msgstr "Порты" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:89 msgid "Ability to customize installation options." msgstr "Возможность настройки параметров установки." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:90 msgid "Custom patches can be applied." msgstr "Могут быть применены пользовательские патчи." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:94 msgid "" "If an application installation does not require any customization, " "installing the package is sufficient. Compile the port instead whenever an " "application requires customization of the default options. If needed, a " "custom package can be compiled from ports using `make package`." msgstr "" "Если установка приложения не требует дополнительной собственной настройки, " "достаточно установить пакет. Собирайте порт, если приложению требуется " "изменение параметров, заданных в пакетах по умолчанию. При необходимости " "собственный пакет можно собрать из портов с помощью `make package`." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:96 msgid "" "A complete list of all available ports and packages can be found https://" "ports.freebsd.org[here]." msgstr "" "Полный список всех доступных портов и пакетов можно найти https://ports." "freebsd.org[здесь]." #. type: Title === #: documentation/content/en/articles/linux-users/_index.adoc:98 #, no-wrap msgid "Packages" msgstr "Пакеты" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:103 msgid "" "Packages are pre-compiled applications, the FreeBSD equivalents of [." "filename]#.deb# files on Debian/Ubuntu based systems and [.filename]#.rpm# " "files on Red Hat/Fedora based systems. Packages are installed using `pkg`. " "For example, the following command installs Apache 2.4:" msgstr "" -"Пакеты — это предварительно скомпилированные приложения, эквиваленты файлов [" -".filename]#.deb# в системах на основе Debian/Ubuntu и файлов [.filename]#." +"Пакеты — это предварительно скомпилированные приложения, эквиваленты файлов " +"[.filename]#.deb# в системах на основе Debian/Ubuntu и файлов [.filename]#." "rpm# в системах на основе Red Hat/Fedora. Пакеты устанавливаются с помощью " "`pkg`. Например, следующая команда устанавливает Apache 2.4:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:107 #, no-wrap msgid "# pkg install apache24\n" msgstr "# pkg install apache24\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:110 msgid "" -"For more information on packages refer to section 5.4 of the FreeBSD " -"Handbook: extref:{handbook}[Using pkgng for Binary Package Management, pkgng-" -"intro]." +"For more information on packages refer to section 4.4 of the FreeBSD " +"Handbook: extref:{handbook}ports[Using pkgng for Binary Package Management, " +"pkgng-intro]." msgstr "" "Для получения дополнительной информации о пакетах обратитесь к разделу 4.4 " -"Руководства FreeBSD: extref:{handbook}ports/[Использование pkg для " -"управления бинарными пакетами, pkgng-intro]." +"Руководства FreeBSD: extref:{handbook}ports[Использование pkg для управления " +"бинарными пакетами, pkgng-intro]." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:116 msgid "" "The FreeBSD Ports Collection is a framework of [.filename]#Makefiles# and " "patches specifically customized for installing applications from source on " "FreeBSD. When installing a port, the system will fetch the source code, " "apply any required patches, compile the code, and install the application " "and any required dependencies." msgstr "" "Коллекция портов FreeBSD — это набор [.filename]#Makefile# и патчей, " "специально адаптированных для установки приложений из исходного кода в " "FreeBSD. При установке порта система загрузит исходный код, применит " "необходимые патчи, скомпилирует код и установит приложение вместе с " "требуемыми зависимостями." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:119 msgid "" "The Ports Collection, sometimes referred to as the ports tree, can be " "installed to [.filename]#/usr/ports# using link:{handbook}mirrors/" "#git[Git]. Detailed instructions for installing the Ports Collection can be " -"found in extref:{handbook}[section 4.5.1, ports-using-installation-methods] " -"of the FreeBSD Handbook." +"found in extref:{handbook}ports[section 4.5.1, ports-using-installation-" +"methods] of the FreeBSD Handbook." msgstr "" "Коллекция портов, иногда называемая деревом портов, может быть установлена в " "[.filename]#/usr/ports# с помощью link:{handbook}mirrors/#git[Git]. " "Подробные инструкции по установке Коллекции портов можно найти в " -"extref:{handbook}ports/[разделе 4.5.1, ports-using-installation-methods] " +"extref:{handbook}ports[разделе 4.5.1, ports-using-installation-methods] " "Руководства FreeBSD." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:121 msgid "" "To compile a port, change to the port's directory and start the build " "process. The following example installs Apache 2.4 from the Ports Collection:" msgstr "" "Для сборки порта перейдите в его каталог и запустите процесс сборки. В " "следующем примере устанавливается Apache 2.4 из коллекции портов:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:126 #, no-wrap msgid "" "# cd /usr/ports/www/apache24\n" "# make install clean\n" msgstr "" "# cd /usr/ports/www/apache24\n" "# make install clean\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:130 msgid "" "A benefit of using ports to install software is the ability to customize the " "installation options. This example specifies that the mod_ldap module " "should also be installed:" msgstr "" "Преимущество использования портов для установки программного обеспечения " "заключается в возможности настройки параметров установки. В этом примере " "указано, что также должен быть установлен модуль mod_ldap:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:135 #, no-wrap msgid "" "# cd /usr/ports/www/apache24\n" "# make WITH_LDAP=\"YES\" install clean\n" msgstr "" "# cd /usr/ports/www/apache24\n" "# make WITH_LDAP=\"YES\" install clean\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:138 msgid "" -"Refer to extref:{handbook}[Using the Ports Collection, ports-using] for more " -"information." +"Refer to extref:{handbook}ports[Using the Ports Collection, ports-using] for " +"more information." msgstr "" -"Обратитесь к extref:{handbook}ports/[Использование коллекции портов, ports-" +"Обратитесь к extref:{handbook}ports[Использование коллекции портов, ports-" "using] для получения дополнительной информации." #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:140 #, no-wrap msgid "System Startup" msgstr "Загрузка системы" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:147 msgid "" "Many Linux(R) distributions use the SysV init system, whereas FreeBSD uses " "the traditional BSD-style man:init[8]. Under the BSD-style man:init[8], " "there are no run-levels and [.filename]#/etc/inittab# does not exist. " "Instead, startup is controlled by man:rc[8] scripts. At system boot, [." "filename]#/etc/rc# reads [.filename]#/etc/rc.conf# and [.filename]#/etc/" "defaults/rc.conf# to determine which services are to be started. The " "specified services are then started by running the corresponding service " "initialization scripts located in [.filename]#/etc/rc.d/# and [.filename]#/" "usr/local/etc/rc.d/#. These scripts are similar to the scripts located in [." "filename]#/etc/init.d/# on Linux(R) systems." msgstr "" "Многие дистрибутивы Linux(R) используют систему инициализации SysV, тогда " -"как FreeBSD использует традиционный BSD-стиль man:init[8]. В BSD-стиле " -"man:init[8] нет уровней запуска (run-levels), и файл [.filename]#/etc/" -"inittab# отсутствует. Вместо этого запуск системы управляется сценариями " -"man:rc[8]. При загрузке системы [.filename]#/etc/rc# читает [.filename]#/etc/" -"rc.conf# и [.filename]#/etc/defaults/rc.conf#, чтобы определить, какие " -"службы должны быть запущены. Указанные службы затем запускаются путем " -"выполнения соответствующих сценариев инициализации, расположенных в [." -"filename]#/etc/rc.d/# и [.filename]#/usr/local/etc/rc.d/#. Эти сценарии " -"аналогичны сценариям, расположенным в [.filename]#/etc/init.d/# в системах " -"Linux(R)." +"как FreeBSD использует традиционный BSD-стиль man:init[8]. В BSD-стиле man:" +"init[8] нет уровней запуска (run-levels), и файл [.filename]#/etc/inittab# " +"отсутствует. Вместо этого запуск системы управляется сценариями man:rc[8]. " +"При загрузке системы [.filename]#/etc/rc# читает [.filename]#/etc/rc.conf# и " +"[.filename]#/etc/defaults/rc.conf#, чтобы определить, какие службы должны " +"быть запущены. Указанные службы затем запускаются путем выполнения " +"соответствующих сценариев инициализации, расположенных в [.filename]#/etc/rc." +"d/# и [.filename]#/usr/local/etc/rc.d/#. Эти сценарии аналогичны сценариям, " +"расположенным в [.filename]#/etc/init.d/# в системах Linux(R)." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:150 msgid "" "The scripts found in [.filename]#/etc/rc.d/# are for applications that are " "part of the \"base\" system, such as man:cron[8], man:sshd[8], and man:" "syslog[3]. The scripts in [.filename]#/usr/local/etc/rc.d/# are for user-" "installed applications such as Apache and Squid." msgstr "" "Скрипты, расположенные в [.filename]#/etc/rc.d/#, предназначены для " -"приложений, входящих в \"базовую\" систему, таких как man:cron[8], " -"man:sshd[8] и man:syslog[3]. Скрипты в [.filename]#/usr/local/etc/rc.d/# " +"приложений, входящих в \"базовую\" систему, таких как man:cron[8], man:" +"sshd[8] и man:syslog[3]. Скрипты в [.filename]#/usr/local/etc/rc.d/# " "предназначены для пользовательских приложений, таких как Apache и Squid." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:155 msgid "" "Since FreeBSD is developed as a complete operating system, user-installed " "applications are not considered to be part of the \"base\" system. User-" "installed applications are generally installed using extref:{handbook}" -"[Packages or Ports, ports-using]. In order to keep them separate from the " -"base system, user-installed applications are installed under [.filename]#/" -"usr/local/#. Therefore, user-installed binaries reside in [.filename]#/usr/" -"local/bin/#, configuration files are in [.filename]#/usr/local/etc/#, and so " -"on." +"ports[Packages or Ports, ports-using]. In order to keep them separate from " +"the base system, user-installed applications are installed under [." +"filename]#/usr/local/#. Therefore, user-installed binaries reside in [." +"filename]#/usr/local/bin/#, configuration files are in [.filename]#/usr/" +"local/etc/#, and so on." msgstr "" "Поскольку FreeBSD разрабатывается как полноценная операционная система, " "пользовательские приложения не считаются частью «базовой» системы. " "Пользовательские приложения обычно устанавливаются с помощью " -"extref:{handbook}ports/[Пакетов или Портов, ports-using]. Чтобы отделить их " +"extref:{handbook}ports[Пакетов или Портов, ports-using]. Чтобы отделить их " "от базовой системы, пользовательские приложения устанавливаются в [." "filename]#/usr/local/#. Таким образом, исполняемые файлы пользовательских " "приложений находятся в [.filename]#/usr/local/bin/#, конфигурационные файлы —" " в [.filename]#/usr/local/etc/# и так далее." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:160 msgid "" "Services are enabled by adding an entry for the service in [.filename]#/etc/" "rc.conf#. The system defaults are found in [.filename]#/etc/defaults/rc." "conf# and these default settings are overridden by settings in [.filename]#/" "etc/rc.conf#. Refer to man:rc.conf[5] for more information about the " "available entries. When installing additional applications, review the " "application's install message to determine how to enable any associated " "services." msgstr "" "Сервисы включаются путем добавления соответствующей записи в файл [." -"filename]#/etc/rc.conf#. Системные параметры по умолчанию находятся в файле [" -".filename]#/etc/defaults/rc.conf#, а настройки по умолчанию переопределяются " -"параметрами из файла [.filename]#/etc/rc.conf#. Подробнее о доступных " -"параметрах можно узнать в man:rc.conf[5]. При установке дополнительных " -"приложений ознакомьтесь с сообщением установки, чтобы определить, как " -"включить связанные сервисы." +"filename]#/etc/rc.conf#. Системные параметры по умолчанию находятся в файле " +"[.filename]#/etc/defaults/rc.conf#, а настройки по умолчанию " +"переопределяются параметрами из файла [.filename]#/etc/rc.conf#. Подробнее о " +"доступных параметрах можно узнать в man:rc.conf[5]. При установке " +"дополнительных приложений ознакомьтесь с сообщением установки, чтобы " +"определить, как включить связанные сервисы." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:162 msgid "" "The following entries in [.filename]#/etc/rc.conf# enable man:sshd[8], " "enable Apache 2.4, and specify that Apache should be started with SSL." msgstr "" "Следующие записи в [.filename]#/etc/rc.conf# включают man:sshd[8], " "активируют Apache 2.4 и указывают, что Apache должен запускаться с SSL." #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:170 #, no-wrap msgid "" "# enable SSHD\n" "sshd_enable=\"YES\"\n" "# enable Apache with SSL\n" "apache24_enable=\"YES\"\n" "apache24_flags=\"-DSSL\"\n" msgstr "" "# enable SSHD\n" "sshd_enable=\"YES\"\n" "# enable Apache with SSL\n" "apache24_enable=\"YES\"\n" "apache24_flags=\"-DSSL\"\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:173 msgid "" "Once a service has been enabled in [.filename]#/etc/rc.conf#, it can be " "started without rebooting the system:" msgstr "" "После включения службы в [.filename]#/etc/rc.conf# её можно запустить без " "перезагрузки системы:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:178 #, no-wrap msgid "" "# service sshd start\n" "# service apache24 start\n" msgstr "" "# service sshd start\n" "# service apache24 start\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:181 msgid "" "If a service has not been enabled, it can be started from the command line " "using `onestart`:" msgstr "" "Если служба не была включена, её можно запустить из командной строки с " "помощью `onestart`:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:185 #, no-wrap msgid "# service sshd onestart\n" msgstr "# service sshd onestart\n" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:188 #, no-wrap msgid "Network Configuration" msgstr "Настройка сети" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:192 msgid "" "Instead of a generic _ethX_ identifier that Linux(R) uses to identify a " "network interface, FreeBSD uses the driver name followed by a number. The " "following output from man:ifconfig[8] shows two Intel(R) Pro 1000 network " "interfaces ([.filename]#em0# and [.filename]#em1#):" msgstr "" "Вместо общего идентификатора _ethX_, который используется в Linux(R) для " "обозначения сетевого интерфейса, FreeBSD использует имя драйвера с " "последующим числом. Следующий вывод из man:ifconfig[8] показывает два " "сетевых интерфейса Intel(R) Pro 1000 ([.filename]#em0# и [.filename]#em1#):" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:208 #, no-wrap msgid "" "% ifconfig\n" "em0: flags=8843 mtu 1500\n" " options=b\n" " inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255\n" " ether 00:50:56:a7:70:b2\n" " media: Ethernet autoselect (1000baseTX )\n" " status: active\n" "em1: flags=8843 mtu 1500\n" " options=b\n" " inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255\n" " ether 00:50:56:a7:03:2b\n" " media: Ethernet autoselect (1000baseTX )\n" " status: active\n" msgstr "" "% ifconfig\n" "em0: flags=8843 mtu 1500\n" " options=b\n" " inet 10.10.10.100 netmask 0xffffff00 broadcast 10.10.10.255\n" " ether 00:50:56:a7:70:b2\n" " media: Ethernet autoselect (1000baseTX )\n" " status: active\n" "em1: flags=8843 mtu 1500\n" " options=b\n" " inet 192.168.10.222 netmask 0xffffff00 broadcast 192.168.10.255\n" " ether 00:50:56:a7:03:2b\n" " media: Ethernet autoselect (1000baseTX )\n" " status: active\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:213 msgid "" "An IP address can be assigned to an interface using man:ifconfig[8]. To " "remain persistent across reboots, the IP configuration must be included in [." "filename]#/etc/rc.conf#. The following [.filename]#/etc/rc.conf# entries " "specify the hostname, IP address, and default gateway:" msgstr "" "IP-адрес может быть назначен интерфейсу с помощью man:ifconfig[8]. Чтобы " "настройки сохранялись после перезагрузки, конфигурация IP должна быть " "указана в [.filename]#/etc/rc.conf#. Следующие записи в [.filename]#/etc/rc." "conf# задают имя хоста, IP-адрес и шлюз по умолчанию:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:219 #, no-wrap msgid "" "hostname=\"server1.example.com\"\n" "ifconfig_em0=\"inet 10.10.10.100 netmask 255.255.255.0\"\n" "defaultrouter=\"10.10.10.1\"\n" msgstr "" "hostname=\"server1.example.com\"\n" "ifconfig_em0=\"inet 10.10.10.100 netmask 255.255.255.0\"\n" "defaultrouter=\"10.10.10.1\"\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:222 msgid "Use the following entries to instead configure an interface for DHCP:" msgstr "Используйте следующие записи для настройки интерфейса через DHCP:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:227 #, no-wrap msgid "" "hostname=\"server1.example.com\"\n" "ifconfig_em0=\"DHCP\"\n" msgstr "" "hostname=\"server1.example.com\"\n" "ifconfig_em0=\"DHCP\"\n" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:230 #, no-wrap msgid "Firewall" msgstr "Firewall" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:234 msgid "" "FreeBSD does not use Linux(R) IPTABLES for its firewall. Instead, FreeBSD " "offers a choice of three kernel level firewalls:" msgstr "" "FreeBSD не использует Linux(R) IPTABLES для своего межсетевого экрана. " "Вместо этого FreeBSD предлагает выбор из трёх межсетевых экранов на уровне " "ядра:" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:236 -msgid "extref:{handbook}[PF, firewalls-pf]" -msgstr "extref:{handbook}[PF, firewalls-pf]" +msgid "extref:{handbook}firewalls[PF, firewalls-pf]" +msgstr "extref:{handbook}firewalls[PF, firewalls-pf]" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:237 -msgid "extref:{handbook}[IPFILTER, firewalls-ipf]" -msgstr "extref:{handbook}[IPFILTER, firewalls-ipf]" +msgid "extref:{handbook}firewalls[IPFILTER, firewalls-ipf]" +msgstr "extref:{handbook}firewalls[IPFILTER, firewalls-ipf]" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:238 -msgid "extref:{handbook}[IPFW, firewalls-ipfw]" -msgstr "extref:{handbook}[IPFW, firewalls-ipfw]" +msgid "extref:{handbook}firewalls[IPFW, firewalls-ipfw]" +msgstr "extref:{handbook}firewalls[IPFW, firewalls-ipfw]" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:242 msgid "" "PF is developed by the OpenBSD project and ported to FreeBSD. PF was " "created as a replacement for IPFILTER and its syntax is similar to that of " "IPFILTER. PF can be paired with man:altq[4] to provide QoS features." msgstr "" "PF разработан проектом OpenBSD и портирован в FreeBSD. PF был создан как " "замена для IPFILTER, и его синтаксис схож с синтаксисом IPFILTER. PF может " "использоваться совместно с man:altq[4] для обеспечения функций QoS." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:244 msgid "This sample PF entry allows inbound SSH:" msgstr "Этот пример записи PF разрешает входящий SSH:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:248 #, no-wrap msgid "pass in on $ext_if inet proto tcp from any to ($ext_if) port 22\n" msgstr "pass in on $ext_if inet proto tcp from any to ($ext_if) port 22\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:252 msgid "" "IPFILTER is the firewall application developed by Darren Reed. It is not " "specific to FreeBSD and has been ported to several operating systems " "including NetBSD, OpenBSD, SunOS, HP/UX, and Solaris." msgstr "" "IPFILTER — это приложение для межсетевого экрана, разработанное Дарреном " "Ридом. Оно не является специфичным для FreeBSD и было портировано на " "несколько операционных систем, включая NetBSD, OpenBSD, SunOS, HP/UX и " "Solaris." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:254 msgid "The IPFILTER syntax to allow inbound SSH is:" msgstr "Синтаксис IPFILTER для разрешения входящего SSH:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:258 #, no-wrap msgid "pass in on $ext_if proto tcp from any to any port = 22\n" msgstr "pass in on $ext_if proto tcp from any to any port = 22\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:262 msgid "" "IPFW is the firewall developed and maintained by FreeBSD. It can be paired " "with man:dummynet[4] to provide traffic shaping capabilities and simulate " "different types of network connections." msgstr "" "IPFW — это межсетевой экран, разработанный и поддерживаемый FreeBSD. Он " "может быть использован совместно с man:dummynet[4] для обеспечения " "возможностей управления трафиком и имитации различных типов сетевых " "соединений." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:264 msgid "The IPFW syntax to allow inbound SSH would be:" msgstr "Синтаксис IPFW для разрешения входящего SSH будет следующим:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:268 #, no-wrap msgid "ipfw add allow tcp from any to me 22 in via $ext_if\n" msgstr "ipfw add allow tcp from any to me 22 in via $ext_if\n" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:271 #, no-wrap msgid "Updating FreeBSD" msgstr "Обновление FreeBSD" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:274 msgid "" "There are two methods for updating a FreeBSD system: from source or binary " "updates." msgstr "" "Существует два метода обновления системы FreeBSD: из исходного кода или " "бинарные обновления." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:278 msgid "" "Updating from source is the most involved update method, but offers the " "greatest amount of flexibility. The process involves synchronizing a local " "copy of the FreeBSD source code with the FreeBSD Git repository. Once the " "local source code is up-to-date, a new version of the kernel and userland " "can be compiled." msgstr "" "Обновление из исходного кода — это наиболее сложный метод обновления, но он " "предоставляет наибольшую гибкость. Процесс включает синхронизацию локальной " "копии исходного кода FreeBSD с репозиторием FreeBSD Git. После того как " "локальный исходный код обновлён, можно скомпилировать новую версию ядра и " "пользовательского пространства." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:282 msgid "" "Binary updates are similar to using `yum` or `apt-get` to update a Linux(R) " "system. In FreeBSD, man:freebsd-update[8] can be used fetch new binary " "updates and install them. These updates can be scheduled using man:cron[8]." msgstr "" "Двоичные обновления аналогичны использованию `yum` или `apt-get` для " "обновления системы Linux(R). В FreeBSD, man:freebsd-update[8] может быть " "использован для получения и установки новых двоичных обновлений. Эти " "обновления могут быть запланированы с помощью man:cron[8]." #. type: delimited block = 4 #: documentation/content/en/articles/linux-users/_index.adoc:286 msgid "" "When using man:cron[8] to schedule updates, use `freebsd-update cron` in the " "man:crontab[1] to reduce the possibility of a large number of machines all " "pulling updates at the same time:" msgstr "" "При использовании man:cron[8] для планирования обновлений используйте " "`freebsd-update cron` в man:crontab[1], чтобы снизить вероятность " "одновременного скачивания обновлений большим количеством машин:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:290 #, no-wrap msgid "0 3 * * * root /usr/sbin/freebsd-update cron\n" msgstr "0 3 * * * root /usr/sbin/freebsd-update cron\n" #. type: delimited block = 4 #: documentation/content/en/articles/linux-users/_index.adoc:295 msgid "" "For more information on source and binary updates, refer to extref:{handbook}" -"[the chapter on updating, updating-upgrading-freebsdupdate] in the FreeBSD " -"Handbook." +"cutting-edge[the chapter on updating, updating-upgrading-freebsdupdate] in " +"the FreeBSD Handbook." msgstr "" "Для получения дополнительной информации об обновлениях исходного кода и " -"бинарных обновлениях обратитесь к extref:{handbook}cutting-edge/[главе об " +"бинарных обновлениях обратитесь к extref:{handbook}cutting-edge[главе об " "обновлениях, updating-upgrading-freebsdupdate] в Руководстве FreeBSD." #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:297 #, no-wrap msgid "procfs: Gone But Not Forgotten" msgstr "procfs: ушёл, но не забыт" #. type: delimited block = 4 #: documentation/content/en/articles/linux-users/_index.adoc:301 msgid "" "In some Linux(R) distributions, one could look at [.filename]#/proc/sys/net/" "ipv4/ip_forward# to determine if IP forwarding is enabled. In FreeBSD, man:" "sysctl[8] is instead used to view this and other system settings." msgstr "" "В некоторых дистрибутивах Linux(R) можно посмотреть файл [.filename]#/proc/" "sys/net/ipv4/ip_forward#, чтобы определить, включена ли IP-маршрутизация. В " "FreeBSD вместо этого используется man:sysctl[8] для просмотра этого и других " "системных параметров." #. type: delimited block = 4 #: documentation/content/en/articles/linux-users/_index.adoc:303 msgid "" "For example, use the following to determine if IP forwarding is enabled on a " "FreeBSD system:" msgstr "" "Например, используйте следующую команду, чтобы определить, включена ли IP-" "переадресация в системе FreeBSD:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:308 #, no-wrap msgid "" "% sysctl net.inet.ip.forwarding\n" "net.inet.ip.forwarding: 0\n" msgstr "" "% sysctl net.inet.ip.forwarding\n" "net.inet.ip.forwarding: 0\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:311 msgid "Use `-a` to list all the system settings:" msgstr "Используйте `-a` для вывода всех системных настроек:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:315 #, no-wrap msgid "% sysctl -a | more\n" msgstr "% sysctl -a | more\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:318 msgid "" "If an application requires procfs, add the following entry to [.filename]#/" "etc/fstab#:" msgstr "" "Если приложению требуется procfs, добавьте следующую запись в [.filename]#/" "etc/fstab#:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:322 #, no-wrap msgid "proc /proc procfs rw,noauto 0 0\n" msgstr "proc /proc procfs rw,noauto 0 0\n" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:325 msgid "" "Including `noauto` will prevent [.filename]#/proc# from being automatically " "mounted at boot." msgstr "" -"Добавление `noauto` предотвратит автоматическое монтирование [." -"filename]#/proc# при загрузке." +"Добавление `noauto` предотвратит автоматическое монтирование [.filename]#/" +"proc# при загрузке." #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:327 msgid "To mount the file system without rebooting:" msgstr "Чтобы подключить файловую систему без перезагрузки:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-users/_index.adoc:331 #, no-wrap msgid "# mount /proc\n" msgstr "# mount /proc\n" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:334 #, no-wrap msgid "Common Commands" msgstr "Распространенные команды" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:337 msgid "Some common command equivalents are as follows:" msgstr "Некоторые эквиваленты распространённых команд приведены ниже:" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:342 #, no-wrap msgid "Linux(R) command (Red Hat/Debian)" msgstr "Команда Linux(R) (Red Hat/Debian)" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:343 #, no-wrap msgid "FreeBSD equivalent" msgstr "Эквивалент FreeBSD" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:345 #, no-wrap msgid "Purpose" msgstr "Назначение" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:346 #, no-wrap msgid "`yum install _package_` / `apt-get install _package_`" msgstr "`yum install _package_` / `apt-get install _package_`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:347 #, no-wrap msgid "`pkg install _package_`" msgstr "`pkg install _package_`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:349 #, no-wrap msgid "Install package from remote repository" msgstr "Установить пакет из удалённого репозитория" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:350 #, no-wrap msgid "`rpm -ivh _package_` / `dpkg -i _package_`" msgstr "`rpm -ivh _package_` / `dpkg -i _package_`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:351 #, no-wrap msgid "`pkg add _package_`" msgstr "`pkg add _package_`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:353 #, no-wrap msgid "Install local package" msgstr "Установить локальный пакет" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:354 #, no-wrap msgid "`rpm -qa` / `dpkg -l`" msgstr "`rpm -qa` / `dpkg -l`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:355 #, no-wrap msgid "`pkg info`" msgstr "`pkg info`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:357 #, no-wrap msgid "List installed packages" msgstr "Список установленных пакетов" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:358 #, no-wrap msgid "`lspci`" msgstr "`lspci`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:359 #, no-wrap msgid "`pciconf`" msgstr "`pciconf`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:361 #, no-wrap msgid "List PCI devices" msgstr "Перечислить устройства PCI" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:362 #, no-wrap msgid "`lsmod`" msgstr "`lsmod`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:363 #, no-wrap msgid "`kldstat`" msgstr "`kldstat`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:365 #, no-wrap msgid "List loaded kernel modules" msgstr "Перечислить загруженные модули ядра" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:366 #, no-wrap msgid "`modprobe`" msgstr "`modprobe`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:367 #, no-wrap msgid "`kldload` / `kldunload`" msgstr "`kldload` / `kldunload`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:369 #, no-wrap msgid "Load/Unload kernel modules" msgstr "Загрузка/выгрузка модулей ядра" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:370 #, no-wrap msgid "`strace`" msgstr "`strace`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:371 #, no-wrap msgid "`truss`" msgstr "`truss`" #. type: Table #: documentation/content/en/articles/linux-users/_index.adoc:372 #, no-wrap msgid "Trace system calls" msgstr "Трассировка системных вызовов" #. type: Title == #: documentation/content/en/articles/linux-users/_index.adoc:375 #, no-wrap msgid "Conclusion" msgstr "Заключение" #. type: Plain text #: documentation/content/en/articles/linux-users/_index.adoc:378 msgid "" "This document has provided an overview of FreeBSD. Refer to the extref:" "{handbook}[FreeBSD Handbook] for more in-depth coverage of these topics as " "well as the many topics not covered by this document." msgstr "" "Этот документ предоставил обзор FreeBSD. Для более детального изучения этих " "тем, а также многих других, не рассмотренных в данном документе, обратитесь " "к extref:{handbook}[Руководству FreeBSD]." diff --git a/documentation/content/ru/articles/mailing-list-faq/_index.adoc b/documentation/content/ru/articles/mailing-list-faq/_index.adoc index 44d4113493..c47023bf02 100644 --- a/documentation/content/ru/articles/mailing-list-faq/_index.adoc +++ b/documentation/content/ru/articles/mailing-list-faq/_index.adoc @@ -1,178 +1,178 @@ --- authors: - author: 'The FreeBSD Documentation Project' copyright: '2004-2021 The FreeBSD Documentation Project' description: 'Как оптимально использовать почтовые рассылки, в том числе как избежать часто повторяющихся обсуждений' tags: ["FAQ", "Mailing Lists", "FreeBSD"] title: 'Часто задаваемые вопросы по спискам рассылки FreeBSD' --- = Часто задаваемые вопросы по спискам рассылки FreeBSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/mailing-list-faq/ 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] Аннотация -Эта статья посвящена часто задаваемым вопросам (FAQ) по спискам рассылки FreeBSD. Если вы хотите помочь поддерживать данный документ, напишите письмо в {freebsd-doc}. Последняя версия данного документа доступна на link:.[WWW сервере FreeBSD]. Вы можете получить данную статью в виде одного большого link:.[HTML] файла, используя HTTP протокол или в виде простого текста, форматов PostScript, PDF, и других с https://download.freebsd.org/doc/[FTP сервера FreeBSD]. Возможно вы захотите link:https://www.FreeBSD.org/search/[Найти FAQ]. +Эта статья посвящена часто задаваемым вопросам (FAQ) по спискам рассылки FreeBSD. Если вы хотите помочь поддерживать данный документ, напишите письмо в {freebsd-doc}. Последняя версия данного документа доступна на extref:{mailing-list-faq}[WWW сервере FreeBSD]. Вы можете получить данную статью в виде одного большого extref:{mailing-list-faq}[HTML] файла, используя HTTP протокол или в виде простого текста, форматов PostScript, PDF, и других с https://download.freebsd.org/doc/[FTP сервера FreeBSD]. Возможно вы захотите link:https://www.FreeBSD.org/search/[Найти FAQ]. ''' toc::[] [[introduction]] == Введение Цель этого документа ответить на часто задаваемые вопросы, касающиеся списков рассылки FreeBSD. Хотя FAQ задумывались для снижения количества задаваемых повторяющихся вопросов, они стали восприниматься, как ценные источники информации. Этот документ - попытка представить консенсус всего сообщества, и поэтому он не может считаться __официальным__. Если вы найдете технические неточности в данном документе или у вас есть предложения по добавлению новых пунктов, пожалуйста отправьте PR или напишите в {freebsd-doc}. Спасибо. === Зачем вообще нужны списки рассылки по FreeBSD? Списки рассылки по FreeBSD служат, как первичное средство связи FreeBSD сообщества, они покрывают множество различных тем. === Кто пользуется этими списками рассылки? Это зависит от регламента каждой конкретной рассылки. Некоторые списки больше ориентированы на разработчиков, некоторые - на всё сообщество FreeBSD в целом. Актуальную информацию смотрите по ссылке: link:https://lists.FreeBSD.org/[этот список]. В списках рассылки используется английский язык, если другой язык не указан явно. === Доступны ли списки рассылки по FreeBSD для каждого? Повторюсь: это зависит от устава (правил) каждого конкретного списка рассылки. Пожалуйста, прочтите устав списка перед отправкой в него письма и соблюдайте его при каждом сообщении. Это способствует более комфортной работе со списками рассылки. Если после просмотра выше расположенного списка, вы до сих пор не знаете в какой список рассылки направить письмо, то вам наверняка подойдёт freebsd-questions (но прежде прочтите советы ниже). Обратите внимание, что для отправки сообщений в список рассылки необходимо быть его подписчиком. Вы можете оформить подписку, не получая сообщения, которые в него отправляются. === Как я могу подписаться? Вы можете использовать link:https://lists.FreeBSD.org/[web интерфейс Mlmmj] для подписки на любой из открытых списков рассылки. === Как мне отписаться? Вы можете использовать вышеупомянутый интерфейс или следовать инструкциям, находящимся в конце каждого письма, отправленного в этот список рассылки. Пожалуйста, не посылайте письма с отказом от подписки в сами публичные списки. Во-первых, вы так не отпишитесь, а во-вторых, вызовете раздражение подписчиков, и вероятно получите неприятные высказывания в свой адрес. Это классическая ошибка при работе со списками рассылки; старайтесь не повторять её. === Доступны ли архивы? Да. Архивы со всеми письмами с 1994 года доступны link:https://mail-archive.freebsd.org/mail/[здесь]. Вот ссылки на https://lists.freebsd.org/pipermail[архив mailman] и link:https://lists.freebsd.org/archives[архив mlmmj]. === Доступны ли списки рассылки в дайджест формате? Да. Посмотрите link:https://lists.FreeBSD.org/[веб интерфейс Mlmmj]. [[etiquette]] == Этикет списков рассылки Участие в любом списке рассылки, как и в любом другом сообществе требует общего базиса для общения. Пожалуйста, отправляйте только подходящие сообщения и следуйте общепринятым нормам этикета. === Что я должен сделать перед отправлением письма? Вы уже сделали важный шаг, решив прочитать эту статью. Если вы новичок во FreeBSD, то сначала ознакомьтесь с программным обеспечением и связанной с нею документацией, включающей множество extref:https://www.FreeBSD.org/docs/[книг и статьей]. Могут быть интересными: extref:{faq}[Часто задаваемые вопросы по FreeBSD (FAQ)], extref:{handbook}[Руководство по FreeBSD], и статьи extref:{freebsd-questions-article}[Как работать со списком рассылки FreeBSD-questions с максимальной отдачей], extref:{explaining-bsd}[Что такое BSD], и extref:{new-users}[Пособие для новичков во FreeBSD]. Считается дурным тоном задавать вопросы, на которые уже есть ответ в приведённых выше документах. Это не потому что добровольцы, работающие над данным проектом очень плохие люди, а после многократного ответа на одни и те же вопросы - раздражение берёт своё. Это особенно справедливо, если уже существует и доступен ответ на вопрос. Не забывайте, что вся работа по улучшению FreeBSD выполняется добровольцами, и что мы только люди. === Что считается несоответствующим письмом? * Письма должны соответствовать уставу списка рассылки. * Личные нападки недопустимы. Как ответственные участники сетевого сообщества, мы должны придерживаться высоких стандартов поведения. * Спам не разрешён. Нарушители данного правила будут забанены. === Что считается хорошим этикетом при посылке писем в списки рассылки? * Пожалуйста, составляйте строки длиной примерно в 75 символов, так как не каждый использует модную почтовую программу с графическим интерфейсом. * Пожалуйста, обращайте внимание на тот факт, что пропускная способность ограничена. Не каждый читает почту через высокоскоростное соединение. Если вы отправляете содержимое какого-нибудь файла, например [.filename]#config.log# или объёмную трассировку стека, то, пожалуйста, размещайте его на каком-нибудь веб-сайте и присылайте просто ссылку на него. Помните, что такие сообщения будут заархивированны, и это просто добавит ненужные байты к архиву. * Оформляйте ваше сообщение, чтобы оно было читабельно и ПОЖАЛУЙСТА, НЕ КРИЧИТЕ!!!!!. Не упускайте из виду эффект, которое производит плохо отформатированное письмо, причём не только в списках рассылки FreeBSD. Ваше сообщение будет просмотрено другими людьми, и если оно плохо отформатировано, имеет множество ошибок и/или восклицательных знаков, то это создаст нехорошее впечатление о вас. * Пожалуйста, используйте подходящий язык общения для конкретного списка рассылки. link:https://www.FreeBSD.org/community/mailinglists/[ Существует] много не англоязычных рассылок. + Мы понимаем, что для многих английский не родной язык и поэтому мы пытаемся сделать некие пособия. Считается плохим тоном критиковать людей не говорящих по-английски за лексические и грамматические ошибки. FreeBSD имеет отличные продвижения в этом отношении. Пожалуйста, помогайте сохранять нам эту традицию. * Пожалуйста, используйте совместимый со стандартами почтовый клиент (MUA). Много плохо отформатированных сообщений исходят от http://www.lemis.com/grog/email/email.php[неправильно работающих или плохо сконфигурированных почтовых клиентов]. Известно, что следующие почтовые программы могут посылать неправильно отформатированные сообщения без вашего ведома: ** exmh ** Microsoft(R) Exchange ** Microsoft(R) Outlook(R) + Постарайтесь не использовать MIME: многие используют программы, которые не очень хорошо работают с MIME. * Проверьте правильность настроек времени и временной зоны. Это может выглядеть немножко глупо, потому что ваши сообщения все равно будут доставляться, однако многие люди получают несколько сотен сообщений в день. Зачастую они сортируют входящие сообщения по теме и дате, и если ваше сообщение не будет предшествовать первому ответу, то они могут предположить, что оно потерялось и даже не взглянут на него. * Основной объем информации, который вы должны предоставить, представляет собой вывод программ, таких, как man:dmesg[8], или консольные сообщения, которые обычно появляются в файле [.filename]#/var/log/messages#. Не пытайтесь скопировать эту информацию, набрав ее снова; это действительно трудно, и здесь легко сделать ошибку. Чтобы послать содержимое файлов протоколов, сделайте копию файла и воспользуйтесь редактором для того, чтобы обрезать информацию, оставив только относящуюся к делу, либо скопируйте и вставьте текст в ваше сообщение. В случае вывода программ, таких, как `dmesg`, перенаправьте вывод в файл и включите его в письмо. Например, + [source, shell] .... % dmesg > /tmp/dmesg.out .... + Эта команда перенаправляет информацию в файл [.filename]#/tmp/dmesg.out#. * При использовании операций копирования и вставки учтите, что некоторые такие операции отрицательно сказываются на формате строк. Особенно это стоит учесть при посылке содержимого файлов [.filename]#Makefile#, где `tab` является важным символом. Это довольно часто встречающаяся проблема в link:https://www.FreeBSD.org/support/[ базе данных сообщений об ошибках]. В [.filename]#Makefile# символы tab меняются на пробелы, или раздражающие `=3B` escape последовательности. === Каких правил этикета стоит придерживаться при ответе на уже существующее сообщение? * Пожалуйста, включайте относящийся к теме текст из исходного письма. Сокращайте его до минимума, но не переусердствуйте. Любой, кто не читал исходное сообщение должен суметь понять о чём идёт речь. + Это особенно важно для ответов в стиле «Да, я это тоже вижу», где исходное сообщение составляло сотни строчек. * Отделяйте текст исходного сообщения от текста, добавляемого вами. Чаще всего строчки исходного сообщения предваряются "`>`" и пробелом. Отделяйте ваш текст от текста исходного сообщения пустыми строчками. Эти правила помогут сделать ваши сообщения более читабельными. * Пожалуйста, убедитесь в корректном указании авторства текста, который вы цитируйте. Люди могут обидеться, если вы приписываете им слова, которые они не писали. * Пожалуйста, не пишите `ответ в начале письма`. Это значит, что при ответе на сообщения вставляйте ваши ответы в конец, после текста, копируемого из исходного сообщения. + ** Ответ: Потому что это не соответствует логическому ходу обсуждения. ** Вопрос: Чем плох ответ в начале письма? + (Спасибо Рэнди Бушу (Randy Bush) за шутку.) [[recurring]] == Повторяющиеся темы в списках рассылки Участие в списках рассылки, как и участие в любом сообществе требует общего базиса для общения. Большое количество рассылок предполагают знание истории Проекта. В частности, существует несколько тем обсуждения, которые возникают у новичков. Обязанность каждого участника не создавать дискуссии на эти темы, тем самым помочь спискам рассылки не отрываться от обсуждаемых тем и обезопасить себя от разгорячённых бесед. Лучший способ предотвратить это - ознакомиться с http://docs.FreeBSD.org/mail/[архивами списков рассылки], чтобы понять, что происходило до этого. В этом случае, незаменимым окажется https://www.FreeBSD.org/search/#mailinglists[ интерфейс поиска по спискам рассылки]. (Если этот способ не принёс результатов, воспользуйтесь вашей любимой поисковой системой). Познакомившись с архивами, вы не только будете знать, какие темы обсуждались до этого, но также узнаете, какие тенденции общения существуют в данной рассылке, кто является участниками и какова конечная аудитория. Эти вещи довольно хорошо знать перед отправкой письма в любую рассылку, и это касается не только списков рассылки FreeBSD. Безусловно, архивы весьма обширны, и некоторые вопросы возникают чаще других, иногда в виде цепочек ответов, где заголовок письма уже не отражает содержание обсуждения. Тем не менее, ваша задача как автора — провести предварительную работу, чтобы по возможности избежать этих часто возникающих тем. [[bikeshed]] == Что такое велосипедный навес ("Bikeshed")? В буквальном смысле `bikeshed` (сарай для велосипедов) - это небольшое уличное сооружение для хранения двухколёсного транспорта. Однако в терминологии FreeBSD это понятие относится к темам, достаточно простым для того, чтобы (почти) каждый мог высказать своё мнение, и зачастую (почти) каждый это делает. Детали происхождения данного термина более подробно рассмотрены extref:{faq}[здесь, bikeshed-painting]. У вас должно иметься представление о данном понятии перед отправкой письма в любой список рассылки FreeBSD. Bikeshed - это тема разговора, которая будет иметь тенденцию порождать немедленные мета-дискуссии и флэйм. Пожалуйста, помогайте сохранять списки рассылки настолько полезными для многих людей, насколько это возможно путём предотвращения bikeshed. Спасибо. [[acknowledgments]] == Благодарности `{grog}`:: Первоначальный автор большинства материала по этикету списков рассылки, взятого из статьи extref:{freebsd-questions-article}[Как работать со списком рассылки FreeBSD-questions с максимальной отдачей]. `{linimon}`:: Создание черновой версии данного FAQ. diff --git a/documentation/content/ru/articles/mailing-list-faq/_index.po b/documentation/content/ru/articles/mailing-list-faq/_index.po index 9766b97a19..14ec927a8a 100644 --- a/documentation/content/ru/articles/mailing-list-faq/_index.po +++ b/documentation/content/ru/articles/mailing-list-faq/_index.po @@ -1,753 +1,750 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-05-01 19:57-0300\n" -"PO-Revision-Date: 2025-10-29 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/mailing-list-faq/_index.adoc:1 #, no-wrap msgid "How to best use the mailing lists, such as how to help avoid frequently-repeated discussions" -msgstr "" -"Как оптимально использовать почтовые рассылки, в том числе как избежать " -"часто повторяющихся обсуждений" +msgstr "Как оптимально использовать почтовые рассылки, в том числе как избежать часто повторяющихся обсуждений" #. type: Title = #: documentation/content/en/articles/mailing-list-faq/_index.adoc:1 #: documentation/content/en/articles/mailing-list-faq/_index.adoc:10 #, no-wrap msgid "Frequently Asked Questions About The FreeBSD Mailing Lists" msgstr "Часто задаваемые вопросы по спискам рассылки FreeBSD" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:43 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:49 msgid "" "This is the FAQ for the FreeBSD mailing lists. If you are interested in " "helping with this project, send email to the {freebsd-doc}. The latest " -"version of this document is always available from the link:.[FreeBSD World " -"Wide Web server]. It may also be downloaded as one large link:.[HTML] file " -"with HTTP or as plain text, PostScript, PDF, etc. from the https://" -"download.freebsd.org/doc/[FreeBSD FTP server]. You may also want to " -"link:https://www.FreeBSD.org/search/[Search the FAQ]." +"version of this document is always available from the extref:{mailing-list-" +"faq}[FreeBSD World Wide Web server]. It may also be downloaded as one large " +"extref:{mailing-list-faq}[HTML] file with HTTP or as plain text, PostScript, " +"PDF, etc. from the https://download.freebsd.org/doc/[FreeBSD FTP server]. " +"You may also want to link:https://www.FreeBSD.org/search/[Search the FAQ]." msgstr "" "Эта статья посвящена часто задаваемым вопросам (FAQ) по спискам рассылки " "FreeBSD. Если вы хотите помочь поддерживать данный документ, напишите письмо " -"в {freebsd-doc}. Последняя версия данного документа доступна на link:.[WWW " -"сервере FreeBSD]. Вы можете получить данную статью в виде одного большого " -"link:.[HTML] файла, используя HTTP протокол или в виде простого текста, " -"форматов PostScript, PDF, и других с https://download.freebsd.org/doc/[FTP " -"сервера FreeBSD]. Возможно вы захотите link:https://www.FreeBSD.org/search/[" -"Найти FAQ]." +"в {freebsd-doc}. Последняя версия данного документа доступна на extref" +":{mailing-list-faq}[WWW сервере FreeBSD]. Вы можете получить данную статью в " +"виде одного большого extref:{mailing-list-faq}[HTML] файла, используя HTTP " +"протокол или в виде простого текста, форматов PostScript, PDF, и других с " +"https://download.freebsd.org/doc/[FTP сервера FreeBSD]. Возможно вы захотите " +"link:https://www.FreeBSD.org/search/[Найти FAQ]." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:51 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/mailing-list-faq/_index.adoc:55 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:59 msgid "" "As is usual with FAQs, this document aims to cover the most frequently asked " "questions concerning the FreeBSD mailing lists (and of course answer " "them!). Although originally intended to reduce bandwidth and avoid the same " "old questions being asked over and over again, FAQs have become recognized " "as valuable information resources." msgstr "" "Цель этого документа ответить на часто задаваемые вопросы, касающиеся " "списков рассылки FreeBSD. Хотя FAQ задумывались для снижения количества " "задаваемых повторяющихся вопросов, они стали восприниматься, как ценные " "источники информации." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:63 msgid "" "This document attempts to represent a community consensus, and as such it " "can never really be __authoritative__. However, if you find technical " "errors within this document, or have suggestions about items that should be " "added, please either submit a PR, or email the {freebsd-doc}. Thanks." msgstr "" "Этот документ - попытка представить консенсус всего сообщества, и поэтому он " "не может считаться __официальным__. Если вы найдете технические неточности в " "данном документе или у вас есть предложения по добавлению новых пунктов, " "пожалуйста отправьте PR или напишите в {freebsd-doc}. Спасибо." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:64 #, no-wrap msgid "What is the purpose of the FreeBSD mailing lists?" msgstr "Зачем вообще нужны списки рассылки по FreeBSD?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:67 msgid "" "The FreeBSD mailing lists serve as the primary communication channels for " "the FreeBSD community, covering many different topic areas and communities " "of interest." msgstr "" "Списки рассылки по FreeBSD служат, как первичное средство связи FreeBSD " "сообщества, они покрывают множество различных тем." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:68 #, no-wrap msgid "Who is the audience for the FreeBSD mailing lists?" msgstr "Кто пользуется этими списками рассылки?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:73 msgid "" "This depends on charter of each individual list. Some lists are more " "oriented to developers; some are more oriented towards the FreeBSD community " "as a whole. Please see link:https://lists.FreeBSD.org/[this list] for the " "current summary." msgstr "" "Это зависит от регламента каждой конкретной рассылки. Некоторые списки " "больше ориентированы на разработчиков, некоторые - на всё сообщество FreeBSD " -"в целом. Актуальную информацию смотрите по ссылке: link:https://lists.FreeBSD" -".org/[этот список]." +"в целом. Актуальную информацию смотрите по ссылке: link:https://lists." +"FreeBSD.org/[этот список]." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:75 msgid "Lists are English language, unless stated otherwise." msgstr "" "В списках рассылки используется английский язык, если другой язык не указан " "явно." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:76 #, no-wrap msgid "Are the FreeBSD mailing lists open for anyone to participate?" msgstr "Доступны ли списки рассылки по FreeBSD для каждого?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:81 msgid "" "Again, this depends on charter of each individual list. Please read the " "charter of a mailing list before you post to it, and respect it when you " "post. This will help everyone to have a better experience with the lists." msgstr "" "Повторюсь: это зависит от устава (правил) каждого конкретного списка " "рассылки. Пожалуйста, прочтите устав списка перед отправкой в него письма и " "соблюдайте его при каждом сообщении. Это способствует более комфортной " "работе со списками рассылки." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:83 msgid "" "If after reading the above lists, you still do not know which mailing list " "to post a question to, you will probably want to post to freebsd-questions " "(but see below, first)." msgstr "" "Если после просмотра выше расположенного списка, вы до сих пор не знаете в " "какой список рассылки направить письмо, то вам наверняка подойдёт freebsd-" "questions (но прежде прочтите советы ниже)." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:86 msgid "" "Note that you must subscribe to a mailing list before you can post. You can " "elect to subscribe without receiving messages posted to the mailing list." msgstr "" "Обратите внимание, что для отправки сообщений в список рассылки необходимо " "быть его подписчиком. Вы можете оформить подписку, не получая сообщения, " "которые в него отправляются." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:87 #, no-wrap msgid "How can I subscribe?" msgstr "Как я могу подписаться?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:90 msgid "" "You can use link:https://lists.FreeBSD.org/[the Mlmmj web interface] to " "subscribe to any of the public lists." msgstr "" "Вы можете использовать link:https://lists.FreeBSD.org/[web интерфейс Mlmmj] " "для подписки на любой из открытых списков рассылки." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:91 #, no-wrap msgid "How can I unsubscribe?" msgstr "Как мне отписаться?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:94 msgid "" "You can use the same interface as above; or, you can follow the instructions " "that are at the bottom of every mailing list message that is sent." msgstr "" "Вы можете использовать вышеупомянутый интерфейс или следовать инструкциям, " "находящимся в конце каждого письма, отправленного в этот список рассылки." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:98 msgid "" "Please do not send unsubscribe messages directly to the public lists " "themselves. First, this will not accomplish your goal, and second, it will " "irritate the existing subscribers, and you will probably get flamed. This " "is a classical mistake when using mailing lists; please try to avoid it." msgstr "" "Пожалуйста, не посылайте письма с отказом от подписки в сами публичные " "списки. Во-первых, вы так не отпишитесь, а во-вторых, вызовете раздражение " "подписчиков, и вероятно получите неприятные высказывания в свой адрес. Это " "классическая ошибка при работе со списками рассылки; старайтесь не повторять " "её." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:99 #, no-wrap msgid "Are archives available?" msgstr "Доступны ли архивы?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:103 msgid "" -"Yes. Threaded archives with all e-mails since 1994 are available " -"link:https://mail-archive.freebsd.org/mail/[here]. You can also access " -"https://lists.freebsd.org/pipermail[mailman archive] and link:https://" -"lists.freebsd.org/archives[mlmmj archive] directly." +"Yes. Threaded archives with all e-mails since 1994 are available link:" +"https://mail-archive.freebsd.org/mail/[here]. You can also access https://" +"lists.freebsd.org/pipermail[mailman archive] and link:https://lists.freebsd." +"org/archives[mlmmj archive] directly." msgstr "" "Да. Архивы со всеми письмами с 1994 года доступны link:https://mail-archive." -"freebsd.org/mail/[здесь]. Вот ссылки на https://lists.freebsd.org/pipermail[" -"архив mailman] и link:https://lists.freebsd.org/archives[архив mlmmj]." +"freebsd.org/mail/[здесь]. Вот ссылки на https://lists.freebsd.org/" +"pipermail[архив mailman] и link:https://lists.freebsd.org/archives[архив " +"mlmmj]." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:104 #, no-wrap msgid "Are mailing lists available in a digest format?" msgstr "Доступны ли списки рассылки в дайджест формате?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:107 msgid "Yes. See link:https://lists.FreeBSD.org/[the Mlmmj web interface]." msgstr "Да. Посмотрите link:https://lists.FreeBSD.org/[веб интерфейс Mlmmj]." #. type: Title == #: documentation/content/en/articles/mailing-list-faq/_index.adoc:109 #, no-wrap msgid "Mailing List Etiquette" msgstr "Этикет списков рассылки" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:113 msgid "" "Participation in the mailing lists, like participation in any community, " "requires a common basis for communication. Please make only appropriate " "postings, and follow common rules of etiquette." msgstr "" "Участие в любом списке рассылки, как и в любом другом сообществе требует " "общего базиса для общения. Пожалуйста, отправляйте только подходящие " "сообщения и следуйте общепринятым нормам этикета." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:114 #, no-wrap msgid "What should I do before I post?" msgstr "Что я должен сделать перед отправлением письма?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:119 msgid "" "You have already taken the most important step by reading this document. " "However, if you are new to FreeBSD, you may first need to familiarize " "yourself with the software, and all the social history around it, by reading " "the numerous link:https://www.FreeBSD.org/docs/books/[books and articles] " "that are available. Items of particular interest include the extref:{faq}" "[FreeBSD Frequently Asked Questions (FAQ)] document, the extref:{handbook}" "[FreeBSD Handbook], and the articles extref:{freebsd-questions-article}[How " "to get best results from the FreeBSD-questions mailing list], extref:" "{explaining-bsd}[Explaining BSD], and extref:{new-users}[FreeBSD First " "Steps]." msgstr "" "Вы уже сделали важный шаг, решив прочитать эту статью. Если вы новичок во " "FreeBSD, то сначала ознакомьтесь с программным обеспечением и связанной с " -"нею документацией, включающей множество extref:https://www.FreeBSD.org/docs/[" -"книг и статьей]. Могут быть интересными: extref:{faq}[Часто задаваемые " +"нею документацией, включающей множество extref:https://www.FreeBSD.org/docs/" +"[книг и статьей]. Могут быть интересными: extref:{faq}[Часто задаваемые " "вопросы по FreeBSD (FAQ)], extref:{handbook}[Руководство по FreeBSD], и " "статьи extref:{freebsd-questions-article}[Как работать со списком рассылки " "FreeBSD-questions с максимальной отдачей], extref:{explaining-bsd}[Что такое " "BSD], и extref:{new-users}[Пособие для новичков во FreeBSD]." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:124 msgid "" "It is always considered bad form to ask a question that is already answered " "in the above documents. This is not because the volunteers who work on this " "project are particularly mean people, but after a certain number of times " "answering the same questions over and over again, frustration begins to set " "in. This is particularly true if there is an existing answer to the " "question that is already available. Always keep in mind that almost all of " "the work done on FreeBSD is done by volunteers, and that we are only human." msgstr "" "Считается дурным тоном задавать вопросы, на которые уже есть ответ в " "приведённых выше документах. Это не потому что добровольцы, работающие над " "данным проектом очень плохие люди, а после многократного ответа на одни и те " "же вопросы - раздражение берёт своё. Это особенно справедливо, если уже " "существует и доступен ответ на вопрос. Не забывайте, что вся работа по " "улучшению FreeBSD выполняется добровольцами, и что мы только люди." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:125 #, no-wrap msgid "What constitutes an inappropriate posting?" msgstr "Что считается несоответствующим письмом?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:128 msgid "Postings must be in accordance with the charter of the mailing list." msgstr "Письма должны соответствовать уставу списка рассылки." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:129 msgid "" "Personal attacks are discouraged. As good net-citizens, we should try to " "hold ourselves to high standards of behavior." msgstr "" "Личные нападки недопустимы. Как ответственные участники сетевого сообщества, " "мы должны придерживаться высоких стандартов поведения." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:130 msgid "" "Spam is not allowed, ever. The mailing lists are actively processed to ban " "offenders to this rule." msgstr "Спам не разрешён. Нарушители данного правила будут забанены." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:131 #, no-wrap msgid "What is considered proper etiquette when posting to the mailing lists?" msgstr "Что считается хорошим этикетом при посылке писем в списки рассылки?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:134 msgid "" "Please wrap lines at 75 characters, since not everyone uses fancy GUI mail " "reading programs." msgstr "" "Пожалуйста, составляйте строки длиной примерно в 75 символов, так как не " "каждый использует модную почтовую программу с графическим интерфейсом." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:135 msgid "" "Please respect the fact that bandwidth is not infinite. Not everyone reads " "email through high-speed connections, so if your posting involves something " "like the content of [.filename]#config.log# or an extensive stack trace, " "please consider putting that information up on a website somewhere and just " "provide a URL to it. Remember, too, that these postings will be archived " "indefinitely, so huge postings will simply inflate the size of the archives " "long after their purpose has expired." msgstr "" "Пожалуйста, обращайте внимание на тот факт, что пропускная способность " "ограничена. Не каждый читает почту через высокоскоростное соединение. Если " "вы отправляете содержимое какого-нибудь файла, например [.filename]#config." "log# или объёмную трассировку стека, то, пожалуйста, размещайте его на каком-" "нибудь веб-сайте и присылайте просто ссылку на него. Помните, что такие " "сообщения будут заархивированны, и это просто добавит ненужные байты к " "архиву." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:136 msgid "" "Format your message so that it is legible, and PLEASE DO NOT SHOUT!!!!!. Do " "not underestimate the effect that a poorly formatted mail message has, and " "not just on the FreeBSD mailing lists. Your mail message is all that people " "see of you, and if it is poorly formatted, badly spelled, full of errors, " "and/or has lots of exclamation points, it will give people a poor impression " "of you." msgstr "" "Оформляйте ваше сообщение, чтобы оно было читабельно и ПОЖАЛУЙСТА, НЕ " "КРИЧИТЕ!!!!!. Не упускайте из виду эффект, которое производит плохо " "отформатированное письмо, причём не только в списках рассылки FreeBSD. Ваше " "сообщение будет просмотрено другими людьми, и если оно плохо " "отформатировано, имеет множество ошибок и/или восклицательных знаков, то это " "создаст нехорошее впечатление о вас." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:137 msgid "" "Please use an appropriate human language for a particular mailing list. Many " "non-English mailing lists are link:https://www.FreeBSD.org/community/" "mailinglists/[available]." msgstr "" "Пожалуйста, используйте подходящий язык общения для конкретного списка " "рассылки. link:https://www.FreeBSD.org/community/mailinglists/[ Существует] " "много не англоязычных рассылок." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:141 msgid "" "For the ones that are not, we do appreciate that many people do not speak " "English as their first language, and we try to make allowances for that. It " "is considered particularly poor form to criticize non-native speakers for " "spelling or grammatical errors. FreeBSD has an excellent track record in " "this regard; please, help us to uphold that tradition." msgstr "" "Мы понимаем, что для многих английский не родной язык и поэтому мы пытаемся " "сделать некие пособия. Считается плохим тоном критиковать людей не говорящих " "по-английски за лексические и грамматические ошибки. FreeBSD имеет отличные " "продвижения в этом отношении. Пожалуйста, помогайте сохранять нам эту " "традицию." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:142 msgid "" "Please use a standards-compliant Mail User Agent (MUA). A lot of badly " "formatted messages come from http://www.lemis.com/grog/email/email.php[bad " "mailers or badly configured mailers]. The following mailers are known to " "send out badly formatted messages without you finding out about them:" msgstr "" "Пожалуйста, используйте совместимый со стандартами почтовый клиент (MUA). " "Много плохо отформатированных сообщений исходят от http://www.lemis.com/grog/" "email/email.php[неправильно работающих или плохо сконфигурированных почтовых " "клиентов]. Известно, что следующие почтовые программы могут посылать " "неправильно отформатированные сообщения без вашего ведома:" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:144 msgid "exmh" msgstr "exmh" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:145 msgid "Microsoft(R) Exchange" msgstr "Microsoft(R) Exchange" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:146 msgid "Microsoft(R) Outlook(R)" msgstr "Microsoft(R) Outlook(R)" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:148 msgid "" "Try not to use MIME: a lot of people use mailers which do not get on very " "well with MIME." msgstr "" "Постарайтесь не использовать MIME: многие используют программы, которые не " "очень хорошо работают с MIME." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:149 msgid "" "Make sure your time and time zone are set correctly. This may seem a little " "silly, since your message still gets there, but many of the people on these " "mailing lists get several hundred messages a day. They frequently sort the " "incoming messages by subject and by date, and if your message does not come " "before the first answer, they may assume that they missed it and not bother " "to look." msgstr "" "Проверьте правильность настроек времени и временной зоны. Это может " "выглядеть немножко глупо, потому что ваши сообщения все равно будут " "доставляться, однако многие люди получают несколько сотен сообщений в день. " "Зачастую они сортируют входящие сообщения по теме и дате, и если ваше " "сообщение не будет предшествовать первому ответу, то они могут предположить, " "что оно потерялось и даже не взглянут на него." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:150 msgid "" "A lot of the information you need to supply is the output of programs, such " "as man:dmesg[8], or console messages, which usually appear in [.filename]#/" "var/log/messages#. Do not try to copy this information by typing it in " "again; not only it is a real pain, but you are bound to make a mistake. To " "send log file contents, either make a copy of the file and use an editor to " "trim the information to what is relevant, or cut and paste into your " "message. For the output of programs like `dmesg`, redirect the output to a " "file and include that. For example," msgstr "" "Основной объем информации, который вы должны предоставить, представляет " "собой вывод программ, таких, как man:dmesg[8], или консольные сообщения, " "которые обычно появляются в файле [.filename]#/var/log/messages#. Не " "пытайтесь скопировать эту информацию, набрав ее снова; это действительно " "трудно, и здесь легко сделать ошибку. Чтобы послать содержимое файлов " "протоколов, сделайте копию файла и воспользуйтесь редактором для того, чтобы " "обрезать информацию, оставив только относящуюся к делу, либо скопируйте и " -"вставьте текст в ваше сообщение. В случае вывода программ, таких, как `dmesg`" -", перенаправьте вывод в файл и включите его в письмо. Например," +"вставьте текст в ваше сообщение. В случае вывода программ, таких, как " +"`dmesg`, перенаправьте вывод в файл и включите его в письмо. Например," #. type: delimited block . 4 #: documentation/content/en/articles/mailing-list-faq/_index.adoc:154 #, no-wrap msgid "% dmesg > /tmp/dmesg.out\n" msgstr "% dmesg > /tmp/dmesg.out\n" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:157 msgid "This redirects the information to the file [.filename]#/tmp/dmesg.out#." msgstr "" "Эта команда перенаправляет информацию в файл [.filename]#/tmp/dmesg.out#." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:158 msgid "" "When using cut-and-paste, please be aware that some such operations badly " "mangle their messages. This is of particular concern when posting contents " "of [.filename]#Makefiles#, where `tab` is a significant character. This is a " "very common, and very annoying, problem with submissions to the link:https://" "www.FreeBSD.org/support/[Problem Reports database]. [.filename]#Makefiles# " "with tabs changed to either spaces, or the annoying `=3B` escape sequence, " "create a great deal of aggravation for committers." msgstr "" "При использовании операций копирования и вставки учтите, что некоторые такие " "операции отрицательно сказываются на формате строк. Особенно это стоит " "учесть при посылке содержимого файлов [.filename]#Makefile#, где `tab` " -"является важным символом. Это довольно часто встречающаяся проблема в " -"link:https://www.FreeBSD.org/support/[ базе данных сообщений об ошибках]. В [" -".filename]#Makefile# символы tab меняются на пробелы, или раздражающие `=3B` " +"является важным символом. Это довольно часто встречающаяся проблема в link:" +"https://www.FreeBSD.org/support/[ базе данных сообщений об ошибках]. В [." +"filename]#Makefile# символы tab меняются на пробелы, или раздражающие `=3B` " "escape последовательности." #. type: Title === #: documentation/content/en/articles/mailing-list-faq/_index.adoc:159 #, no-wrap msgid "What are the special etiquette consideration when replying to an existing posting on the mailing lists?" -msgstr "" -"Каких правил этикета стоит придерживаться при ответе на уже существующее " -"сообщение?" +msgstr "Каких правил этикета стоит придерживаться при ответе на уже существующее сообщение?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:162 msgid "" "Please include relevant text from the original message. Trim it to the " "minimum, but do not overdo it. It should still be possible for somebody who " "did not read the original message to understand what you are talking about." msgstr "" "Пожалуйста, включайте относящийся к теме текст из исходного письма. " "Сокращайте его до минимума, но не переусердствуйте. Любой, кто не читал " "исходное сообщение должен суметь понять о чём идёт речь." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:164 msgid "" -"This is especially important for postings of the type \"yes, I see this " -"too\", where the initial posting was dozens or hundreds of lines." +"This is especially important for postings of the type \"yes, I see this too" +"\", where the initial posting was dozens or hundreds of lines." msgstr "" "Это особенно важно для ответов в стиле «Да, я это тоже вижу», где исходное " "сообщение составляло сотни строчек." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:165 msgid "" "Use some technique to identify which text came from the original message, " "and which text you add. A common convention is to prepend \"`>`\" to the " "original message. Leaving white space after the \"`>`\" and leaving empty " "lines between your text and the original text both make the result more " "readable." msgstr "" "Отделяйте текст исходного сообщения от текста, добавляемого вами. Чаще всего " "строчки исходного сообщения предваряются \"`>`\" и пробелом. Отделяйте ваш " "текст от текста исходного сообщения пустыми строчками. Эти правила помогут " "сделать ваши сообщения более читабельными." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:166 msgid "" "Please ensure that the attributions of the text you are quoting is correct. " "People can become offended if you attribute words to them that they " "themselves did not write." msgstr "" "Пожалуйста, убедитесь в корректном указании авторства текста, который вы " "цитируйте. Люди могут обидеться, если вы приписываете им слова, которые они " "не писали." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:167 msgid "" "Please do not `top post`. By this, we mean that if you are replying to a " "message, please put your replies after the text that you copy in your reply." msgstr "" "Пожалуйста, не пишите `ответ в начале письма`. Это значит, что при ответе на " "сообщения вставляйте ваши ответы в конец, после текста, копируемого из " "исходного сообщения." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:169 msgid "A: Because it reverses the logical flow of conversation." msgstr "Ответ: Потому что это не соответствует логическому ходу обсуждения." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:170 msgid "Q: Why is top posting frowned upon?" msgstr "Вопрос: Чем плох ответ в начале письма?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:172 msgid "(Thanks to Randy Bush for the joke.)" msgstr "(Спасибо Рэнди Бушу (Randy Bush) за шутку.)" #. type: Title == #: documentation/content/en/articles/mailing-list-faq/_index.adoc:174 #, no-wrap msgid "Recurring Topics On The Mailing Lists" msgstr "Повторяющиеся темы в списках рассылки" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:181 msgid "" "Participation in the mailing lists, like participation in any community, " "requires a common basis for communication. Many of the mailing lists " "presuppose a knowledge of the Project's history. In particular, there are " "certain topics that seem to regularly occur to newcomers to the community. " "It is the responsibility of each poster to ensure that their postings do not " "fall into one of these categories. By doing so, you will help the mailing " "lists to stay on-topic, and probably save yourself being flamed in the " "process." msgstr "" "Участие в списках рассылки, как и участие в любом сообществе требует общего " "базиса для общения. Большое количество рассылок предполагают знание истории " "Проекта. В частности, существует несколько тем обсуждения, которые возникают " "у новичков. Обязанность каждого участника не создавать дискуссии на эти " "темы, тем самым помочь спискам рассылки не отрываться от обсуждаемых тем и " "обезопасить себя от разгорячённых бесед." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:185 msgid "" "The best method to avoid this is to familiarize yourself with the http://" "docs.FreeBSD.org/mail/[mailing list archives], to help yourself understand " -"the background of what has gone before. In this, the https://" -"www.FreeBSD.org/search/#mailinglists[mailing list search interface] is " -"invaluable. (If that method does not yield useful results, please " -"supplement it with a search with your favorite major search engine)." +"the background of what has gone before. In this, the https://www.FreeBSD." +"org/search/#mailinglists[mailing list search interface] is invaluable. (If " +"that method does not yield useful results, please supplement it with a " +"search with your favorite major search engine)." msgstr "" "Лучший способ предотвратить это - ознакомиться с http://docs.FreeBSD.org/" "mail/[архивами списков рассылки], чтобы понять, что происходило до этого. В " "этом случае, незаменимым окажется https://www.FreeBSD.org/search/" "#mailinglists[ интерфейс поиска по спискам рассылки]. (Если этот способ не " "принёс результатов, воспользуйтесь вашей любимой поисковой системой)." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:188 msgid "" "By familiarizing yourself with the archives, not only will you learn what " "topics have been discussed before, but also how discussion tends to proceed " "on that list, who the participants are, and who the target audience is. " "These are always good things to know before you post to any mailing list, " "not just a FreeBSD mailing list." msgstr "" "Познакомившись с архивами, вы не только будете знать, какие темы обсуждались " "до этого, но также узнаете, какие тенденции общения существуют в данной " "рассылке, кто является участниками и какова конечная аудитория. Эти вещи " "довольно хорошо знать перед отправкой письма в любую рассылку, и это " "касается не только списков рассылки FreeBSD." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:191 msgid "" "There is no doubt that the archives are quite extensive, and some questions " "recur more often than others, sometimes as followups where the subject line " "no longer accurately reflects the new content. Nevertheless, the burden is " "on you, the poster, to do your homework to help avoid these recurring topics." msgstr "" "Безусловно, архивы весьма обширны, и некоторые вопросы возникают чаще " "других, иногда в виде цепочек ответов, где заголовок письма уже не отражает " "содержание обсуждения. Тем не менее, ваша задача как автора — провести " "предварительную работу, чтобы по возможности избежать этих часто возникающих " "тем." #. type: Title == #: documentation/content/en/articles/mailing-list-faq/_index.adoc:193 #, no-wrap msgid "What Is A \"Bikeshed\"?" msgstr "Что такое велосипедный навес (\"Bikeshed\")?" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:198 msgid "" "Literally, a `bikeshed` is a small outdoor shelter into which one may store " "one's two-wheeled form of transportation. However, in FreeBSD parlance, the " "term refers to topics that are simple enough that (nearly) anyone can offer " "an opinion about, and often (nearly) everyone does. The genesis of this term " "is explained in more detail extref:{faq}[in this document, bikeshed-" "painting]. You simply must have a working knowledge of this concept before " "posting to any FreeBSD mailing list." msgstr "" "В буквальном смысле `bikeshed` (сарай для велосипедов) - это небольшое " "уличное сооружение для хранения двухколёсного транспорта. Однако в " "терминологии FreeBSD это понятие относится к темам, достаточно простым для " "того, чтобы (почти) каждый мог высказать своё мнение, и зачастую (почти) " "каждый это делает. Детали происхождения данного термина более подробно " "рассмотрены extref:{faq}[здесь, bikeshed-painting]. У вас должно иметься " "представление о данном понятии перед отправкой письма в любой список " "рассылки FreeBSD." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:200 msgid "" "More generally, a bikeshed is a topic that will tend to generate immediate " "meta-discussions and flames if you have not read up on their history." msgstr "" "Bikeshed - это тема разговора, которая будет иметь тенденцию порождать " "немедленные мета-дискуссии и флэйм." #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:203 msgid "" "Please help us to keep the mailing lists as useful for as many people as " "possible by avoiding bikesheds whenever you can. Thanks." msgstr "" "Пожалуйста, помогайте сохранять списки рассылки настолько полезными для " "многих людей, насколько это возможно путём предотвращения bikeshed. Спасибо." #. type: Title == #: documentation/content/en/articles/mailing-list-faq/_index.adoc:205 #, no-wrap msgid "Acknowledgments" msgstr "Благодарности" #. type: Labeled list #: documentation/content/en/articles/mailing-list-faq/_index.adoc:207 #, no-wrap msgid "`{grog}`" msgstr "`{grog}`" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:209 msgid "" "Original author of most of the material on mailing list etiquette, taken " "from the article on extref:{freebsd-questions-article}[How to get best " "results from the FreeBSD-questions mailing list]." msgstr "" "Первоначальный автор большинства материала по этикету списков рассылки, " "взятого из статьи extref:{freebsd-questions-article}[Как работать со списком " "рассылки FreeBSD-questions с максимальной отдачей]." #. type: Labeled list #: documentation/content/en/articles/mailing-list-faq/_index.adoc:210 #, no-wrap msgid "`{linimon}`" msgstr "`{linimon}`" #. type: Plain text #: documentation/content/en/articles/mailing-list-faq/_index.adoc:211 msgid "Creation of the rough draft of this FAQ." msgstr "Создание черновой версии данного FAQ." diff --git a/documentation/content/ru/articles/pgpkeys/_index.adoc b/documentation/content/ru/articles/pgpkeys/_index.adoc index aed397d2cb..eadf4beae2 100644 --- a/documentation/content/ru/articles/pgpkeys/_index.adoc +++ b/documentation/content/ru/articles/pgpkeys/_index.adoc @@ -1,1548 +1,1560 @@ --- description: 'Список OpenPGP-ключей, которые можно использовать для проверки подписей или отправки зашифрованной электронной почты офицерам или разработчикам FreeBSD.org.' tags: ["OpenPGP", "Developers", "Officers", "FreeBSD"] title: 'Ключи OpenPGP' --- = Ключи OpenPGP :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :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[pgpkeyring.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[] === `{dch}` include::{include-path}dch.key[] === `{glebius}` include::{include-path}glebius.key[] === `{hrs}` include::{include-path}hrs.key[] === `{lwhsu}` include::{include-path}lwhsu.key[] === `{mat}` include::{include-path}mat.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[] === `{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[] === `{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[] === `{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[] === `{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[] === `{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[] [[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[] diff --git a/documentation/content/ru/articles/pgpkeys/_index.po b/documentation/content/ru/articles/pgpkeys/_index.po index 36f246b46f..d13282465c 100644 --- a/documentation/content/ru/articles/pgpkeys/_index.po +++ b/documentation/content/ru/articles/pgpkeys/_index.po @@ -1,3003 +1,3027 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-09-24 18:23+0300\n" -"PO-Revision-Date: 2025-08-19 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. 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 msgid "'''" msgstr "'''" #. type: Plain text #: documentation/content/en/articles/pgpkeys/_index.adoc:50 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[pgpkeyring." +"txt]." msgstr "" "Эти OpenPGP-ключи можно использовать для проверки подписи или отправки " "зашифрованной электронной почты офицерам или разработчикам `FreeBSD.org`. " "Полный набор ключей можно загрузить по ссылке: link:https://docs.FreeBSD.org/" "pgpkeys/pgpkeys.txt[pgpkeyring.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 #, no-wrap msgid "Officers" msgstr "Офицеры" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:63 #, 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 #, 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 #, 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 #, 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 #, 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:645 +#: documentation/content/en/articles/pgpkeys/_index.adoc:648 #, no-wrap msgid "`{allanjude}`" msgstr "`{allanjude}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:81 #: documentation/content/en/articles/pgpkeys/_index.adoc:339 #, no-wrap msgid "`{dch}`" msgstr "`{dch}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:84 -#: documentation/content/en/articles/pgpkeys/_index.adoc:1248 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1257 #, no-wrap msgid "`{glebius}`" msgstr "`{glebius}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:87 #, no-wrap msgid "`{hrs}`" msgstr "`{hrs}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:90 -#: documentation/content/en/articles/pgpkeys/_index.adoc:597 +#: documentation/content/en/articles/pgpkeys/_index.adoc:600 #, no-wrap msgid "`{lwhsu}`" msgstr "`{lwhsu}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:93 #: documentation/content/en/articles/pgpkeys/_index.adoc:147 #, no-wrap msgid "`{mat}`" msgstr "`{mat}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:96 #: documentation/content/en/articles/pgpkeys/_index.adoc:336 #, no-wrap msgid "`{olivier}`" msgstr "`{olivier}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:99 #: documentation/content/en/articles/pgpkeys/_index.adoc:198 #, no-wrap msgid "`{tcberner}`" msgstr "`{tcberner}`" #. type: Title == #: documentation/content/en/articles/pgpkeys/_index.adoc:103 #, no-wrap msgid "Developers" msgstr "Разработчики" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:105 #, no-wrap msgid "`{jgh}`" msgstr "`{jgh}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:108 #, no-wrap msgid "`{ariff}`" msgstr "`{ariff}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:111 #, no-wrap msgid "`{tabthorpe}`" msgstr "`{tabthorpe}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:114 #, no-wrap msgid "`{eadler}`" msgstr "`{eadler}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:117 #, no-wrap msgid "`{pauamma}`" msgstr "`{pauamma}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:120 #, no-wrap msgid "`{shaun}`" msgstr "`{shaun}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:123 #, no-wrap msgid "`{brix}`" msgstr "`{brix}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:126 #, no-wrap msgid "`{mandree}`" msgstr "`{mandree}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:129 #, no-wrap msgid "`{will}`" msgstr "`{will}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:132 #, no-wrap msgid "`{dim}`" msgstr "`{dim}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:135 #, no-wrap msgid "`{anholt}`" msgstr "`{anholt}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:138 #, no-wrap msgid "`{fernape}`" msgstr "`{fernape}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:141 #, no-wrap msgid "`{mva}`" msgstr "`{mva}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:144 #, no-wrap msgid "`{araujo}`" msgstr "`{araujo}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:150 #, no-wrap msgid "`{syuu}`" msgstr "`{syuu}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:153 #, no-wrap msgid "`{asami}`" msgstr "`{asami}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:156 #, no-wrap msgid "`{jsa}`" msgstr "`{jsa}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:159 #, no-wrap msgid "`{jadawin}`" msgstr "`{jadawin}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:162 #, no-wrap msgid "`{jwb}`" msgstr "`{jwb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:165 #, no-wrap msgid "`{dbaio}`" msgstr "`{dbaio}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:168 #, no-wrap msgid "`{timur}`" msgstr "`{timur}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:171 #, no-wrap msgid "`{jhb}`" msgstr "`{jhb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:174 #, no-wrap msgid "`{gjb}`" msgstr "`{gjb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:177 #, no-wrap msgid "`{snb}`" msgstr "`{snb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:180 #, no-wrap msgid "`{barner}`" msgstr "`{barner}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:183 #, no-wrap msgid "`{lbartoletti}`" msgstr "`{lbartoletti}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:186 #, no-wrap msgid "`{art}`" msgstr "`{art}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:189 #, no-wrap msgid "`{tobez}`" msgstr "`{tobez}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:192 #, no-wrap msgid "`{damien}`" msgstr "`{damien}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:195 #, no-wrap msgid "`{bdragon}`" msgstr "`{bdragon}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:201 #, no-wrap msgid "`{tdb}`" msgstr "`{tdb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:204 #, no-wrap msgid "`{mbr}`" msgstr "`{mbr}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:207 #, no-wrap msgid "`{bvs}`" msgstr "`{bvs}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:210 #, no-wrap msgid "`{jbo}`" msgstr "`{jbo}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:213 #, no-wrap msgid "`{novel}`" msgstr "`{novel}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:216 #, no-wrap msgid "`{garga}`" msgstr "`{garga}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:219 #, no-wrap msgid "`{kbowling}`" msgstr "`{kbowling}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:222 #, no-wrap msgid "`{alexbl}`" msgstr "`{alexbl}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:225 #, no-wrap msgid "`{ebrandi}`" msgstr "`{ebrandi}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:228 #, no-wrap msgid "`{harti}`" msgstr "`{harti}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:231 #, no-wrap msgid "`{obraun}`" msgstr "`{obraun}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:234 #, no-wrap msgid "`{makc}`" msgstr "`{makc}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:237 #, no-wrap msgid "`{jmb}`" msgstr "`{jmb}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:240 #, no-wrap msgid "`{dab}`" msgstr "`{dab}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:243 #, no-wrap msgid "`{antoine}`" msgstr "`{antoine}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:246 #, no-wrap msgid "`{db}`" msgstr "`{db}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:249 #, no-wrap msgid "`{brueffer}`" msgstr "`{brueffer}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:252 #, no-wrap msgid "`{markus}`" msgstr "`{markus}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:255 #, no-wrap msgid "`{br}`" msgstr "`{br}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:258 #, no-wrap msgid "`{jch}`" msgstr "`{jch}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:261 #, no-wrap msgid "`{jchandra}`" msgstr "`{jchandra}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:264 #, no-wrap msgid "`{jcamou}`" msgstr "`{jcamou}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:267 #, no-wrap msgid "`{acm}`" msgstr "`{acm}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:270 #, no-wrap msgid "`{olce}`" msgstr "`{olce}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:273 #, no-wrap msgid "`{gahr}`" msgstr "`{gahr}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:276 #, no-wrap msgid "`{dchagin}`" msgstr "`{dchagin}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:279 #, no-wrap msgid "`{perky}`" msgstr "`{perky}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:282 #, no-wrap msgid "`{jon}`" msgstr "`{jon}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:285 #, no-wrap msgid "`{jonathan}`" msgstr "`{jonathan}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:288 #, no-wrap msgid "`{loader}`" msgstr "`{loader}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:291 #, no-wrap msgid "`{luoqi}`" msgstr "`{luoqi}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:294 #, no-wrap msgid "`{ache}`" msgstr "`{ache}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:297 #, no-wrap msgid "`{melifaro}`" msgstr "`{melifaro}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:300 #, no-wrap msgid "`{cjh}`" msgstr "`{cjh}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:303 #, no-wrap msgid "`{davidch}`" msgstr "`{davidch}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:306 #, no-wrap msgid "`{milki}`" msgstr "`{milki}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:309 #, no-wrap msgid "`{cjc}`" msgstr "`{cjc}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:312 #, no-wrap msgid "`{marcus}`" msgstr "`{marcus}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:315 #, no-wrap msgid "`{fuz}`" msgstr "`{fuz}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:318 #, no-wrap msgid "`{nik}`" msgstr "`{nik}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:321 #, no-wrap msgid "`{benjsc}`" msgstr "`{benjsc}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:324 #, no-wrap msgid "`{lcook}`" msgstr "`{lcook}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:327 #, no-wrap msgid "`{ngie}`" msgstr "`{ngie}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:330 #, no-wrap msgid "`{rakuco}`" msgstr "`{rakuco}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:333 #, no-wrap msgid "`{alc}`" msgstr "`{alc}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:342 #, no-wrap msgid "`{bcran}`" msgstr "`{bcran}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:345 #, no-wrap msgid "`{cc}`" msgstr "`{cc}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:348 #, no-wrap msgid "`{culot}`" msgstr "`{culot}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:351 #, no-wrap msgid "`{alfredo}`" msgstr "`{alfredo}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:354 #, no-wrap msgid "`{bapt}`" msgstr "`{bapt}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:357 #, no-wrap msgid "`{ceri}`" msgstr "`{ceri}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:360 #, no-wrap msgid "`{edavis}`" msgstr "`{edavis}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:363 #, no-wrap msgid "`{alexey}`" msgstr "`{alexey}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:366 #, no-wrap msgid "`{bsd}`" msgstr "`{bsd}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:369 #, no-wrap msgid "`{carl}`" msgstr "`{carl}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:372 #, no-wrap msgid "`{carlavilla}`" msgstr "`{carlavilla}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:375 #, no-wrap msgid "`{vd}`" msgstr "`{vd}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:378 #, no-wrap msgid "`{rdivacky}`" msgstr "`{rdivacky}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:381 #, no-wrap msgid "`{danfe}`" msgstr "`{danfe}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:384 #, no-wrap msgid "`{dd}`" msgstr "`{dd}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:387 #, no-wrap msgid "`{bdrewery}`" msgstr "`{bdrewery}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:390 #, no-wrap msgid "`{gad}`" msgstr "`{gad}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:393 #, no-wrap msgid "`{kd}`" msgstr "`{kd}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:396 #, no-wrap msgid "`{olivierd}`" msgstr "`{olivierd}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:399 #, no-wrap msgid "`{bruno}`" msgstr "`{bruno}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:402 #, no-wrap msgid "`{ale}`" msgstr "`{ale}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:405 #, no-wrap msgid "`{jlduran}`" msgstr "`{jlduran}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:408 #, no-wrap msgid "`{nemysis}`" msgstr "`{nemysis}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:411 #, no-wrap msgid "`{peadar}`" msgstr "`{peadar}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:414 #, no-wrap msgid "`{deischen}`" msgstr "`{deischen}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:417 #, no-wrap msgid "`{diizzy}`" msgstr "`{diizzy}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:420 #, no-wrap msgid "`{ue}`" msgstr "`{ue}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:423 #, no-wrap msgid "`{madpilot}`" msgstr "`{madpilot}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:426 #, no-wrap msgid "`{rafan}`" msgstr "`{rafan}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:429 #, no-wrap msgid "`{kami}`" msgstr "`{kami}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:432 #, no-wrap msgid "`{farrokhi}`" msgstr "`{farrokhi}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:435 #, no-wrap msgid "`{jedgar}`" msgstr "`{jedgar}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:438 #, no-wrap msgid "`{mfechner}`" msgstr "`{mfechner}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:441 #, no-wrap msgid "`{feld}`" msgstr "`{feld}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:444 #, no-wrap msgid "`{green}`" msgstr "`{green}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:447 #, no-wrap msgid "`{fanf}`" msgstr "`{fanf}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:450 #, no-wrap msgid "`{blackend}`" msgstr "`{blackend}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:453 #, no-wrap msgid "`{petef}`" msgstr "`{petef}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:456 #, no-wrap msgid "`{decke}`" msgstr "`{decke}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:459 #, no-wrap msgid "`{landonf}`" msgstr "`{landonf}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:462 #, no-wrap msgid "`{billf}`" msgstr "`{billf}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:465 #, no-wrap msgid "`{grembo}`" msgstr "`{grembo}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:468 #, no-wrap msgid "`{sgalabov}`" msgstr "`{sgalabov}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:471 #, no-wrap msgid "`{kgalazka}`" msgstr "`{kgalazka}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:474 #, no-wrap msgid "`{avg}`" msgstr "`{avg}`" #. type: Title === #: documentation/content/en/articles/pgpkeys/_index.adoc:477 #, no-wrap +msgid "`{tiga}`" +msgstr "`{tiga}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:480 +#, no-wrap msgid "`{beat}`" msgstr "`{beat}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:480 +#: documentation/content/en/articles/pgpkeys/_index.adoc:483 #, no-wrap msgid "`{sjg}`" msgstr "`{sjg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:483 +#: documentation/content/en/articles/pgpkeys/_index.adoc:486 #, no-wrap msgid "`{gibbs}`" msgstr "`{gibbs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:486 +#: documentation/content/en/articles/pgpkeys/_index.adoc:489 #, no-wrap msgid "`{pfg}`" msgstr "`{pfg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:489 +#: documentation/content/en/articles/pgpkeys/_index.adoc:492 #, no-wrap msgid "`{girgen}`" msgstr "`{girgen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:492 +#: documentation/content/en/articles/pgpkeys/_index.adoc:495 #, no-wrap msgid "`{eugen}`" msgstr "`{eugen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:495 +#: documentation/content/en/articles/pgpkeys/_index.adoc:498 #, no-wrap msgid "`{pgollucci}`" msgstr "`{pgollucci}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:498 +#: documentation/content/en/articles/pgpkeys/_index.adoc:501 #, no-wrap msgid "`{trociny}`" msgstr "`{trociny}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:501 +#: documentation/content/en/articles/pgpkeys/_index.adoc:504 #, no-wrap msgid "`{dmgk}`" msgstr "`{dmgk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:504 +#: documentation/content/en/articles/pgpkeys/_index.adoc:507 #, no-wrap msgid "`{daichi}`" msgstr "`{daichi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:507 +#: documentation/content/en/articles/pgpkeys/_index.adoc:510 #, no-wrap msgid "`{grehan}`" msgstr "`{grehan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:510 +#: documentation/content/en/articles/pgpkeys/_index.adoc:513 #, no-wrap msgid "`{jamie}`" msgstr "`{jamie}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:513 +#: documentation/content/en/articles/pgpkeys/_index.adoc:516 #, no-wrap msgid "`{adridg}`" msgstr "`{adridg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:516 +#: documentation/content/en/articles/pgpkeys/_index.adoc:519 #, no-wrap msgid "`{wg}`" msgstr "`{wg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:519 +#: documentation/content/en/articles/pgpkeys/_index.adoc:522 #, no-wrap msgid "`{bar}`" msgstr "`{bar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:522 +#: documentation/content/en/articles/pgpkeys/_index.adoc:525 #, no-wrap msgid "`{jmg}`" msgstr "`{jmg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:525 +#: documentation/content/en/articles/pgpkeys/_index.adoc:528 #, no-wrap msgid "`{mjg}`" msgstr "`{mjg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:528 +#: documentation/content/en/articles/pgpkeys/_index.adoc:531 #, no-wrap msgid "`{jhale}`" msgstr "`{jhale}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:531 +#: documentation/content/en/articles/pgpkeys/_index.adoc:534 #, no-wrap msgid "`{jah}`" msgstr "`{jah}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:534 +#: documentation/content/en/articles/pgpkeys/_index.adoc:537 #, no-wrap msgid "`{dannyboy}`" msgstr "`{dannyboy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:537 +#: documentation/content/en/articles/pgpkeys/_index.adoc:540 #, no-wrap msgid "`{dhartmei}`" msgstr "`{dhartmei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:540 +#: documentation/content/en/articles/pgpkeys/_index.adoc:543 #, no-wrap msgid "`{ohauer}`" msgstr "`{ohauer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:543 +#: documentation/content/en/articles/pgpkeys/_index.adoc:546 #, no-wrap msgid "`{ehaupt}`" msgstr "`{ehaupt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:546 +#: documentation/content/en/articles/pgpkeys/_index.adoc:549 #, no-wrap msgid "`{jhay}`" msgstr "`{jhay}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:549 +#: documentation/content/en/articles/pgpkeys/_index.adoc:552 #, no-wrap msgid "`{bhd}`" msgstr "`{bhd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:552 +#: documentation/content/en/articles/pgpkeys/_index.adoc:555 #, no-wrap msgid "`{sheldonh}`" msgstr "`{sheldonh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:555 +#: documentation/content/en/articles/pgpkeys/_index.adoc:558 #, no-wrap msgid "`{mikeh}`" msgstr "`{mikeh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:558 +#: documentation/content/en/articles/pgpkeys/_index.adoc:561 #, no-wrap msgid "`{mheinen}`" msgstr "`{mheinen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:561 +#: documentation/content/en/articles/pgpkeys/_index.adoc:564 #, no-wrap msgid "`{niels}`" msgstr "`{niels}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:564 +#: documentation/content/en/articles/pgpkeys/_index.adoc:567 #, no-wrap msgid "`{ghelmer}`" msgstr "`{ghelmer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:567 +#: documentation/content/en/articles/pgpkeys/_index.adoc:570 #, no-wrap msgid "`{mux}`" msgstr "`{mux}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:570 +#: documentation/content/en/articles/pgpkeys/_index.adoc:573 #, no-wrap msgid "`{wen}`" msgstr "`{wen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:573 +#: documentation/content/en/articles/pgpkeys/_index.adoc:576 #, no-wrap msgid "`{dhn}`" msgstr "`{dhn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:576 +#: documentation/content/en/articles/pgpkeys/_index.adoc:579 #, no-wrap msgid "`{jhibbits}`" msgstr "`{jhibbits}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:579 +#: documentation/content/en/articles/pgpkeys/_index.adoc:582 #, no-wrap msgid "`{jhixson}`" msgstr "`{jhixson}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:582 +#: documentation/content/en/articles/pgpkeys/_index.adoc:585 #, no-wrap msgid "`{pho}`" msgstr "`{pho}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:585 +#: documentation/content/en/articles/pgpkeys/_index.adoc:588 #, no-wrap msgid "`{oh}`" msgstr "`{oh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:588 +#: documentation/content/en/articles/pgpkeys/_index.adoc:591 #, no-wrap msgid "`{mhorne}`" msgstr "`{mhorne}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:591 +#: documentation/content/en/articles/pgpkeys/_index.adoc:594 #, no-wrap msgid "`{bhughes}`" msgstr "`{bhughes}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:594 +#: documentation/content/en/articles/pgpkeys/_index.adoc:597 #, no-wrap msgid "`{sunpoet}`" msgstr "`{sunpoet}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:600 +#: documentation/content/en/articles/pgpkeys/_index.adoc:603 #, no-wrap msgid "`{foxfair}`" msgstr "`{foxfair}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:603 +#: documentation/content/en/articles/pgpkeys/_index.adoc:606 #, no-wrap msgid "`{whu}`" msgstr "`{whu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:606 +#: documentation/content/en/articles/pgpkeys/_index.adoc:609 #, no-wrap msgid "`{chinsan}`" msgstr "`{chinsan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:609 +#: documentation/content/en/articles/pgpkeys/_index.adoc:612 #, no-wrap msgid "`{zlei}`" msgstr "`{zlei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:612 +#: documentation/content/en/articles/pgpkeys/_index.adoc:615 #, no-wrap msgid "`{davide}`" msgstr "`{davide}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:615 +#: documentation/content/en/articles/pgpkeys/_index.adoc:618 #, no-wrap msgid "`{jkh}`" msgstr "`{jkh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:618 +#: documentation/content/en/articles/pgpkeys/_index.adoc:621 #, no-wrap msgid "`{versus}`" msgstr "`{versus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:621 +#: documentation/content/en/articles/pgpkeys/_index.adoc:624 #, no-wrap msgid "`{pi}`" msgstr "`{pi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:624 +#: documentation/content/en/articles/pgpkeys/_index.adoc:627 #, no-wrap msgid "`{weongyo}`" msgstr "`{weongyo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:627 +#: documentation/content/en/articles/pgpkeys/_index.adoc:630 #, no-wrap msgid "`{peterj}`" msgstr "`{peterj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:630 +#: documentation/content/en/articles/pgpkeys/_index.adoc:633 #, no-wrap msgid "`{jinmei}`" msgstr "`{jinmei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:633 +#: documentation/content/en/articles/pgpkeys/_index.adoc:636 #, no-wrap msgid "`{ahze}`" msgstr "`{ahze}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:636 +#: documentation/content/en/articles/pgpkeys/_index.adoc:639 #, no-wrap msgid "`{markj}`" msgstr "`{markj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:639 +#: documentation/content/en/articles/pgpkeys/_index.adoc:642 #, no-wrap msgid "`{trevor}`" msgstr "`{trevor}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:642 +#: documentation/content/en/articles/pgpkeys/_index.adoc:645 #, no-wrap msgid "`{erj}`" msgstr "`{erj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:648 +#: documentation/content/en/articles/pgpkeys/_index.adoc:651 #, no-wrap msgid "`{bjk}`" msgstr "`{bjk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:651 +#: documentation/content/en/articles/pgpkeys/_index.adoc:654 #, no-wrap msgid "`{phk}`" msgstr "`{phk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:654 +#: documentation/content/en/articles/pgpkeys/_index.adoc:657 #, no-wrap msgid "`{pluknet}`" msgstr "`{pluknet}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:657 +#: documentation/content/en/articles/pgpkeys/_index.adoc:660 #, no-wrap msgid "`{cokane}`" msgstr "`{cokane}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:660 +#: documentation/content/en/articles/pgpkeys/_index.adoc:663 #, no-wrap msgid "`{karels}`" msgstr "`{karels}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:663 +#: documentation/content/en/articles/pgpkeys/_index.adoc:666 #, no-wrap msgid "`{kato}`" msgstr "`{kato}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:666 +#: documentation/content/en/articles/pgpkeys/_index.adoc:669 #, no-wrap msgid "`{vkashyap}`" msgstr "`{vkashyap}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:669 +#: documentation/content/en/articles/pgpkeys/_index.adoc:672 #, no-wrap msgid "`{pkubaj}`" msgstr "`{pkubaj}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:672 +#: documentation/content/en/articles/pgpkeys/_index.adoc:675 #, no-wrap msgid "`{kris}`" msgstr "`{kris}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:675 +#: documentation/content/en/articles/pgpkeys/_index.adoc:678 #, no-wrap msgid "`{keramida}`" msgstr "`{keramida}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:678 +#: documentation/content/en/articles/pgpkeys/_index.adoc:681 #, no-wrap msgid "`{fjoe}`" msgstr "`{fjoe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:681 +#: documentation/content/en/articles/pgpkeys/_index.adoc:684 #, no-wrap msgid "`{manolis}`" msgstr "`{manolis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:684 +#: documentation/content/en/articles/pgpkeys/_index.adoc:687 #, no-wrap msgid "`{stevek}`" msgstr "`{stevek}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:687 +#: documentation/content/en/articles/pgpkeys/_index.adoc:690 #, no-wrap msgid "`{jkim}`" msgstr "`{jkim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:690 +#: documentation/content/en/articles/pgpkeys/_index.adoc:693 #, no-wrap msgid "`{zack}`" msgstr "`{zack}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:693 +#: documentation/content/en/articles/pgpkeys/_index.adoc:696 #, no-wrap msgid "`{akiyano}`" msgstr "`{akiyano}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:696 +#: documentation/content/en/articles/pgpkeys/_index.adoc:699 #, no-wrap msgid "`{jceel}`" msgstr "`{jceel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:699 +#: documentation/content/en/articles/pgpkeys/_index.adoc:702 #, no-wrap msgid "`{andreas}`" msgstr "`{andreas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:702 +#: documentation/content/en/articles/pgpkeys/_index.adoc:705 #, no-wrap msgid "`{kai}`" msgstr "`{kai}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:705 +#: documentation/content/en/articles/pgpkeys/_index.adoc:708 #, no-wrap msgid "`{corvink}`" msgstr "`{corvink}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:708 +#: documentation/content/en/articles/pgpkeys/_index.adoc:711 #, no-wrap msgid "`{jkois}`" msgstr "`{jkois}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:711 +#: documentation/content/en/articles/pgpkeys/_index.adoc:714 #, no-wrap msgid "`{sergei}`" msgstr "`{sergei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:714 +#: documentation/content/en/articles/pgpkeys/_index.adoc:717 #, no-wrap msgid "`{maxim}`" msgstr "`{maxim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:717 +#: documentation/content/en/articles/pgpkeys/_index.adoc:720 #, no-wrap msgid "`{taras}`" msgstr "`{taras}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:720 +#: documentation/content/en/articles/pgpkeys/_index.adoc:723 #, no-wrap msgid "`{tobik}`" msgstr "`{tobik}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:723 +#: documentation/content/en/articles/pgpkeys/_index.adoc:726 #, no-wrap msgid "`{jkoshy}`" msgstr "`{jkoshy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:726 +#: documentation/content/en/articles/pgpkeys/_index.adoc:729 #, no-wrap msgid "`{wkoszek}`" msgstr "`{wkoszek}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:729 +#: documentation/content/en/articles/pgpkeys/_index.adoc:732 #, no-wrap msgid "`{ak}`" msgstr "`{ak}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:732 +#: documentation/content/en/articles/pgpkeys/_index.adoc:735 #, no-wrap msgid "`{gabor}`" msgstr "`{gabor}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:735 +#: documentation/content/en/articles/pgpkeys/_index.adoc:738 #, no-wrap msgid "`{anchie}`" msgstr "`{anchie}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:738 +#: documentation/content/en/articles/pgpkeys/_index.adoc:741 #, no-wrap msgid "`{rushani}`" msgstr "`{rushani}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:741 +#: documentation/content/en/articles/pgpkeys/_index.adoc:744 #, no-wrap msgid "`{kuriyama}`" msgstr "`{kuriyama}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:744 +#: documentation/content/en/articles/pgpkeys/_index.adoc:747 #, no-wrap msgid "`{rene}`" msgstr "`{rene}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:747 +#: documentation/content/en/articles/pgpkeys/_index.adoc:750 #, no-wrap msgid "`{jlaffaye}`" msgstr "`{jlaffaye}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:750 +#: documentation/content/en/articles/pgpkeys/_index.adoc:753 #, no-wrap msgid "`{clement}`" msgstr "`{clement}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:753 +#: documentation/content/en/articles/pgpkeys/_index.adoc:756 #, no-wrap msgid "`{mlaier}`" msgstr "`{mlaier}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:756 +#: documentation/content/en/articles/pgpkeys/_index.adoc:759 #, no-wrap msgid "`{martymac}`" msgstr "`{martymac}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:759 +#: documentation/content/en/articles/pgpkeys/_index.adoc:762 #, no-wrap msgid "`{glarkin}`" msgstr "`{glarkin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:762 +#: documentation/content/en/articles/pgpkeys/_index.adoc:765 #, no-wrap msgid "`{dru}`" msgstr "`{dru}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:765 +#: documentation/content/en/articles/pgpkeys/_index.adoc:768 #, no-wrap msgid "`{lawrance}`" msgstr "`{lawrance}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:768 +#: documentation/content/en/articles/pgpkeys/_index.adoc:771 #, no-wrap msgid "`{njl}`" msgstr "`{njl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:771 +#: documentation/content/en/articles/pgpkeys/_index.adoc:774 #, no-wrap msgid "`{jlh}`" msgstr "`{jlh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:774 +#: documentation/content/en/articles/pgpkeys/_index.adoc:777 #, no-wrap msgid "`{leeym}`" msgstr "`{leeym}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:777 +#: documentation/content/en/articles/pgpkeys/_index.adoc:780 #, no-wrap msgid "`{sam}`" msgstr "`{sam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:780 +#: documentation/content/en/articles/pgpkeys/_index.adoc:783 #, no-wrap msgid "`{jylefort}`" msgstr "`{jylefort}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:783 +#: documentation/content/en/articles/pgpkeys/_index.adoc:786 #, no-wrap msgid "`{grog}`" msgstr "`{grog}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:786 +#: documentation/content/en/articles/pgpkeys/_index.adoc:789 #, no-wrap msgid "`{oliver}`" msgstr "`{oliver}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:789 +#: documentation/content/en/articles/pgpkeys/_index.adoc:792 #, no-wrap msgid "`{netchild}`" msgstr "`{netchild}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:792 +#: documentation/content/en/articles/pgpkeys/_index.adoc:795 #, no-wrap msgid "`{leitao}`" msgstr "`{leitao}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:795 +#: documentation/content/en/articles/pgpkeys/_index.adoc:798 #, no-wrap msgid "`{ae}`" msgstr "`{ae}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:798 +#: documentation/content/en/articles/pgpkeys/_index.adoc:801 #, no-wrap msgid "`{lesi}`" msgstr "`{lesi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:801 +#: documentation/content/en/articles/pgpkeys/_index.adoc:804 #, no-wrap msgid "`{achim}`" msgstr "`{achim}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:804 +#: documentation/content/en/articles/pgpkeys/_index.adoc:807 #, no-wrap msgid "`{cel}`" msgstr "`{cel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:807 +#: documentation/content/en/articles/pgpkeys/_index.adoc:810 #, no-wrap msgid "`{glewis}`" msgstr "`{glewis}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:810 +#: documentation/content/en/articles/pgpkeys/_index.adoc:813 #, no-wrap msgid "`{vishwin}`" msgstr "`{vishwin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:813 +#: documentation/content/en/articles/pgpkeys/_index.adoc:816 #, no-wrap msgid "`{delphij}`" msgstr "`{delphij}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:816 +#: documentation/content/en/articles/pgpkeys/_index.adoc:819 #, no-wrap msgid "`{avatar}`" msgstr "`{avatar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:819 +#: documentation/content/en/articles/pgpkeys/_index.adoc:822 #, no-wrap msgid "`{ijliao}`" msgstr "`{ijliao}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:822 +#: documentation/content/en/articles/pgpkeys/_index.adoc:825 #, no-wrap msgid "`{rlibby}`" msgstr "`{rlibby}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:825 +#: documentation/content/en/articles/pgpkeys/_index.adoc:828 #, no-wrap msgid "`{pclin}`" msgstr "`{pclin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:828 +#: documentation/content/en/articles/pgpkeys/_index.adoc:831 #, no-wrap msgid "`{yzlin}`" msgstr "`{yzlin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:831 +#: documentation/content/en/articles/pgpkeys/_index.adoc:834 #, no-wrap msgid "`{linimon}`" msgstr "`{linimon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:834 +#: documentation/content/en/articles/pgpkeys/_index.adoc:837 #, no-wrap msgid "`{arved}`" msgstr "`{arved}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:837 +#: documentation/content/en/articles/pgpkeys/_index.adoc:840 #, no-wrap msgid "`{dryice}`" msgstr "`{dryice}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:840 +#: documentation/content/en/articles/pgpkeys/_index.adoc:843 #, no-wrap msgid "`{nemoliu}`" msgstr "`{nemoliu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:843 +#: documentation/content/en/articles/pgpkeys/_index.adoc:846 #, no-wrap msgid "`{kevlo}`" msgstr "`{kevlo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:846 +#: documentation/content/en/articles/pgpkeys/_index.adoc:849 #, no-wrap msgid "`{zml}`" msgstr "`{zml}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:849 +#: documentation/content/en/articles/pgpkeys/_index.adoc:852 #, no-wrap msgid "`{nox}`" msgstr "`{nox}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:852 +#: documentation/content/en/articles/pgpkeys/_index.adoc:855 #, no-wrap msgid "`{avl}`" msgstr "`{avl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:855 +#: documentation/content/en/articles/pgpkeys/_index.adoc:858 #, no-wrap msgid "`{scottl}`" msgstr "`{scottl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:858 +#: documentation/content/en/articles/pgpkeys/_index.adoc:861 #, no-wrap msgid "`{rmacklem}`" msgstr "`{rmacklem}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:861 +#: documentation/content/en/articles/pgpkeys/_index.adoc:864 #, no-wrap msgid "`{vmaffione}`" msgstr "`{vmaffione}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:864 +#: documentation/content/en/articles/pgpkeys/_index.adoc:867 #, no-wrap msgid "`{bmah}`" msgstr "`{bmah}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:867 +#: documentation/content/en/articles/pgpkeys/_index.adoc:870 #, no-wrap msgid "`{rm}`" msgstr "`{rm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:870 +#: documentation/content/en/articles/pgpkeys/_index.adoc:873 #, no-wrap msgid "`{mtm}`" msgstr "`{mtm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:873 +#: documentation/content/en/articles/pgpkeys/_index.adoc:876 #, no-wrap msgid "`{dwmalone}`" msgstr "`{dwmalone}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:876 +#: documentation/content/en/articles/pgpkeys/_index.adoc:879 #, no-wrap msgid "`{christos}`" msgstr "`{christos}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:879 +#: documentation/content/en/articles/pgpkeys/_index.adoc:882 #, no-wrap msgid "`{marino}`" msgstr "`{marino}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:882 +#: documentation/content/en/articles/pgpkeys/_index.adoc:885 +#, no-wrap +msgid "`{emaste}`" +msgstr "`{emaste}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:888 #, no-wrap msgid "`{cherry}`" msgstr "`{cherry}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:885 +#: documentation/content/en/articles/pgpkeys/_index.adoc:891 #, no-wrap msgid "`{matusita}`" msgstr "`{matusita}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:888 +#: documentation/content/en/articles/pgpkeys/_index.adoc:894 #, no-wrap msgid "`{mm}`" msgstr "`{mm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:891 +#: documentation/content/en/articles/pgpkeys/_index.adoc:897 #, no-wrap msgid "`{sem}`" msgstr "`{sem}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:894 +#: documentation/content/en/articles/pgpkeys/_index.adoc:900 #, no-wrap msgid "`{rcm}`" msgstr "`{rcm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:897 +#: documentation/content/en/articles/pgpkeys/_index.adoc:903 #, no-wrap msgid "`{mckusick}`" msgstr "`{mckusick}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:900 +#: documentation/content/en/articles/pgpkeys/_index.adoc:906 #, no-wrap msgid "`{tmclaugh}`" msgstr "`{tmclaugh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:903 +#: documentation/content/en/articles/pgpkeys/_index.adoc:909 #, no-wrap msgid "`{jmelo}`" msgstr "`{jmelo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:906 +#: documentation/content/en/articles/pgpkeys/_index.adoc:912 #, no-wrap msgid "`{mmel}`" msgstr "`{mmel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:909 +#: documentation/content/en/articles/pgpkeys/_index.adoc:915 #, no-wrap msgid "`{jmmv}`" msgstr "`{jmmv}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:912 +#: documentation/content/en/articles/pgpkeys/_index.adoc:918 #, no-wrap msgid "`{kadesai}`" msgstr "`{kadesai}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:915 +#: documentation/content/en/articles/pgpkeys/_index.adoc:921 #, no-wrap msgid "`{ken}`" msgstr "`{ken}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:918 +#: documentation/content/en/articles/pgpkeys/_index.adoc:924 #, no-wrap msgid "`{markm}`" msgstr "`{markm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:921 +#: documentation/content/en/articles/pgpkeys/_index.adoc:927 #, no-wrap msgid "`{dinoex}`" msgstr "`{dinoex}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:924 +#: documentation/content/en/articles/pgpkeys/_index.adoc:930 #, no-wrap msgid "`{sanpei}`" msgstr "`{sanpei}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:927 +#: documentation/content/en/articles/pgpkeys/_index.adoc:933 #, no-wrap msgid "`{rmh}`" msgstr "`{rmh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:930 +#: documentation/content/en/articles/pgpkeys/_index.adoc:936 #, no-wrap msgid "`{driesm}`" msgstr "`{driesm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:933 +#: documentation/content/en/articles/pgpkeys/_index.adoc:939 #, no-wrap msgid "`{jrm}`" msgstr "`{jrm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:936 +#: documentation/content/en/articles/pgpkeys/_index.adoc:942 #, no-wrap msgid "`{freqlabs}`" msgstr "`{freqlabs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:939 +#: documentation/content/en/articles/pgpkeys/_index.adoc:945 #, no-wrap msgid "`{mmoll}`" msgstr "`{mmoll}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:942 +#: documentation/content/en/articles/pgpkeys/_index.adoc:948 #, no-wrap msgid "`{cmt}`" msgstr "`{cmt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:945 +#: documentation/content/en/articles/pgpkeys/_index.adoc:951 #, no-wrap msgid "`{stephen}`" msgstr "`{stephen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:948 +#: documentation/content/en/articles/pgpkeys/_index.adoc:954 #, no-wrap msgid "`{marcel}`" msgstr "`{marcel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:951 +#: documentation/content/en/articles/pgpkeys/_index.adoc:957 #, no-wrap msgid "`{dougm}`" msgstr "`{dougm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:954 +#: documentation/content/en/articles/pgpkeys/_index.adoc:960 #, no-wrap msgid "`{kmoore}`" msgstr "`{kmoore}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:957 +#: documentation/content/en/articles/pgpkeys/_index.adoc:963 #, no-wrap msgid "`{marck}`" msgstr "`{marck}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:960 +#: documentation/content/en/articles/pgpkeys/_index.adoc:966 #, no-wrap msgid "`{mav}`" msgstr "`{mav}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:963 +#: documentation/content/en/articles/pgpkeys/_index.adoc:969 #, no-wrap msgid "`{rich}`" msgstr "`{rich}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:966 +#: documentation/content/en/articles/pgpkeys/_index.adoc:972 #, no-wrap msgid "`{knu}`" msgstr "`{knu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:969 +#: documentation/content/en/articles/pgpkeys/_index.adoc:975 #, no-wrap msgid "`{tmm}`" msgstr "`{tmm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:972 +#: documentation/content/en/articles/pgpkeys/_index.adoc:978 #, no-wrap msgid "`{max}`" msgstr "`{max}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:975 +#: documentation/content/en/articles/pgpkeys/_index.adoc:981 #, no-wrap msgid "`{maho}`" msgstr "`{maho}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:978 +#: documentation/content/en/articles/pgpkeys/_index.adoc:984 #, no-wrap msgid "`{yoichi}`" msgstr "`{yoichi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:981 +#: documentation/content/en/articles/pgpkeys/_index.adoc:987 #, no-wrap msgid "`{bland}`" msgstr "`{bland}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:984 +#: documentation/content/en/articles/pgpkeys/_index.adoc:990 #, no-wrap msgid "`{gnn}`" msgstr "`{gnn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:987 +#: documentation/content/en/articles/pgpkeys/_index.adoc:993 #, no-wrap msgid "`{khng}`" msgstr "`{khng}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:990 +#: documentation/content/en/articles/pgpkeys/_index.adoc:996 #, no-wrap msgid "`{simon}`" msgstr "`{simon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:993 +#: documentation/content/en/articles/pgpkeys/_index.adoc:999 #, no-wrap msgid "`{rnoland}`" msgstr "`{rnoland}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:996 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1002 #, no-wrap msgid "`{anders}`" msgstr "`{anders}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:999 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1005 #, no-wrap msgid "`{lofi}`" msgstr "`{lofi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1002 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1008 #, no-wrap msgid "`{obrien}`" msgstr "`{obrien}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1005 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1011 #, no-wrap msgid "`{olgeni}`" msgstr "`{olgeni}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1008 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1014 #, no-wrap msgid "`{philip}`" msgstr "`{philip}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1011 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1017 #, no-wrap msgid "`{jpaetzel}`" msgstr "`{jpaetzel}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1014 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1020 #, no-wrap msgid "`{zirias}`" msgstr "`{zirias}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1017 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1023 #, no-wrap msgid "`{hiren}`" msgstr "`{hiren}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1020 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1026 #, no-wrap msgid "`{hmp}`" msgstr "`{hmp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1023 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1029 #, no-wrap msgid "`{fluffy}`" msgstr "`{fluffy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1026 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1032 #, no-wrap msgid "`{sat}`" msgstr "`{sat}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1029 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1035 #, no-wrap msgid "`{np}`" msgstr "`{np}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1032 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1038 #, no-wrap msgid "`{royger}`" msgstr "`{royger}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1035 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1041 #, no-wrap msgid "`{rpaulo}`" msgstr "`{rpaulo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1038 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1044 #, no-wrap msgid "`{misha}`" msgstr "`{misha}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1041 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1047 #, no-wrap msgid "`{dumbbell}`" msgstr "`{dumbbell}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1044 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1050 #, no-wrap msgid "`{rpokala}`" msgstr "`{rpokala}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1047 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1053 #, no-wrap msgid "`{mp}`" msgstr "`{mp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1050 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1056 #, no-wrap msgid "`{roam}`" msgstr "`{roam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1053 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1059 #, no-wrap msgid "`{den}`" msgstr "`{den}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1056 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1062 #, no-wrap msgid "`{csjp}`" msgstr "`{csjp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1059 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1065 #, no-wrap msgid "`{grahamperrin}`" msgstr "`{grahamperrin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1062 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1068 #, no-wrap msgid "`{gerald}`" msgstr "`{gerald}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1065 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1071 #, no-wrap msgid "`{scottph}`" msgstr "`{scottph}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1068 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1074 #, no-wrap msgid "`{jacula}`" msgstr "`{jacula}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1071 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1077 #, no-wrap msgid "`{0mp}`" msgstr "`{0mp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1074 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1080 #, no-wrap msgid "`{jdp}`" msgstr "`{jdp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1077 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1083 #, no-wrap msgid "`{krion}`" msgstr "`{krion}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1080 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1086 +#, no-wrap +msgid "`{vladlen}`" +msgstr "`{vladlen}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:1089 #, no-wrap msgid "`{sepotvin}`" msgstr "`{sepotvin}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1083 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1092 #, no-wrap msgid "`{cpm}`" msgstr "`{cpm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1086 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1095 #, no-wrap msgid "`{markp}`" msgstr "`{markp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1089 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1098 #, no-wrap msgid "`{alepulver}`" msgstr "`{alepulver}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1092 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1101 #, no-wrap msgid "`{kp}`" msgstr "`{kp}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1095 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1104 #, no-wrap msgid "`{thomas}`" msgstr "`{thomas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1098 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1107 #, no-wrap msgid "`{hq}`" msgstr "`{hq}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1101 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1110 #, no-wrap msgid "`{bofh}`" msgstr "`{bofh}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1104 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1113 #, no-wrap msgid "`{fox}`" msgstr "`{fox}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1107 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1116 #, no-wrap msgid "`{lbr}`" msgstr "`{lbr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1110 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1119 #, no-wrap msgid "`{crees}`" msgstr "`{crees}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1113 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1122 #, no-wrap msgid "`{rees}`" msgstr "`{rees}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1116 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1125 #, no-wrap msgid "`{mr}`" msgstr "`{mr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1119 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1128 #, no-wrap msgid "`{bcr}`" msgstr "`{bcr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1122 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1131 #, no-wrap msgid "`{trhodes}`" msgstr "`{trhodes}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1125 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1134 #, no-wrap msgid "`{benno}`" msgstr "`{benno}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1128 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1137 #, no-wrap msgid "`{beech}`" msgstr "`{beech}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1131 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1140 #, no-wrap msgid "`{roberto}`" msgstr "`{roberto}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1134 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1143 #, no-wrap msgid "`{rodrigc}`" msgstr "`{rodrigc}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1137 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1146 #, no-wrap msgid "`{michaelo}`" msgstr "`{michaelo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1140 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1149 #, no-wrap msgid "`{igoro}`" msgstr "`{igoro}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1143 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1152 #, no-wrap msgid "`{dtxdf}`" msgstr "`{dtxdf}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1146 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1155 #, no-wrap msgid "`{ler}`" msgstr "`{ler}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1149 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1158 #, no-wrap msgid "`{leres}`" msgstr "`{leres}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1152 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1161 #, no-wrap msgid "`{robak}`" msgstr "`{robak}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1155 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1164 #, no-wrap msgid "`{guido}`" msgstr "`{guido}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1158 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1167 #, no-wrap msgid "`{rea}`" msgstr "`{rea}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1161 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1170 #, no-wrap msgid "`{ray}`" msgstr "`{ray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1164 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1173 #, no-wrap msgid "`{niklas}`" msgstr "`{niklas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1167 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1176 #, no-wrap msgid "`{salvadore}`" msgstr "`{salvadore}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1170 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1179 #, no-wrap msgid "`{bsam}`" msgstr "`{bsam}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1173 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1182 #, no-wrap msgid "`{marks}`" msgstr "`{marks}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1176 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1185 #, no-wrap msgid "`{bschmidt}`" msgstr "`{bschmidt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1179 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1188 #, no-wrap msgid "`{wosch}`" msgstr "`{wosch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1182 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1191 #, no-wrap msgid "`{cy}`" msgstr "`{cy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1185 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1194 #, no-wrap msgid "`{das}`" msgstr "`{das}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1188 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1197 #, no-wrap msgid "`{scheidell}`" msgstr "`{scheidell}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1191 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1200 #, no-wrap msgid "`{matthew}`" msgstr "`{matthew}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1194 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1203 #, no-wrap msgid "`{tmseck}`" msgstr "`{tmseck}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1197 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1206 #, no-wrap msgid "`{johans}`" msgstr "`{johans}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1200 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1209 #, no-wrap msgid "`{bakul}`" msgstr "`{bakul}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1203 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1212 #, no-wrap msgid "`{gshapiro}`" msgstr "`{gshapiro}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1206 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1215 #, no-wrap msgid "`{wxs}`" msgstr "`{wxs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1209 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1218 #, no-wrap msgid "`{nork}`" msgstr "`{nork}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1212 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1221 #, no-wrap msgid "`{syrinx}`" msgstr "`{syrinx}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1215 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1224 #, no-wrap msgid "`{vanilla}`" msgstr "`{vanilla}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1218 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1227 #, no-wrap msgid "`{ashafer}`" msgstr "`{ashafer}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1221 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1230 #, no-wrap msgid "`{ashish}`" msgstr "`{ashish}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1224 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1233 #, no-wrap msgid "`{asiciliano}`" msgstr "`{asiciliano}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1227 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1236 #, no-wrap msgid "`{chs}`" msgstr "`{chs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1230 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1239 #, no-wrap msgid "`{bms}`" msgstr "`{bms}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1233 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1242 #, no-wrap msgid "`{demon}`" msgstr "`{demon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1236 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1245 #, no-wrap msgid "`{jesper}`" msgstr "`{jesper}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1239 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1248 #, no-wrap msgid "`{scop}`" msgstr "`{scop}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1242 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1251 #, no-wrap msgid "`{anray}`" msgstr "`{anray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1245 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1254 #, no-wrap msgid "`{flo}`" msgstr "`{flo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1251 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1260 #, no-wrap msgid "`{kensmith}`" msgstr "`{kensmith}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1254 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1263 #, no-wrap msgid "`{ben}`" msgstr "`{ben}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1257 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1266 #, no-wrap msgid "`{des}`" msgstr "`{des}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1260 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1269 #, no-wrap msgid "`{sobomax}`" msgstr "`{sobomax}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1263 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1272 #, no-wrap msgid "`{asomers}`" msgstr "`{asomers}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1266 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1275 #, no-wrap msgid "`{brian}`" msgstr "`{brian}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1269 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1278 #, no-wrap msgid "`{sson}`" msgstr "`{sson}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1272 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1281 #, no-wrap msgid "`{nsouch}`" msgstr "`{nsouch}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1275 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1284 #, no-wrap msgid "`{ssouhlal}`" msgstr "`{ssouhlal}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1278 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1287 #, no-wrap msgid "`{loos}`" msgstr "`{loos}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1281 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1290 #, no-wrap msgid "`{brnrd}`" msgstr "`{brnrd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1284 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1293 #, no-wrap msgid "`{rink}`" msgstr "`{rink}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1287 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1296 #, no-wrap msgid "`{vsevolod}`" msgstr "`{vsevolod}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1290 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1299 #, no-wrap msgid "`{pstef}`" msgstr "`{pstef}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1293 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1302 #, no-wrap msgid "`{zi}`" msgstr "`{zi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1296 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1305 #, no-wrap msgid "`{lstewart}`" msgstr "`{lstewart}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1299 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1308 #, no-wrap msgid "`{murray}`" msgstr "`{murray}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1302 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1311 #, no-wrap msgid "`{vs}`" msgstr "`{vs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1305 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1314 #, no-wrap msgid "`{xride}`" msgstr "`{xride}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1308 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1317 #, no-wrap msgid "`{marius}`" msgstr "`{marius}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1311 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1320 #, no-wrap msgid "`{cs}`" msgstr "`{cs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1314 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1323 #, no-wrap msgid "`{clsung}`" msgstr "`{clsung}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1317 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1326 #, no-wrap msgid "`{gsutter}`" msgstr "`{gsutter}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1320 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1329 #, no-wrap msgid "`{metal}`" msgstr "`{metal}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1323 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1332 #, no-wrap msgid "`{ryusuke}`" msgstr "`{ryusuke}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1326 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1335 #, no-wrap msgid "`{nyan}`" msgstr "`{nyan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1329 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1338 #, no-wrap msgid "`{sahil}`" msgstr "`{sahil}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1332 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1341 #, no-wrap msgid "`{tota}`" msgstr "`{tota}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1335 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1344 #, no-wrap msgid "`{romain}`" msgstr "`{romain}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1338 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1347 #, no-wrap msgid "`{eduardo}`" msgstr "`{eduardo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1341 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1350 #, no-wrap msgid "`{sylvio}`" msgstr "`{sylvio}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1344 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1353 #, no-wrap msgid "`{itetcu}`" msgstr "`{itetcu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1347 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1356 #, no-wrap msgid "`{mi}`" msgstr "`{mi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1350 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1359 #, no-wrap msgid "`{gordon}`" msgstr "`{gordon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1353 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1362 #, no-wrap msgid "`{lth}`" msgstr "`{lth}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1356 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1365 #, no-wrap msgid "`{fabient}`" msgstr "`{fabient}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1359 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1368 #, no-wrap msgid "`{thierry}`" msgstr "`{thierry}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1362 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1371 #, no-wrap msgid "`{thompsa}`" msgstr "`{thompsa}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1365 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1374 #, no-wrap msgid "`{flz}`" msgstr "`{flz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1368 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1377 #, no-wrap msgid "`{jilles}`" msgstr "`{jilles}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1371 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1380 #, no-wrap msgid "`{ganbold}`" msgstr "`{ganbold}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1374 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1383 #, no-wrap msgid "`{tuexen}`" msgstr "`{tuexen}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1377 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1386 #, no-wrap msgid "`{gonzo}`" msgstr "`{gonzo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1380 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1389 #, no-wrap msgid "`{uzsolt}`" msgstr "`{uzsolt}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1383 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1392 #, no-wrap msgid "`{ume}`" msgstr "`{ume}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1386 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1395 #, no-wrap msgid "`{ups}`" msgstr "`{ups}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1389 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1398 #, no-wrap msgid "`{fsu}`" msgstr "`{fsu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1392 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1401 #, no-wrap msgid "`{mikael}`" msgstr "`{mikael}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1395 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1404 #, no-wrap msgid "`{manu}`" msgstr "`{manu}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1398 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1407 #, no-wrap msgid "`{ram}`" msgstr "`{ram}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1401 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1410 #, no-wrap msgid "`{bryanv}`" msgstr "`{bryanv}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1404 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1413 #, no-wrap msgid "`{nectar}`" msgstr "`{nectar}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1407 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1416 #, no-wrap msgid "`{avilla}`" msgstr "`{avilla}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1410 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1419 #, no-wrap msgid "`{nivit}`" msgstr "`{nivit}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1413 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1422 #, no-wrap msgid "`{ivoras}`" msgstr "`{ivoras}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1416 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1425 #, no-wrap msgid "`{stefan}`" msgstr "`{stefan}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1419 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1428 #, no-wrap msgid "`{kaiw}`" msgstr "`{kaiw}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1422 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1431 #, no-wrap msgid "`{adamw}`" msgstr "`{adamw}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1425 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1434 #, no-wrap msgid "`{naddy}`" msgstr "`{naddy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1428 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1437 #, no-wrap msgid "`{peter}`" msgstr "`{peter}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1431 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1440 #, no-wrap msgid "`{nwhitehorn}`" msgstr "`{nwhitehorn}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1434 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1443 #, no-wrap msgid "`{obiwac}`" msgstr "`{obiwac}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1437 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1446 #, no-wrap msgid "`{miwi}`" msgstr "`{miwi}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1440 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1449 #, no-wrap msgid "`{nate}`" msgstr "`{nate}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1443 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1452 #, no-wrap msgid "`{twinterg}`" msgstr "`{twinterg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1446 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1455 #, no-wrap msgid "`{def}`" msgstr "`{def}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1449 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1458 #, no-wrap msgid "`{wollman}`" msgstr "`{wollman}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1452 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1461 #, no-wrap msgid "`{joerg}`" msgstr "`{joerg}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1455 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1464 #, no-wrap msgid "`{ygy}`" msgstr "`{ygy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1458 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1467 #, no-wrap msgid "`{emax}`" msgstr "`{emax}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1461 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1470 #, no-wrap msgid "`{oshogbo}`" msgstr "`{oshogbo}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1464 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1473 +#, no-wrap +msgid "`{andy}`" +msgstr "`{andy}`" + +#. type: Title === +#: documentation/content/en/articles/pgpkeys/_index.adoc:1476 #, no-wrap msgid "`{riggs}`" msgstr "`{riggs}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1467 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1479 #, no-wrap msgid "`{egypcio}`" msgstr "`{egypcio}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1470 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1482 #, no-wrap msgid "`{bz}`" msgstr "`{bz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1473 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1485 #, no-wrap msgid "`{dsl}`" msgstr "`{dsl}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1476 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1488 #, no-wrap msgid "`{zeising}`" msgstr "`{zeising}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1479 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1491 #, no-wrap msgid "`{phantom}`" msgstr "`{phantom}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1482 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1494 #, no-wrap msgid "`{tz}`" msgstr "`{tz}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1485 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1497 #, no-wrap msgid "`{rigoletto}`" msgstr "`{rigoletto}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1488 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1500 #, no-wrap msgid "`{kaktus}`" msgstr "`{kaktus}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1491 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1503 #, no-wrap msgid "`{samm}`" msgstr "`{samm}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1494 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1506 #, no-wrap msgid "`{arrowd}`" msgstr "`{arrowd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1497 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1509 #, no-wrap msgid "`{ronald}`" msgstr "`{ronald}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1500 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1512 #, no-wrap msgid "`{meta}`" msgstr "`{meta}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1503 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1515 #, no-wrap msgid "`{rnagy}`" msgstr "`{rnagy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1506 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1518 #, no-wrap msgid "`{vvd}`" msgstr "`{vvd}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1509 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1521 #, no-wrap msgid "`{gbe}`" msgstr "`{gbe}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1512 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1524 #, no-wrap msgid "`{bnovkov}`" msgstr "`{bnovkov}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1515 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1527 #, no-wrap msgid "`{ivy}`" msgstr "`{ivy}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1518 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1530 #, no-wrap msgid "`{khorben}`" msgstr "`{khorben}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1521 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1533 #, no-wrap msgid "`{vexeduxr}`" msgstr "`{vexeduxr}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1524 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1536 #, no-wrap msgid "`{alven}`" msgstr "`{alven}`" #. type: Title == -#: documentation/content/en/articles/pgpkeys/_index.adoc:1528 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1540 #, no-wrap msgid "Other Cluster Account Holders" msgstr "Другие владельцы учётных записей" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1530 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1542 #, no-wrap msgid "`{bk}`" msgstr "`{bk}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1533 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1545 #, no-wrap msgid "`{deb}`" msgstr "`{deb}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1536 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1548 #, no-wrap msgid "`{debdrup}`" msgstr "`{debdrup}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1539 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1551 #, no-wrap msgid "`{dutchdaemon}`" msgstr "`{dutchdaemon}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1542 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1554 #, no-wrap msgid "`{keymaster}`" msgstr "`{keymaster}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1545 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1557 #, no-wrap msgid "`{mwlucas}`" msgstr "`{mwlucas}`" #. type: Title === -#: documentation/content/en/articles/pgpkeys/_index.adoc:1548 +#: documentation/content/en/articles/pgpkeys/_index.adoc:1560 #, no-wrap msgid "`{dhw}`" msgstr "`{dhw}`" diff --git a/documentation/content/ru/articles/rc-scripting/_index.adoc b/documentation/content/ru/articles/rc-scripting/_index.adoc index ee0af4b070..2c50b46d3d 100644 --- a/documentation/content/ru/articles/rc-scripting/_index.adoc +++ b/documentation/content/ru/articles/rc-scripting/_index.adoc @@ -1,775 +1,775 @@ --- authors: - author: 'Yar Tikhiy' email: yar@FreeBSD.org copyright: '2005-2006, 2012 The FreeBSD Project' description: 'Руководство по написанию новых rc.d-скриптов и пониманию уже существующих' tags: ["rc.d", "scripting", "guide", "tutorial", "FreeBSD"] title: 'Практическое руководство по написанию rc.d скриптов в BSD' trademarks: ["freebsd", "netbsd", "general"] --- = Практическое руководство по написанию rc.d скриптов в BSD :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/rc-scripting/ 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] Аннотация Новичкам может быть сложно соотнести факты из официальной документации по фреймворку [.filename]#rc.d# в BSD с практическими задачами написания скриптов для [.filename]#rc.d#. В этой статье мы рассмотрим несколько типичных случаев возрастающей сложности, покажем возможности [.filename]#rc.d#, подходящие для каждого случая, и обсудим, как они работают. Такое рассмотрение должно дать ориентиры для дальнейшего изучения устройства и эффективного применения [.filename]#rc.d#. ''' toc::[] [[rcng-intro]] == Введение Исторически в BSD был монолитный стартовый сценарий [.filename]#/etc/rc#. Он вызывался man:init[8] во время загрузки системы и выполнял все задачи пользовательского пространства, необходимые для многопользовательского режима: проверку и монтирование файловых систем, настройку сети, запуск демонов и так далее. Точный список задач не был одинаковым в каждой системе; администраторам требовалось его настраивать. За редкими исключениями, [.filename]#/etc/rc# приходилось изменять, и настоящим хакерам это нравилось. Основная проблема монолитного подхода заключалась в том, что он не предоставлял контроля над отдельными компонентами, запускаемыми из [.filename]#/etc/rc#. Например, [.filename]#/etc/rc# не мог перезапустить отдельный демон. Администратору системы приходилось вручную находить процесс демона, завершать его, ждать, пока он действительно завершится, затем искать в [.filename]#/etc/rc# нужные флаги и, наконец, вводить полную командную строку для повторного запуска демона. Задача становилась ещё сложнее и более подверженной ошибкам, если служба состояла из нескольких демонов или требовала дополнительных действий. Одним словом, единый скрипт не справлялся с тем, для чего скрипты вообще предназначены: облегчать жизнь администратору системы. Позже была предпринята попытка разделить некоторые части [.filename]#/etc/rc# для возможности отдельного запуска наиболее важных подсистем. Известным примером стал [.filename]#/etc/netstart#, предназначенный для настройки сети. Это позволяло получить доступ к сети в однопользовательском режиме, но плохо интегрировалось в автоматический процесс запуска, так как части его кода требовалось переплетаться с действиями, по сути не связанными с сетью. Именно поэтому [.filename]#/etc/netstart# превратился в [.filename]#/etc/rc.network#. Последний больше не был обычным скриптом; он состоял из больших, запутанных функций man:sh[1], вызываемых из [.filename]#/etc/rc# на разных этапах загрузки системы. Однако по мере того, как задачи при запуске становились разнообразнее и сложнее, "квазимодульный" подход стал ещё большей обузой, чем монолитный [.filename]#/etc/rc#. Без чистого и хорошо продуманного каркаса, стартовые скрипты вынуждены были идти на всевозможные ухищрения, чтобы удовлетворить потребности быстро развивающихся BSD-ориентированных операционных систем. В конце концов стало очевидно, что необходимы дополнительные шаги на пути к детализированной и расширяемой системе [.filename]#rc#. Так появилась BSD [.filename]#rc.d#. Её признанными создателями стали Люк Мьюберн и сообщество NetBSD. Позже она была импортирована в FreeBSD. Её название отсылает к расположению системных скриптов для отдельных служб, которое находится в [.filename]#/etc/rc.d#. Вскоре мы узнаем больше о компонентах системы [.filename]#rc.d# и увидим, как вызываются отдельные скрипты. Основные идеи, лежащие в основе BSD [.filename]#rc.d#, — это _тонкая модульность_ и __повторное использование кода__. _Тонкая модульность_ означает, что каждая базовая «служба», такая как системный демон или примитивная задача запуска, получает собственный сценарий man:sh[1], способный запустить службу, остановить её, перезагрузить или проверить её состояние. Конкретное действие выбирается аргументом командной строки, переданным в сценарий. Сценарий [.filename]#/etc/rc# по-прежнему управляет запуском системы, но теперь он просто вызывает небольшие сценарии один за другим с аргументом `start`. Также легко выполнять задачи завершения работы, запуская тот же набор сценариев с аргументом `stop`, что и делает [.filename]#/etc/rc.shutdown#. Обратите внимание, насколько это близко следует Unix-подходу, где используется набор небольших специализированных инструментов, каждый из которых выполняет свою задачу наилучшим образом. _Повторное использование кода_ означает, что общие операции реализованы как функции man:sh[1] и собраны в [.filename]#/etc/rc.subr#. Теперь типичный сценарий может состоять всего из нескольких строк кода man:sh[1]. Наконец, важной частью инфраструктуры [.filename]#rc.d# является man:rcorder[8], который помогает [.filename]#/etc/rc# упорядоченно запускать небольшие сценарии с учётом зависимостей между ними. Он также может помочь [.filename]#/etc/rc.shutdown#, поскольку правильный порядок завершения работы противоположен порядку запуска. Дизайн BSD [.filename]#rc.d# описан в crossref:rc-scripting[lukem, оригинальной статье Люка Мьюберна], а компоненты [.filename]#rc.d# подробно документированы в crossref:rc-scripting[manpages, соответствующих страницах Справочника]. Однако новичку в [.filename]#rc.d# может быть неочевидно, как связать многочисленные элементы вместе, чтобы создать хорошо структурированный скрипт для конкретной задачи. Поэтому в этой статье будет предпринята попытка описать [.filename]#rc.d# с другого ракурса. В ней будет показано, какие функции следует использовать в ряде типичных случаев и почему. Обратите внимание, что это не руководство HowTo, поскольку наша цель — не предоставление готовых рецептов, а демонстрация нескольких простых способов входа в мир [.filename]#rc.d#. Также эта статья не заменяет соответствующие страниц Справочника. Не стесняйтесь обращаться к ним для получения более формальной и полной документации во время чтения этой статьи. Для понимания этой статьи есть предварительные требования. Прежде всего, вы должны быть знакомы с языком написания сценариев man:sh[1], чтобы освоить [.filename]#rc.d#. Кроме того, вы должны знать, как система выполняет задачи запуска и завершения работы пользовательского пространства, что описано в man:rc[8]. Эта статья посвящена ветке FreeBSD в [.filename]#rc.d#. Тем не менее, она может быть полезна и разработчикам NetBSD, потому что две ветки BSD [.filename]#rc.d# не только разделяют одинаковый дизайн, но и остаются схожими в аспектах, видимых авторам скриптов. [[rcng-task]] == Обрисовка задачи Немного размышлений перед запуском `$EDITOR` не повредит. Чтобы написать хорошо продуманный скрипт [.filename]#rc.d# для системной службы, сначала нужно ответить на следующие вопросы: * Является ли служба обязательной или опциональной? * Будет ли скрипт обслуживать одну программу, например, демон, или выполнять более сложные действия? * От каких других служб зависит наша служба, и наоборот? Из следующих примеров мы увидим, почему важно знать ответы на эти вопросы. [[rcng-dummy]] == Примитивный скрипт Следующий скрипт просто выводит сообщение каждый раз при загрузке системы: [.programlisting] .... #!/bin/sh <.> . /etc/rc.subr <.> name="dummy" <.> start_cmd="${name}_start" <.> stop_cmd=":" <.> dummy_start() <.> { echo "Nothing started." } load_rc_config $name <.> run_rc_command "$1" <.> .... Вот что следует учитывать: ➊ Интерпретируемый скрипт должен начинаться с "волшебной" строки shebang. Эта строка указывает программу-интерпретатор для скрипта. Благодаря строке shebang скрипт может быть запущен точно так же, как бинарная программа, при условии что у него установлен бит выполнения. (См. man:chmod[1].) Например, системный администратор может запустить наш скрипт вручную из командной строки: [source, shell] .... # /etc/rc.d/dummy start .... [NOTE] ==== Для корректного управления в рамках [.filename]#rc.d# скрипты должны быть написаны на языке man:sh[1]. Если у вас есть служба или порт, который использует двоичную утилиту управления или процедуру запуска, написанную на другом языке, установите этот компонент в [.filename]#/usr/sbin# (для системы) или [.filename]#/usr/local/sbin# (для портов) и вызовите его из man:sh[1] скрипта в соответствующем каталоге [.filename]#rc.d#. ==== [TIP] ==== Если вы хотите узнать подробности о том, почему скрипты [.filename]#rc.d# должны быть написаны на языке man:sh[1], изучите, как [.filename]#/etc/rc# вызывает их с помощью `run_rc_script`, а затем изучите реализацию `run_rc_script` в [.filename]#/etc/rc.subr#. ==== ➋ В файле [.filename]#/etc/rc.subr# определено несколько функций man:sh[1], которые могут использоваться скриптами [.filename]#rc.d#. Эти функции описаны в man:rc.subr[8]. Хотя теоретически возможно написать скрипт [.filename]#rc.d# без использования man:rc.subr[8], его функции оказываются чрезвычайно полезными и значительно упрощают задачу. Поэтому неудивительно, что все используют man:rc.subr[8] в скриптах [.filename]#rc.d#. Мы не будем исключением. Файл [.filename]#rc.d# должен "подгрузить" ([.filename]#/etc/rc.subr#, включить его с помощью "`.`") _до_ вызова функций man:rc.subr[8], чтобы у man:sh[1] была возможность знать об этих функциях заранее. Предпочтительный стиль — подгружать [.filename]#/etc/rc.subr# в самом начале. [NOTE] ==== Некоторые полезные функции, связанные с сетью, предоставляются другим включаемым файлом — [.filename]#/etc/network.subr#. ==== ➌ [[name-var]]Обязательная переменная `name` определяет имя нашего скрипта. Она требуется man:rc.subr[8]. То есть, каждый скрипт в [.filename]#rc.d# _должен_ установить `name` перед вызовом функций man:rc.subr[8]. Теперь самое время раз и навсегда выбрать уникальное имя для нашего скрипта. Мы будем использовать его в нескольких местах при разработке скрипта. Содержимое переменной name должно соответствовать имени скрипта, так как некоторые части FreeBSD (например, crossref:rc-scripting[rcng-service-jails, сервисные клетки (jail)] и функция cpuset в rc framework) зависят от этого. Таким образом, имя файла также не должно содержать символов, которые могут вызвать проблемы в скриптах (например, не используйте дефис "-" и другие). [NOTE] ==== Текущий стиль написания скриптов в [.filename]#rc.d# заключается в заключении значений, присваиваемых переменным, в двойные кавычки. Имейте в виду, что это всего лишь вопрос стиля, который может быть не всегда применим. Вы можете безопасно опустить кавычки вокруг простых слов без метасимволов man:sh[1], тогда как в некоторых случаях вам понадобятся одинарные кавычки, чтобы предотвратить интерпретацию значения man:sh[1]. Программист должен уметь отличать синтаксис языка от стилевых соглашений и разумно использовать и то, и другое. ==== ➍ Основная идея man:rc.subr[8] заключается в том, что скрипт [.filename]#rc.d# предоставляет обработчики (или методы) для вызова man:rc.subr[8]. В частности, аргументы `start`, `stop` и другие, передаваемые в скрипт [.filename]#rc.d#, обрабатываются таким образом. Метод представляет собой выражение man:sh[1], сохранённое в переменной с именем `argument_cmd`, где _argument_ соответствует тому, что может быть указано в командной строке скрипта. Далее мы увидим, как man:rc.subr[8] предоставляет стандартные методы для типовых аргументов. [NOTE] ==== Чтобы сделать код в [.filename]#rc.d# более единообразным, обычно используют `${name}` везде, где это уместно. Таким образом, множество строк можно просто копировать из одного скрипта в другой. ==== ➎ Следует помнить, что man:rc.subr[8] предоставляет методы по умолчанию для стандартных аргументов. Следовательно, если мы хотим, чтобы стандартный метод ничего не делал, мы должны переопределить его с помощью no-op man:sh[1] выражения. ➏ Тело сложного метода может быть реализовано в виде функции. Хорошей практикой является использование осмысленного имени функции. [IMPORTANT] ==== Настоятельно рекомендуется добавлять префикс `${name}` к именам всех функций, определенных в нашем скрипте, чтобы они никогда не конфликтовали с функциями из man:rc.subr[8] или другого общего включаемого файла. ==== ➐ Этот вызов man:rc.subr[8] загружает переменные man:rc.conf[5]. Наш скрипт пока их не использует, но всё равно рекомендуется загружать man:rc.conf[5], потому что могут быть переменные man:rc.conf[5], управляющие самим man:rc.subr[8]. ➑ Обычно это последняя команда в скрипте [.filename]#rc.d#. Она вызывает механизм man:rc.subr[8] для выполнения запрошенного действия, используя переменные и методы, предоставленные нашим скриптом. [[rcng-confdummy]] == Настраиваемый фиктивный скрипт Теперь добавим некоторые элементы управления в наш тестовый скрипт. Как вам может быть известно, скрипты [.filename]#rc.d# управляются с помощью man:rc.conf[5]. К счастью, man:rc.subr[8] скрывает от нас все сложности. Следующий скрипт использует man:rc.conf[5] через man:rc.subr[8], чтобы проверить, включен ли он вообще, и получить сообщение для отображения во время загрузки. Эти две задачи на самом деле независимы. С одной стороны, скрипт [.filename]#rc.d# может просто поддерживать включение и выключение своего сервиса. С другой стороны, обязательный скрипт [.filename]#rc.d# может иметь переменные конфигурации. Однако мы реализуем обе возможности в одном скрипте: [.programlisting] .... #!/bin/sh . /etc/rc.subr name=dummy rcvar=dummy_enable <.> start_cmd="${name}_start" stop_cmd=":" load_rc_config $name <.> : ${dummy_enable:=no} <.> : ${dummy_msg="Nothing started."} <.> dummy_start() { echo "$dummy_msg" <.> } run_rc_command "$1" .... Что изменилось в этом примере? ➊ Переменная `rcvar` определяет имя переменной-переключателя ON/OFF. ➋ Теперь `load_rc_config` вызывается раньше в скрипте, до обращения к любым переменным man:rc.conf[5]. [NOTE] ==== При изучении скриптов в [.filename]#rc.d# следует помнить, что man:sh[1] откладывает вычисление выражений в функции до её вызова. Поэтому не будет ошибкой вызвать `load_rc_config` непосредственно перед `run_rc_command` и при этом обращаться к переменным man:rc.conf[5] из функций методов, экспортируемых в `run_rc_command`. Это связано с тем, что функции методов вызываются `run_rc_command`, который выполняется _после_ `load_rc_config`. ==== ➌ `run_rc_command` выдаст предупреждение, если переменная `rcvar` установлена, но указанная переменная-флаг не задана. Если ваш скрипт [.filename]#rc.d# предназначен для базовой системы, вы должны добавить значение по умолчанию для флага в [.filename]#/etc/defaults/rc.conf# и задокументировать его в man:rc.conf[5]. В противном случае ваш скрипт должен предоставить значение по умолчанию для флага. Канонический подход для последнего случая показан в примере. [NOTE] ==== Вы можете заставить man:rc.subr[8] действовать так, как если бы переключатель установлен в `ON`, независимо от его текущего значения, добавив перед аргументом скрипта префикс `one` или `force`, например `onestart` или `forcestop`. Однако учтите, что `force` имеет другие опасные эффекты, которые мы затронем ниже, тогда как `one` просто переопределяет переключатель ON/OFF. Например, предположим, что `dummy_enable` установлен в `OFF`. Следующая команда выполнит метод `start`, несмотря на настройку: [source, shell] .... # /etc/rc.d/dummy onestart .... ==== ➍ Теперь сообщение, отображаемое при загрузке, больше не жестко закодировано в скрипте. Оно задается переменной `dummy_msg` в man:rc.conf[5]. Это простой пример того, как переменные man:rc.conf[5] могут управлять скриптом в [.filename]#rc.d#. [IMPORTANT] ==== Имена всех переменных man:rc.conf[5], используемых исключительно нашим скриптом, _должны_ иметь один и тот же префикс: `${name}_`. Например: `dummy_mode`, `dummy_state_file` и так далее. ==== [NOTE] ==== Хотя можно использовать более короткое имя внутри, например, просто `msg`, добавление уникального префикса `${name}_` ко всем глобальным именам, вводимым нашим скриптом, избавит нас от возможных конфликтов с пространством имен man:rc.subr[8]. Как правило, скрипты [.filename]#rc.d# базовой системы не должны предоставлять значения по умолчанию для своих переменных man:rc.conf[5], поскольку значения по умолчанию должны быть установлены в [.filename]#/etc/defaults/rc.conf#. С другой стороны, скрипты [.filename]#rc.d# для портов должны предоставлять значения по умолчанию, как показано в примере. ==== ➎ Здесь мы используем `dummy_msg` для фактического управления нашим скриптом, т.е., для выдачи переменного сообщения. Использование shell-функции здесь избыточно, так как она выполняет только одну команду; равнозначной альтернативой является: [.programlisting] .... start_cmd="echo \"$dummy_msg\"" .... [[rcng-daemon]] == Запуск и остановка простого демона Мы ранее говорили, что man:rc.subr[8] может предоставлять методы по умолчанию. Очевидно, что такие методы не могут быть слишком общими. Они подходят для стандартного случая запуска и остановки простого демона. Предположим, что нам нужно написать скрипт [.filename]#rc.d# для такого демона с именем `mumbled`. Вот он: [.programlisting] .... #!/bin/sh . /etc/rc.subr name=mumbled rcvar=mumbled_enable command="/usr/sbin/${name}" <.> load_rc_config $name run_rc_command "$1" .... Приятно просто, не так ли? Давайте рассмотрим наш небольшой скрипт. Единственное новое, на что стоит обратить внимание, это следующее: ➊ Переменная `command` имеет значение для man:rc.subr[8]. Если она установлена, man:rc.subr[8] будет действовать по сценарию обслуживания обычного демона. В частности, будут предоставлены стандартные методы для таких аргументов: `start`, `stop`, `restart`, `poll` и `status`. Демон будет запущен выполнением `$command` с флагами командной строки, указанными в `$mumbled_flags`. Таким образом, все входные данные для метода `start` по умолчанию доступны в переменных, установленных нашим скриптом. В отличие от `start`, другие методы могут требовать дополнительной информации о запущенном процессе. Например, `stop` должен знать PID процесса, чтобы завершить его. В данном случае, man:rc.subr[8] будет просматривать список всех процессов, ища процесс с именем, равным `procname`. Последний является ещё одной значимой переменной для man:rc.subr[8], и её значение по умолчанию совпадает со значением `command`. Другими словами, когда мы устанавливаем `command`, `procname` фактически устанавливается в то же значение. Это позволяет нашему скрипту завершить демон и проверить, запущен ли он вообще. [NOTE] ==== Некоторые программы на самом деле являются исполняемыми скриптами. Система запускает такие скрипты, запуская их интерпретатор и передавая ему имя скрипта в качестве аргумента командной строки. Это отражается в списке процессов, что может сбить с толку man:rc.subr[8]. Дополнительно следует установить `command_interpreter`, чтобы man:rc.subr[8] знал фактическое имя процесса, если `$command` является скриптом. Для каждого скрипта [.filename]#rc.d# существует необязательная переменная man:rc.conf[5], которая имеет приоритет над `command`. Её имя формируется следующим образом: `${name}_program`, где `name` — это обязательная переменная, которую мы обсуждали crossref:rc-scripting[name-var, ранее]. Например, в данном случае это будет `mumbled_program`. Именно man:rc.subr[8] обеспечивает переопределение `command` с помощью `${name}_program`. Конечно, man:sh[1] позволяет установить `${name}_program` из man:rc.conf[5] или самого скрипта, даже если `command` не задан. В этом случае специальные свойства `${name}_program` теряются, и она становится обычной переменной, которую ваш скрипт может использовать для своих целей. Однако использование `${name}_program` в одиночку не рекомендуется, так как совместное использование с `command` стало идиомой в [.filename]#rc.d# скриптах. ==== Для получения более подробной информации о стандартных методах обратитесь к man:rc.subr[8]. [[rcng-daemon-adv]] == Запуск и остановка продвинутого демона Добавим немного мяса к костям предыдущего скрипта и сделаем его более сложным и функциональным. Стандартные методы могут хорошо справляться с задачами, но иногда требуется их тонкая настройка. Теперь мы узнаем, как адаптировать стандартные методы под наши нужды. [.programlisting] .... #!/bin/sh . /etc/rc.subr name=mumbled rcvar=mumbled_enable command="/usr/sbin/${name}" command_args="mock arguments > /dev/null 2>&1" <.> pidfile="/var/run/${name}.pid" <.> required_files="/etc/${name}.conf /usr/share/misc/${name}.rules" <.> sig_reload="USR1" <.> start_precmd="${name}_prestart" <.> stop_postcmd="echo Bye-bye" <.> extra_commands="reload plugh xyzzy" <.> plugh_cmd="mumbled_plugh" <.> xyzzy_cmd="echo 'Nothing happens.'" mumbled_prestart() { if checkyesno mumbled_smart; then <.> rc_flags="-o smart ${rc_flags}" <.> fi case "$mumbled_mode" in foo) rc_flags="-frotz ${rc_flags}" ;; bar) rc_flags="-baz ${rc_flags}" ;; *) warn "Invalid value for mumbled_mode" <.> return 1 <.> ;; esac run_rc_command xyzzy <.> return 0 } mumbled_plugh() <.> { echo 'A hollow voice says "plugh".' } load_rc_config $name run_rc_command "$1" .... ➊ Дополнительные аргументы для `$command` могут быть переданы в `command_args`. Они будут добавлены в командную строку после `$mumbled_flags`. Поскольку итоговая командная строка передаётся в `eval` для фактического выполнения, перенаправления ввода и вывода могут быть указаны в `command_args`. [NOTE] ==== Никогда не включайте параметры с дефисами, такие как `-X` или `--foo`, в `command_args`. Содержимое `command_args` будет добавлено в конец итоговой командной строки, поэтому, скорее всего, окажется после аргументов, указанных в `${name}_flags`; однако большинство команд не распознают параметры с дефисами после обычных аргументов. Лучший способ передать дополнительные параметры в `$command` — добавить их в начало `${name}_flags`. Другой способ — изменить `rc_flags` crossref:rc-scripting[rc-flags, как показано далее]. ==== ➋ Вежливый демон должен создавать _pidfile_, чтобы его процесс можно было найти проще и надежнее. Переменная `pidfile`, если она установлена, указывает man:rc.subr[8], где можно найти pidfile для использования его стандартными методами. [NOTE] ==== На самом деле, man:rc.subr[8] также использует pidfile для проверки, запущен ли демон, перед его запуском. Эту проверку можно пропустить, используя аргумент `faststart`. ==== ➌ Если демон не может работать без определённых файлов, просто укажите их в `required_files`, и man:rc.subr[8] проверит их наличие перед запуском демона. Также существуют `required_dirs` и `required_vars` для каталогов и переменных окружения соответственно. Все они подробно описаны в man:rc.subr[8]. [NOTE] ==== Метод по умолчанию из man:rc.subr[8] можно принудительно заставить пропустить проверки предварительных условий, используя аргумент `forcestart` в скрипте. ==== ➍ Мы можем настроить сигналы, отправляемые демону, если они отличаются от общеизвестных. В частности, `sig_reload` указывает сигнал, который заставляет демона перезагрузить свою конфигурацию; по умолчанию это SIGHUP. Другой сигнал отправляется для остановки процесса демона; по умолчанию используется SIGTERM, но это можно изменить, установив `sig_stop` соответствующим образом. [NOTE] ==== Имена сигналов должны указываться для man:rc.subr[8] без префикса `SIG`, как показано в примере. Версия man:kill[1] в FreeBSD может распознавать префикс `SIG`, но версии из других типов ОС могут не поддерживать его. ==== ➎➏ Выполнение дополнительных задач до или после стандартных методов — это просто. Для каждого аргумента команды, поддерживаемого нашим скриптом, мы можем определить `argument_precmd` и `argument_postcmd`. Эти команды man:sh[1] вызываются до и после соответствующего метода, что очевидно из их названий. [NOTE] ==== Переопределение стандартного метода с помощью пользовательского `argument_cmd` всё равно не мешает нам использовать `argument_precmd` или `argument_postcmd`, если это необходимо. В частности, первый полезен для проверки пользовательских сложных условий, которые должны быть выполнены перед выполнением самой команды. Использование `argument_precmd` вместе с `argument_cmd` позволяет логически разделить проверки от действия. Не забывайте, что вы можете вставлять любые допустимые выражения из man:sh[1] в определяемые вами методы, а также команды pre- и post-. Просто вызывать функцию, которая выполняет основную работу, — это хороший стиль в большинстве случаев, но никогда не позволяйте стилю ограничивать ваше понимание того, что происходит за кулисами. ==== ➐ Если мы хотим реализовать пользовательские аргументы, которые также можно рассматривать как _команды_ для нашего скрипта, необходимо перечислить их в `extra_commands` и предоставить методы для их обработки. [NOTE] ==== Команда `reload` является особенной. С одной стороны, у неё есть предустановленный метод в man:rc.subr[8]. С другой стороны, `reload` не предлагается по умолчанию. Причина в том, что не все демоны используют одинаковый механизм перезагрузки, а у некоторых вообще нет ничего для перезагрузки. Поэтому нам нужно явно запросить предоставление встроенной функциональности. Это можно сделать с помощью `extra_commands`. Что мы получаем от метода по умолчанию для `reload`? Довольно часто демоны перезагружают свою конфигурацию при получении сигнала — обычно, SIGHUP. Поэтому man:rc.subr[8] пытается перезагрузить демона, отправляя ему сигнал. Сигнал предустановлен на SIGHUP, но может быть изменён через `sig_reload` при необходимости. ==== ➑⓮ Наш скрипт поддерживает две нестандартные команды: `plugh` и `xyzzy`. Мы видели их в списке `extra_commands`, и теперь пришло время реализовать методы для них. Метод для `xyzzy` просто встроен в код, а для `plugh` он реализован как функция `mumbled_plugh`. Нестандартные команды не вызываются во время запуска или завершения работы. Обычно они предназначены для удобства системного администратора. Они также могут использоваться другими подсистемами, например, man:devd[8], если указаны в man:devd.conf[5]. Полный список доступных команд можно найти в строке использования, выводимой man:rc.subr[8], когда скрипт вызывается без аргументов. Например, вот строка использования из изучаемого скрипта: [source, shell] .... # /etc/rc.d/mumbled Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll) .... ⓭ Скрипт может вызывать свои собственные стандартные или нестандартные команды, если это необходимо. Это может выглядеть похоже на вызов функций, но мы знаем, что команды и функции оболочки не всегда одно и то же. Например, `xyzzy` не реализован как функция в данном случае. Кроме того, могут существовать пред-команда и пост-команда, которые должны вызываться в определённом порядке. Поэтому правильный способ для скрипта выполнить свою собственную команду — с помощью man:rc.subr[8], как показано в примере. ➒ Полезная функция `checkyesno` предоставляется man:rc.subr[8]. Она принимает имя переменной в качестве аргумента и возвращает нулевой код выхода только если переменная установлена в `YES`, `TRUE`, `ON` или `1`, без учёта регистра; в противном случае возвращается ненулевой код выхода. В последнем случае функция проверяет, установлена ли переменная в `NO`, `FALSE`, `OFF` или `0`, также без учёта регистра; если переменная содержит что-то иное (т.е. мусор), функция выводит предупреждение. Имейте в виду, что для man:sh[1] нулевой код возврата означает истину, а ненулевой код возврата означает ложь. [IMPORTANT] ==== Функция `checkyesno` принимает __имя переменной__. Не передавайте ей _значение_ переменной; это не будет работать, как ожидается. Ниже приведено правильное использование `checkyesno`: [.programlisting] .... if checkyesno mumbled_enable; then foo fi .... Напротив, вызов `checkyesno`, как показано ниже, не сработает — по крайней мере, не так, как ожидается: [.programlisting] .... if checkyesno "${mumbled_enable}"; then foo fi .... ==== ➓ [[rc-flags]] Мы можем влиять на флаги, передаваемые команде `$command`, изменяя `rc_flags` в `$start_precmd`. ⓫ В некоторых случаях может потребоваться вывести важное сообщение, которое также должно попасть в `syslog`. Это можно легко сделать с помощью следующих функций man:rc.subr[8]: `debug`, `info`, `warn` и `err`. Последняя функция завершает выполнение скрипта с указанным кодом. ⓬ Коды выхода из методов и их предварительных команд не просто игнорируются по умолчанию. Если `argument_precmd` возвращает ненулевой код выхода, основной метод не будет выполнен. В свою очередь, `argument_postcmd` не будет вызван, если основной метод возвращает ненулевой код выхода. [NOTE] ==== Однако man:rc.subr[8] можно указать из командной строки игнорировать эти коды завершения и выполнять все команды в любом случае, добавив префикс `force` к аргументу, например `forcestart`. ==== [[rcng-hookup]] == Подключение скрипта к инфраструктуре rc.d -После написания скрипта его необходимо интегрировать в [.filename]#rc.d#. Ключевой шаг — установка скрипта в [.filename]#/etc/rc.d# (для базовой системы) или [.filename]#/usr/local/etc/rc.d# (для портов). И [.filename]#bsd.prog.mk#, и [.filename]#bsd.port.mk# предоставляют удобные механизмы для этого, и обычно вам не нужно беспокоиться о правильных правах доступа и режиме. Системные скрипты должны устанавливаться из [.filename]#src/libexec/rc/rc.d# через [.filename]#Makefile#, находящийся там. Скрипты портов можно установить с помощью `USE_RC_SUBR`, как описано extref:{porters-handbook}special/[в Руководстве FreeBSD по созданию портов, rc-скрипты]. +После написания скрипта его необходимо интегрировать в [.filename]#rc.d#. Ключевой шаг — установка скрипта в [.filename]#/etc/rc.d# (для базовой системы) или [.filename]#/usr/local/etc/rc.d# (для портов). И [.filename]#bsd.prog.mk#, и [.filename]#bsd.port.mk# предоставляют удобные механизмы для этого, и обычно вам не нужно беспокоиться о правильных правах доступа и режиме. Системные скрипты должны устанавливаться из [.filename]#src/libexec/rc/rc.d# через [.filename]#Makefile#, находящийся там. Скрипты портов можно установить с помощью `USE_RC_SUBR`, как описано extref:{porters-handbook}special[в Руководстве FreeBSD по созданию портов, rc-скрипты]. Однако следует заранее продумать место нашего скрипта в последовательности запуска системы. Скорее всего, обслуживаемый нашим скриптом сервис зависит от других сервисов. Например, сетевой демон не может работать без поднятых сетевых интерфейсов и маршрутизации. Даже если сервис, казалось бы, ничего не требует, он вряд ли сможет запуститься до проверки и монтирования основных файловых систем. Мы уже упоминали man:rcorder[8]. Теперь пришло время рассмотреть его подробнее. В двух словах, man:rcorder[8] принимает набор файлов, анализирует их содержимое и выводит на `stdout` список этих файлов, упорядоченный по зависимостям. Главная идея заключается в том, чтобы хранить информацию о зависимостях _внутри_ файлов, чтобы каждый файл мог описывать только себя. Файл может содержать следующую информацию: * имена "условий" (что для нас означает сервисы), которые он __предоставляет__; * имена "условий", которые он __требует__; * имена "условий", перед которыми должен выполняться этот файл; * дополнительные _ключевые слова_, которые могут использоваться для выбора подмножества из всего набора файлов (man:rcorder[8] может быть настроен с помощью опций для включения или исключения файлов, содержащих указанные ключевые слова.) Неудивительно, что man:rcorder[8] может обрабатывать только текстовые файлы с синтаксисом, близким к man:sh[1]. То есть специальные строки, понимаемые man:rcorder[8], выглядят как комментарии в man:sh[1]. Синтаксис таких специальных строк довольно жёсткий, чтобы упростить их обработку. Подробности см. в man:rcorder[8]. Помимо использования специальных строк man:rcorder[8], скрипт может настаивать на своей зависимости от другой службы, просто принудительно запуская её. Это может быть необходимо, когда другая служба является опциональной и не запускается самостоятельно, потому что системный администратор ошибочно отключил её в man:rc.conf[5]. С учетом этих общих знаний рассмотрим простой скрипт демона, дополненный зависимостями: [.programlisting] .... #!/bin/sh # PROVIDE: mumbled oldmumble <.> # REQUIRE: DAEMON cleanvar frotz <.> # BEFORE: LOGIN <.> # KEYWORD: nojail shutdown <.> . /etc/rc.subr name=mumbled rcvar=mumbled_enable command="/usr/sbin/${name}" start_precmd="${name}_prestart" mumbled_prestart() { if ! checkyesno frotz_enable && \ ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then force_depend frotz || return 1 <.> fi return 0 } load_rc_config $name run_rc_command "$1" .... Как и ранее, следует детальный анализ: ➊ Эта строка объявляет названия "условий", которые предоставляет наш скрипт. Теперь другие скрипты могут указывать зависимость от нашего скрипта по этим именам. [NOTE] ==== Обычно скрипт указывает одно предоставленное условие. Однако ничто не мешает нам перечислить несколько условий, например, по причинам совместимости. В любом случае, название основного или единственного условия `PROVIDE:` должно совпадать с `${name}`. ==== ➋➌ Таким образом, наш скрипт указывает, от каких "условий", предоставляемых другими скриптами, он зависит. Согласно строкам, наш скрипт просит man:rcorder[8] разместить его после скрипта(ов), предоставляющих [.filename]#DAEMON# и [.filename]#cleanvar#, но перед тем, который предоставляет [.filename]#LOGIN#. [NOTE] ==== Строку `BEFORE:` не следует использовать для обхода неполного списка зависимостей в другом скрипте. Правильный случай для использования `BEFORE:` — когда другой скрипт не зависит от нашего, но наш скрипт может выполнить свою задачу лучше, если запустится до другого. Типичный пример из реальной жизни — сетевые интерфейсы и межсетевой экран: хотя интерфейсы не зависят от межсетевого экрана при выполнении своей работы, безопасность системы выиграет, если межсетевой экран будет готов до начала сетевого трафика. Помимо условий, соответствующих отдельным службам, существуют метаусловия и их "заглушки" скриптов, используемые для обеспечения выполнения определённых групп операций в заданном порядке. Они обозначаются именами в [.filename]#ВЕРХНЕМ РЕГИСТРЕ#. Их список и назначение можно найти в man:rc[8]. Имейте в виду, что указание имени службы в строке `REQUIRE:` не гарантирует, что служба действительно будет запущена к моменту старта нашего скрипта. Требуемая служба может не запуститься или быть отключена в man:rc.conf[5]. Очевидно, man:rcorder[8] не может отслеживать такие детали, и man:rc[8] тоже этого не делает. Следовательно, приложение, запускаемое нашим скриптом, должно быть способно обрабатывать ситуации, когда требуемые службы недоступны. В некоторых случаях мы можем помочь ему, как описано в crossref:rc-scripting[forcedep, ниже] ==== [[keywords]]➍ Как мы помним из текста выше, ключевые слова man:rcorder[8] могут использоваться для выбора или исключения некоторых скриптов. А именно, любой потребитель man:rcorder[8] может указать с помощью опций `-k` и `-s`, какие ключевые слова находятся в "списке сохранения" и "списке пропуска" соответственно. Из всех файлов, подлежащих сортировке по зависимостям, man:rcorder[8] выберет только те, которые имеют ключевое слово из списка сохранения (если он не пуст) и не имеют ключевого слова из списка пропуска. В FreeBSD, man:rcorder[8] используется [.filename]#/etc/rc# и [.filename]#/etc/rc.shutdown#. Эти два скрипта определяют стандартный список ключевых слов [.filename]#rc.d# FreeBSD и их значения следующим образом: nojail:: Сервис не предназначен для окружения man:jail[8]. Процедуры автоматического запуска и остановки будут игнорировать скрипт, если он находится внутри клетки. nostart:: Служба должна запускаться вручную или не запускаться вовсе. Процедура автоматического запуска проигнорирует скрипт. В сочетании с ключевым словом [.filename]#shutdown# это может использоваться для написания скриптов, выполняющих действия только при выключении системы. shutdown:: Этот ключевой параметр должен быть указан __явно__, если службу необходимо остановить перед завершением работы системы. [NOTE] ==== Когда система собирается завершить работу, выполняется [.filename]#/etc/rc.shutdown#. Предполагается, что большинству скриптов [.filename]#rc.d# в этот момент нечего делать. Поэтому [.filename]#/etc/rc.shutdown# выборочно запускает скрипты [.filename]#rc.d# с ключевым словом [.filename]#shutdown#, фактически игнорируя остальные скрипты. Для ещё более быстрого завершения работы [.filename]#/etc/rc.shutdown# передаёт команду [.filename]#faststop# запускаемым скриптам, чтобы они пропускали предварительные проверки, например, проверку pid-файла. Поскольку зависимые службы должны быть остановлены до своих зависимостей, [.filename]#/etc/rc.shutdown# запускает скрипты в обратном порядке зависимостей. Если вы пишете настоящий скрипт [.filename]#rc.d#, стоит подумать, актуален ли он во время завершения работы системы. Например, если ваш скрипт выполняет свою работу только в ответ на команду [.filename]#start#, то включать это ключевое слово не нужно. Однако если ваш скрипт управляет службой, вероятно, стоит остановить её до того, как система перейдёт к финальной стадии завершения работы, описанной в man:halt[8]. В частности, службу следует останавливать явно, если для её корректного завершения требуется значительное время или специальные действия. Типичный пример такой службы — система управления базами данных. ==== [[forcedep]]➎ Прежде всего, `force_depend` следует использовать с большой осторожностью. Обычно лучше пересмотреть иерархию конфигурационных переменных для ваших [.filename]#rc.d# скриптов, если они взаимозависимы. Если вам всё ещё не обойтись без `force_depend`, в примере показано, как вызвать его условно. В примере наш демон `mumbled` требует, чтобы другой демон, `frotz`, был запущен заранее. Однако `frotz` также является опциональным, и man:rcorder[8] ничего не знает о таких деталях. К счастью, наш скрипт имеет доступ ко всем переменным man:rc.conf[5]. Если `frotz_enable` имеет значение true, мы надеемся на лучшее и полагаемся на [.filename]#rc.d#, что `frotz` был запущен. В противном случае мы принудительно проверяем статус `frotz`. Наконец, мы принудительно устанавливаем зависимость от `frotz`, если обнаруживаем, что он не запущен. `force_depend` выдаст предупреждение, так как его следует вызывать только в случае обнаружения неправильной конфигурации. [[rcng-args]] == Придание большей гибкости скрипту rc.d При вызове во время запуска или завершения работы скрипт [.filename]#rc.d# должен воздействовать на всю подсистему, за которую он отвечает. Например, [.filename]#/etc/rc.d/netif# должен запускать или останавливать все сетевые интерфейсы, описанные в man:rc.conf[5]. Любая из этих задач может быть однозначно указана единственным аргументом команды, таким как `start` или `stop`. Между запуском и завершением работы скрипты [.filename]#rc.d# помогают администратору управлять работающей системой, и именно тогда возникает потребность в большей гибкости и точности. Например, администратор может добавить настройки нового сетевого интерфейса в man:rc.conf[5], а затем запустить его, не затрагивая работу существующих интерфейсов. В следующий раз администратору может потребоваться остановить отдельный сетевой интерфейс. В духе командной строки, соответствующий скрипт [.filename]#rc.d# требует дополнительного аргумента — имени интерфейса. К счастью, man:rc.subr[8] позволяет передавать любое количество аргументов (в пределах системных ограничений) методам скрипта. Благодаря этому изменения в самом скрипте могут быть минимальными. Как man:rc.subr[8] может получить доступ к дополнительным аргументам командной строки. Должен ли он просто захватывать их напрямую? Ни в коем случае. Во-первых, функция man:sh[1] не имеет доступа к позиционным параметрам своего вызывающего объекта, но man:rc.subr[8] — это просто набор таких функций. Во-вторых, хороший стиль [.filename]#rc.d# предписывает, что именно главный скрипт должен решать, какие аргументы передавать его методам. Итак, подход, принятый в man:rc.subr[8], следующий: `run_rc_command` передаёт все свои аргументы, кроме первого, в соответствующий метод в неизменном виде. Первый, опущенный аргумент — это имя самого метода: `start`, `stop` и т.д. Он будет удалён с помощью `shift` в `run_rc_command`, так что то, что было `$2` в оригинальной командной строке, будет представлено как `$1` в методе, и так далее. Чтобы проиллюстрировать эту возможность, давайте изменим примитивный скрипт-заглушку так, чтобы его сообщения зависели от дополнительных переданных аргументов. Вот как это выглядит: [.programlisting] .... #!/bin/sh . /etc/rc.subr name="dummy" start_cmd="${name}_start" stop_cmd=":" kiss_cmd="${name}_kiss" extra_commands="kiss" dummy_start() { if [ $# -gt 0 ]; then <.> echo "Greeting message: $*" else echo "Nothing started." fi } dummy_kiss() { echo -n "A ghost gives you a kiss" if [ $# -gt 0 ]; then <.> echo -n " and whispers: $*" fi case "$*" in *[.!?]) echo ;; *) echo . ;; esac } load_rc_config $name run_rc_command "$@" <.> .... Какие основные изменения мы можем заметить в скрипте? ➊ Все аргументы, которые вы вводите после `start`, могут стать позиционными параметрами для соответствующего метода. Мы можем использовать их любым способом в соответствии с нашей задачей, навыками и предпочтениями. В текущем примере мы просто передаем все их в man:echo[1] как одну строку в следующей строке — обратите внимание на `$*` в двойных кавычках. Вот как теперь можно вызывать этот скрипт: [source, shell] .... # /etc/rc.d/dummy start Nothing started. # /etc/rc.d/dummy start Hello world! Greeting message: Hello world! .... ➋ То же самое относится к любому методу, который предоставляет наш скрипт, не только к стандартному. Мы добавили пользовательский метод с именем `kiss`, и он может использовать дополнительные аргументы не меньше, чем `start`. Например: [source, shell] .... # /etc/rc.d/dummy kiss A ghost gives you a kiss. # /etc/rc.d/dummy kiss Once I was Etaoin Shrdlu... A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu... .... ➌ Если мы хотим просто передать все дополнительные аргументы любому методу, мы можем просто заменить `"$@"` на `"$1"` в последней строке нашего скрипта, где мы вызываем `run_rc_command`. [IMPORTANT] ==== Программист man:sh[1] должен понимать тонкую разницу между `$*` и `$@` как способами обозначения всех позиционных параметров. Для детального обсуждения обратитесь к хорошему руководству по написанию скриптов на man:sh[1]. _Не используйте_ эти выражения, пока полностью не поймёте их, так как их неправильное применение приведёт к созданию ненадёжных и небезопасных скриптов. ==== [NOTE] ==== В настоящее время в `run_rc_command` может присутствовать ошибка, которая мешает ему сохранять исходные границы между аргументами. То есть аргументы с встроенными пробелами могут обрабатываться некорректно. Ошибка возникает из-за неправильного использования `$*`. ==== [[rcng-service-jails]] == Подготовка скрипта для сервисных клеток Скрипты, запускающие долго работающую службу, подходят для служебных клеток и должны поставляться с соответствующей конфигурацией сервисной клетки. Некоторые примеры скриптов, которые не подходят для запуска в сервисной клетке: * любой скрипт, который в команде start только изменяет настройки времени выполнения для программ или ядра, * или пытается что-то смонтировать, * или находит и удаляет файлы Необходимо предотвратить использование внутри сервисных клеток скриптов, не предназначенных для запуска в сервисной клетке. Скрипт с долго работающей службой, которому необходимо выполнить одно из перечисленных выше действий перед запуском или после остановки, может быть разделён на два скрипта с зависимостями или использовать части `precommand` и `postcommand` скрипта для выполнения этого действия. По умолчанию только части `start` и `stop` скрипта выполняются внутри сервисной клетки, остальное выполняется вне клетки. Таким образом, любые настройки, используемые в частях `start`/`stop` скрипта, не могут быть заданы, например, из `precommand`. -Чтобы сделать скрипт готовым к использованию с extref:../../books/handbook/jails/#service-jails[Сервисными Клетками], необходимо добавить всего одну строку конфигурации: +Чтобы сделать скрипт готовым к использованию с extref:{handbook}jails[Сервисными Клетками, service-jails], необходимо добавить всего одну строку конфигурации: [.programlisting] .... #!/bin/sh . /etc/rc.subr name="dummy" start_cmd="${name}_start" stop_cmd=":" : ${dummy_svcj_options:=""} <.> dummy_start() { echo "Nothing started." } load_rc_config $name run_rc_command "$1" .... ➊ Если имеет смысл, чтобы скрипт выполнялся в клетке, он должен иметь переопределяемую конфигурацию сервисных клеток. Если ему не требуется доступ к сети или любым другим ресурсам, которые ограничены в клетках, достаточно пустой конфигурации, как показано. Строго говоря, пустая конфигурация не обязательна, но она явно указывает, что скрипт готов к работе с сервисными клетками и не требует дополнительных разрешений для клеток. Поэтому настоятельно рекомендуется добавить такую пустую конфигурацию в таком случае. Наиболее распространённая опция — "net_basic", которая позволяет использовать IPv4 и IPv6 адреса хоста. Все возможные опции описаны в man:rc.conf[5]. Если настройка запуска/остановки зависит от переменных из rc-фреймворка (например, заданных в man:rc.conf[5]), это должно обрабатываться с помощью ``load_rc_config`` и ``run_rc_command``, а не внутри precommand. Если по какой-то причине скрипт не может быть запущен внутри сервисной клетки, например, потому что его невозможно запустить или нет смысла запускать его в клетке, используйте следующее: [.programlisting] .... #!/bin/sh . /etc/rc.subr name="dummy" start_cmd="${name}_start" stop_cmd=":" dummy_start() { echo "Nothing started." } load_rc_config $name dummy_svcj="NO" # does not make sense to run in a svcj <.> run_rc_command "$1" .... ➊ Отключение должно происходить после вызова ``load_rc_config``, иначе параметр из man:rc.conf[5] может переопределить его. [[rcng-instancing]] == Продвинутые сценарии rc: запуск нескольких экземпляров Иногда полезно запускать несколько экземпляров службы. Обычно требуется иметь возможность независимо запускать/останавливать такие экземпляры, а также иметь отдельный файл конфигурации для каждого из них. Каждый экземпляр должен запускаться при загрузке, после обновления каждый экземпляр должен оставаться, и при этом должен обновиться. Вот пример rc-скрипта, который поддерживает это: [.programlisting] .... #!/bin/sh # # PROVIDE: dummy # REQUIRE: NETWORKING SERVERS # KEYWORD: shutdown # # Add these following line to /etc/rc.conf.local or /etc/rc.conf # to enable this service: # # dummy_enable (bool): Set it to YES to enable dummy on startup. # Default: NO # dummy_user (string): User account to run with. # Default: www # . /etc/rc.subr case $0 in <.> /etc/rc*) # during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown), # so get the name of the script from $_file name=$_file ;; *) name=$0 ;; esac name=${name##*/} <.> rcvar="${name}_enable" <.> desc="Short description of this service" command="/usr/local/sbin/dummy" load_rc_config "$name" eval "${rcvar}=\${${rcvar}:-'NO'}" <.> eval "${name}_svcj_options=\${${name}_svcj_options:-'net_basic'}" <.> eval "_dummy_user=\${${name}_user:-'www'}" <.> _dummy_configname=/usr/local/etc/${name}.cfg <.> pidfile=/var/run/dummy/${name}.pid required_files ${_dummy_configname} command_args="-u ${_dummy_user} -c ${_dummy_configfile} -p ${pidfile}" run_rc_command "$1" .... ➊ и ➋ убедитесь, что переменная name установлена в значение man:basename[1] имени скрипта. Если имя файла — [.filename]#/usr/local/etc/rc.d/dummy#, то name будет установлено в [.filename]#dummy#. Таким образом, изменение имени rc-скрипта автоматически изменит содержимое переменной name. ➌ указывает имя переменной, которая используется в [.filename]#rc.conf# для включения этой службы на основе имени файла этого скрипта. В данном примере это преобразуется в dummy_enable. ➍ убеждается, что значение по умолчанию для переменной _enable установлено в NO. ➎ Вот пример установки некоторых значений по умолчанию для переменных фреймворка, специфичных для службы, в данном случае — опций клетки службы. ➏ и ➐ устанавливают переменные, внутренние для скрипта (обратите внимание на подчёркивание в начале _dummy_user, чтобы отличать её от dummy_user, которая может быть задана в [.filename]#rc.conf#). Часть в ➎ предназначена для переменных, которые не используются внутри самого скрипта, но используются в рамках rc. Все переменные, которые используются как параметры в скрипте, присваиваются общей переменной, как в ➐, чтобы упростить их использование (нет необходимости выполнять eval при каждом обращении). Этот скрипт теперь будет вести себя по-другому, если скрипт запуска имеет другое имя. Это позволяет создавать символьные ссылки на него: [source, shell] .... # ln -s dummy /usr/local/etc/rc.d/dummy_foo # sysrc dummy_foo_enable=YES # service dummy_foo start .... Вышеприведенное создает экземпляр службы dummy с именем dummy_foo. Он использует не файл конфигурации [.filename]#/usr/local/etc/dummy.cfg#, а файл конфигурации [.filename]#/usr/local/etc/dummy_foo.cfg# (➐), и использует PID-файл [.filename]#/var/run/dummy/dummy_foo.pid# вместо [.filename]#/var/run/dummy/dummy.pid#. Сервисы dummy и dummy_foo могут управляться независимо друг от друга, при этом скрипт запуска обновляется автоматически при обновлении пакета (благодаря символьной ссылке). Это не обновляет строку REQUIRE, поэтому нет простого способа зависеть от конкретного экземпляра. Чтобы зависеть от конкретного экземпляра в порядке запуска, необходимо создать копию вместо использования символьной ссылки. Это предотвращает автоматическое применение изменений в скрипте запуска при установке обновления. [[rcng-furthur]] == Дополнительная литература [[lukem]]http://www.mewburn.net/luke/papers/rc.d.pdf[Оригинальная статья Люка Мьюберна] предлагает общий обзор [.filename]#rc.d# и подробное обоснование принятых при его проектировании решений. В ней представлено понимание всего фреймворка [.filename]#rc.d# и его места в современной BSD-системе. [[manpages]]Руководства man:rc[8], man:rc.subr[8] и man:rcorder[8] подробно описывают компоненты [.filename]#rc.d#. Без изучения этих руководств и обращения к ним при написании собственных скриптов невозможно в полной мере использовать возможности [.filename]#rc.d#. Основным источником рабочих, жизненных примеров является [.filename]#/etc/rc.d# в работающей системе. Его содержимое легко и приятно читать, поскольку большинство сложных моментов скрыто глубоко в man:rc.subr[8]. Однако помните, что скрипты в [.filename]#/etc/rc.d# были написаны не ангелами, поэтому они могут содержать ошибки и неоптимальные решения. Теперь вы можете их улучшить! diff --git a/documentation/content/ru/articles/rc-scripting/_index.po b/documentation/content/ru/articles/rc-scripting/_index.po index 38632d1c84..9acee005a7 100644 --- a/documentation/content/ru/articles/rc-scripting/_index.po +++ b/documentation/content/ru/articles/rc-scripting/_index.po @@ -1,2770 +1,2766 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2024-09-14 15:00-0300\n" -"PO-Revision-Date: 2025-10-29 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/rc-scripting/_index.adoc:1 #, no-wrap msgid "A guide to writing new rc.d scripts and understanding those already written" -msgstr "" -"Руководство по написанию новых rc.d-скриптов и пониманию уже существующих" +msgstr "Руководство по написанию новых rc.d-скриптов и пониманию уже существующих" #. type: Title = #: documentation/content/en/articles/rc-scripting/_index.adoc:1 #: documentation/content/en/articles/rc-scripting/_index.adoc:12 #, no-wrap msgid "Practical rc.d scripting in BSD" msgstr "Практическое руководство по написанию rc.d скриптов в BSD" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:45 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:49 msgid "" "Beginners may find it difficult to relate the facts from the formal " "documentation on the BSD [.filename]#rc.d# framework with the practical " "tasks of [.filename]#rc.d# scripting. In this article, we consider a few " "typical cases of increasing complexity, show [.filename]#rc.d# features " "suited for each case, and discuss how they work. Such an examination should " "provide reference points for further study of the design and efficient " "application of [.filename]#rc.d#." msgstr "" "Новичкам может быть сложно соотнести факты из официальной документации по " "фреймворку [.filename]#rc.d# в BSD с практическими задачами написания " "скриптов для [.filename]#rc.d#. В этой статье мы рассмотрим несколько " "типичных случаев возрастающей сложности, покажем возможности [.filename]#rc." "d#, подходящие для каждого случая, и обсудим, как они работают. Такое " "рассмотрение должно дать ориентиры для дальнейшего изучения устройства и " "эффективного применения [.filename]#rc.d#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:51 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:55 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:61 msgid "" "The historical BSD had a monolithic startup script, [.filename]#/etc/rc#. " "It was invoked by man:init[8] at system boot time and performed all userland " "tasks required for multi-user operation: checking and mounting file systems, " "setting up the network, starting daemons, and so on. The precise list of " "tasks was not the same in every system; admins needed to customize it. With " "few exceptions, [.filename]#/etc/rc# had to be modified, and true hackers " "liked it." msgstr "" "Исторически в BSD был монолитный стартовый сценарий [.filename]#/etc/rc#. Он " "вызывался man:init[8] во время загрузки системы и выполнял все задачи " "пользовательского пространства, необходимые для многопользовательского " "режима: проверку и монтирование файловых систем, настройку сети, запуск " "демонов и так далее. Точный список задач не был одинаковым в каждой системе; " "администраторам требовалось его настраивать. За редкими исключениями, [." "filename]#/etc/rc# приходилось изменять, и настоящим хакерам это нравилось." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:67 msgid "" "The real problem with the monolithic approach was that it provided no " "control over the individual components started from [.filename]#/etc/rc#. " "For instance, [.filename]#/etc/rc# could not restart a single daemon. The " "system admin had to find the daemon process by hand, kill it, wait until it " "actually exited, then browse through [.filename]#/etc/rc# for the flags, and " "finally type the full command line to start the daemon again. The task " "would become even more difficult and prone to errors if the service to " "restart consisted of more than one daemon or demanded additional actions. " "In a few words, the single script failed to fulfil what scripts are for: to " "make the system admin's life easier." msgstr "" "Основная проблема монолитного подхода заключалась в том, что он не " "предоставлял контроля над отдельными компонентами, запускаемыми из [." "filename]#/etc/rc#. Например, [.filename]#/etc/rc# не мог перезапустить " "отдельный демон. Администратору системы приходилось вручную находить процесс " "демона, завершать его, ждать, пока он действительно завершится, затем искать " "в [.filename]#/etc/rc# нужные флаги и, наконец, вводить полную командную " "строку для повторного запуска демона. Задача становилась ещё сложнее и более " "подверженной ошибкам, если служба состояла из нескольких демонов или " "требовала дополнительных действий. Одним словом, единый скрипт не справлялся " "с тем, для чего скрипты вообще предназначены: облегчать жизнь администратору " "системы." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:74 msgid "" "Later there was an attempt to split out some parts of [.filename]#/etc/rc# " "for the sake of starting the most important subsystems separately. The " "notorious example was [.filename]#/etc/netstart# to bring up networking. It " "did allow for accessing the network from single-user mode, but it did not " "integrate well into the automatic startup process because parts of its code " "needed to interleave with actions essentially unrelated to networking. That " "was why [.filename]#/etc/netstart# mutated into [.filename]#/etc/rc." "network#. The latter was no longer an ordinary script; it comprised of " "large, tangled man:sh[1] functions called from [.filename]#/etc/rc# at " "different stages of system startup. However, as the startup tasks grew " "diverse and sophisticated, the \"quasi-modular\" approach became even more " "of a drag than the monolithic [.filename]#/etc/rc# had been." msgstr "" -"Позже была предпринята попытка разделить некоторые части [.filename]#/etc/rc#" -" для возможности отдельного запуска наиболее важных подсистем. Известным " +"Позже была предпринята попытка разделить некоторые части [.filename]#/etc/" +"rc# для возможности отдельного запуска наиболее важных подсистем. Известным " "примером стал [.filename]#/etc/netstart#, предназначенный для настройки " "сети. Это позволяло получить доступ к сети в однопользовательском режиме, но " "плохо интегрировалось в автоматический процесс запуска, так как части его " "кода требовалось переплетаться с действиями, по сути не связанными с сетью. " "Именно поэтому [.filename]#/etc/netstart# превратился в [.filename]#/etc/rc." "network#. Последний больше не был обычным скриптом; он состоял из больших, " "запутанных функций man:sh[1], вызываемых из [.filename]#/etc/rc# на разных " "этапах загрузки системы. Однако по мере того, как задачи при запуске " "становились разнообразнее и сложнее, \"квазимодульный\" подход стал ещё " "большей обузой, чем монолитный [.filename]#/etc/rc#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:82 msgid "" "Without a clean and well-designed framework, the startup scripts had to bend " "over backwards to satisfy the needs of rapidly developing BSD-based " "operating systems. It became obvious at last that more steps are necessary " "on the way to a fine-grained and extensible [.filename]#rc# system. Thus " "BSD [.filename]#rc.d# was born. Its acknowledged fathers were Luke Mewburn " "and the NetBSD community. Later it was imported into FreeBSD. Its name " "refers to the location of system scripts for individual services, which is " "in [.filename]#/etc/rc.d#. Soon we will learn about more components of the " "[.filename]#rc.d# system and see how the individual scripts are invoked." msgstr "" "Без чистого и хорошо продуманного каркаса, стартовые скрипты вынуждены были " "идти на всевозможные ухищрения, чтобы удовлетворить потребности быстро " "развивающихся BSD-ориентированных операционных систем. В конце концов стало " "очевидно, что необходимы дополнительные шаги на пути к детализированной и " "расширяемой системе [.filename]#rc#. Так появилась BSD [.filename]#rc.d#. Её " "признанными создателями стали Люк Мьюберн и сообщество NetBSD. Позже она " "была импортирована в FreeBSD. Её название отсылает к расположению системных " "скриптов для отдельных служб, которое находится в [.filename]#/etc/rc.d#. " "Вскоре мы узнаем больше о компонентах системы [.filename]#rc.d# и увидим, " "как вызываются отдельные скрипты." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:93 msgid "" "The basic ideas behind BSD [.filename]#rc.d# are _fine modularity_ and " "__code reuse__. _Fine modularity_ means that each basic \"service\" such as " "a system daemon or primitive startup task gets its own man:sh[1] script able " "to start the service, stop it, reload it, check its status. A particular " "action is chosen by the command-line argument to the script. The [." "filename]#/etc/rc# script still drives system startup, but now it merely " "invokes the smaller scripts one by one with the `start` argument. It is " "easy to perform shutdown tasks as well by running the same set of scripts " "with the `stop` argument, which is done by [.filename]#/etc/rc.shutdown#. " "Note how closely this follows the Unix way of having a set of small " "specialized tools, each fulfilling its task as well as possible. _Code " "reuse_ means that common operations are implemented as man:sh[1] functions " "and collected in [.filename]#/etc/rc.subr#. Now a typical script can be " "just a few lines' worth of man:sh[1] code. Finally, an important part of " "the [.filename]#rc.d# framework is man:rcorder[8], which helps [.filename]#/" "etc/rc# to run the small scripts orderly with respect to dependencies " "between them. It can help [.filename]#/etc/rc.shutdown#, too, because the " "proper order for the shutdown sequence is opposite to that of startup." msgstr "" "Основные идеи, лежащие в основе BSD [.filename]#rc.d#, — это _тонкая " "модульность_ и __повторное использование кода__. _Тонкая модульность_ " "означает, что каждая базовая «служба», такая как системный демон или " "примитивная задача запуска, получает собственный сценарий man:sh[1], " "способный запустить службу, остановить её, перезагрузить или проверить её " "состояние. Конкретное действие выбирается аргументом командной строки, " "переданным в сценарий. Сценарий [.filename]#/etc/rc# по-прежнему управляет " "запуском системы, но теперь он просто вызывает небольшие сценарии один за " "другим с аргументом `start`. Также легко выполнять задачи завершения работы, " "запуская тот же набор сценариев с аргументом `stop`, что и делает [." "filename]#/etc/rc.shutdown#. Обратите внимание, насколько это близко следует " "Unix-подходу, где используется набор небольших специализированных " "инструментов, каждый из которых выполняет свою задачу наилучшим образом. " "_Повторное использование кода_ означает, что общие операции реализованы как " "функции man:sh[1] и собраны в [.filename]#/etc/rc.subr#. Теперь типичный " "сценарий может состоять всего из нескольких строк кода man:sh[1]. Наконец, " "важной частью инфраструктуры [.filename]#rc.d# является man:rcorder[8], " "который помогает [.filename]#/etc/rc# упорядоченно запускать небольшие " "сценарии с учётом зависимостей между ними. Он также может помочь [." "filename]#/etc/rc.shutdown#, поскольку правильный порядок завершения работы " "противоположен порядку запуска." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:101 msgid "" "The BSD [.filename]#rc.d# design is described in crossref:rc-" "scripting[lukem, the original article by Luke Mewburn], and the [." "filename]#rc.d# components are documented in great detail in crossref:rc-" "scripting[manpages, the respective manual pages]. However, it might not " "appear obvious to an [.filename]#rc.d# newbie how to tie the numerous bits " "and pieces together to create a well-styled script for a particular task. " "Therefore this article will try a different approach to describe [." "filename]#rc.d#. It will show which features should be used in a number of " "typical cases, and why. Note that this is not a how-to document because our " "aim is not at giving ready-made recipes, but at showing a few easy entrances " "into the [.filename]#rc.d# realm. Neither is this article a replacement for " "the relevant manual pages. Do not hesitate to refer to them for more formal " "and complete documentation while reading this article." msgstr "" "Дизайн BSD [.filename]#rc.d# описан в crossref:rc-scripting[lukem, " "оригинальной статье Люка Мьюберна], а компоненты [.filename]#rc.d# подробно " "документированы в crossref:rc-scripting[manpages, соответствующих страницах " "Справочника]. Однако новичку в [.filename]#rc.d# может быть неочевидно, как " "связать многочисленные элементы вместе, чтобы создать хорошо " "структурированный скрипт для конкретной задачи. Поэтому в этой статье будет " "предпринята попытка описать [.filename]#rc.d# с другого ракурса. В ней будет " "показано, какие функции следует использовать в ряде типичных случаев и " "почему. Обратите внимание, что это не руководство HowTo, поскольку наша цель " "— не предоставление готовых рецептов, а демонстрация нескольких простых " "способов входа в мир [.filename]#rc.d#. Также эта статья не заменяет " "соответствующие страниц Справочника. Не стесняйтесь обращаться к ним для " "получения более формальной и полной документации во время чтения этой статьи." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:105 msgid "" "There are prerequisites to understanding this article. First of all, you " "should be familiar with the man:sh[1] scripting language to master [." "filename]#rc.d#. In addition, you should know how the system performs " "userland startup and shutdown tasks, which is described in man:rc[8]." msgstr "" "Для понимания этой статьи есть предварительные требования. Прежде всего, вы " "должны быть знакомы с языком написания сценариев man:sh[1], чтобы освоить [." "filename]#rc.d#. Кроме того, вы должны знать, как система выполняет задачи " "запуска и завершения работы пользовательского пространства, что описано в " "man:rc[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:108 msgid "" "This article focuses on the FreeBSD branch of [.filename]#rc.d#. " "Nevertheless, it may be useful to NetBSD developers, too, because the two " "branches of BSD [.filename]#rc.d# not only share the same design but also " "stay similar in their aspects visible to script authors." msgstr "" "Эта статья посвящена ветке FreeBSD в [.filename]#rc.d#. Тем не менее, она " "может быть полезна и разработчикам NetBSD, потому что две ветки BSD [." "filename]#rc.d# не только разделяют одинаковый дизайн, но и остаются схожими " "в аспектах, видимых авторам скриптов." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:110 #, no-wrap msgid "Outlining the task" msgstr "Обрисовка задачи" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:114 msgid "" "A little consideration before starting `$EDITOR` will not hurt. To write a " "well-tempered [.filename]#rc.d# script for a system service, we should be " "able to answer the following questions first:" msgstr "" "Немного размышлений перед запуском `$EDITOR` не повредит. Чтобы написать " "хорошо продуманный скрипт [.filename]#rc.d# для системной службы, сначала " "нужно ответить на следующие вопросы:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:116 msgid "Is the service mandatory or optional?" msgstr "Является ли служба обязательной или опциональной?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:117 msgid "" "Will the script serve a single program, e.g., a daemon, or perform more " "complex actions?" msgstr "" "Будет ли скрипт обслуживать одну программу, например, демон, или выполнять " "более сложные действия?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:118 msgid "Which other services will our service depend on, and vice versa?" msgstr "От каких других служб зависит наша служба, и наоборот?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:120 msgid "" "From the examples that follow we will see why it is important to know the " "answers to these questions." msgstr "" "Из следующих примеров мы увидим, почему важно знать ответы на эти вопросы." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:122 #, no-wrap msgid "A dummy script" msgstr "Примитивный скрипт" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:125 msgid "" "The following script just emits a message each time the system boots up:" msgstr "" "Следующий скрипт просто выводит сообщение каждый раз при загрузке системы:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:129 #, no-wrap msgid "#!/bin/sh <.>\n" msgstr "#!/bin/sh <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:131 #, no-wrap msgid ". /etc/rc.subr <.>\n" msgstr ". /etc/rc.subr <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:135 #, no-wrap msgid "" "name=\"dummy\" <.>\n" "start_cmd=\"${name}_start\" <.>\n" "stop_cmd=\":\" <.>\n" msgstr "" "name=\"dummy\" <.>\n" "start_cmd=\"${name}_start\" <.>\n" "stop_cmd=\":\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:140 #, no-wrap msgid "" "dummy_start() <.>\n" "{\n" "\techo \"Nothing started.\"\n" "}\n" msgstr "" "dummy_start() <.>\n" "{\n" "\techo \"Nothing started.\"\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:143 #, no-wrap msgid "" "load_rc_config $name <.>\n" "run_rc_command \"$1\" <.>\n" msgstr "" "load_rc_config $name <.>\n" "run_rc_command \"$1\" <.>\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:146 msgid "Things to note are:" msgstr "Вот что следует учитывать:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:152 msgid "" "➊ An interpreted script should begin with the magic \"shebang\" " "line. That line specifies the interpreter program for the script. Due to " "the shebang line, the script can be invoked exactly like a binary program " "provided that it has the execute bit set. (See man:chmod[1].) For example, " "a system admin can run our script manually, from the command line:" msgstr "" "➊ Интерпретируемый скрипт должен начинаться с \"волшебной\" строки " "shebang. Эта строка указывает программу-интерпретатор для скрипта. Благодаря " "строке shebang скрипт может быть запущен точно так же, как бинарная " -"программа, при условии что у него установлен бит выполнения. (См. " -"man:chmod[1].) Например, системный администратор может запустить наш скрипт " +"программа, при условии что у него установлен бит выполнения. (См. man:" +"chmod[1].) Например, системный администратор может запустить наш скрипт " "вручную из командной строки:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:156 #, no-wrap msgid "# /etc/rc.d/dummy start\n" msgstr "# /etc/rc.d/dummy start\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:162 msgid "" "To be properly managed by the [.filename]#rc.d# framework, its scripts need " "to be written in the man:sh[1] language. If you have a service or port that " "uses a binary control utility or a startup routine written in another " "language, install that element in [.filename]#/usr/sbin# (for the system) or " "[.filename]#/usr/local/sbin# (for ports) and call it from a man:sh[1] script " "in the appropriate [.filename]#rc.d# directory." msgstr "" "Для корректного управления в рамках [.filename]#rc.d# скрипты должны быть " "написаны на языке man:sh[1]. Если у вас есть служба или порт, который " "использует двоичную утилиту управления или процедуру запуска, написанную на " "другом языке, установите этот компонент в [.filename]#/usr/sbin# (для " -"системы) или [.filename]#/usr/local/sbin# (для портов) и вызовите его из " -"man:sh[1] скрипта в соответствующем каталоге [.filename]#rc.d#." +"системы) или [.filename]#/usr/local/sbin# (для портов) и вызовите его из man:" +"sh[1] скрипта в соответствующем каталоге [.filename]#rc.d#." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:167 msgid "" "If you would like to learn the details of why [.filename]#rc.d# scripts must " "be written in the man:sh[1] language, see how [.filename]#/etc/rc# invokes " "them by means of `run_rc_script`, then study the implementation of " "`run_rc_script` in [.filename]#/etc/rc.subr#." msgstr "" "Если вы хотите узнать подробности о том, почему скрипты [.filename]#rc.d# " "должны быть написаны на языке man:sh[1], изучите, как [.filename]#/etc/rc# " "вызывает их с помощью `run_rc_script`, а затем изучите реализацию " "`run_rc_script` в [.filename]#/etc/rc.subr#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:173 msgid "" "➋ In [.filename]#/etc/rc.subr#, a number of man:sh[1] functions are " "defined for an [.filename]#rc.d# script to use. The functions are " "documented in man:rc.subr[8]. While it is theoretically possible to write " "an [.filename]#rc.d# script without ever using man:rc.subr[8], its functions " "prove extremely handy and make the job an order of magnitude easier. So it " "is no surprise that everybody resorts to man:rc.subr[8] in [.filename]#rc.d# " "scripts. We are not going to be an exception." msgstr "" -"➋ В файле [.filename]#/etc/rc.subr# определено несколько функций " -"man:sh[1], которые могут использоваться скриптами [.filename]#rc.d#. Эти " -"функции описаны в man:rc.subr[8]. Хотя теоретически возможно написать скрипт " -"[.filename]#rc.d# без использования man:rc.subr[8], его функции оказываются " +"➋ В файле [.filename]#/etc/rc.subr# определено несколько функций man:" +"sh[1], которые могут использоваться скриптами [.filename]#rc.d#. Эти функции " +"описаны в man:rc.subr[8]. Хотя теоретически возможно написать скрипт [." +"filename]#rc.d# без использования man:rc.subr[8], его функции оказываются " "чрезвычайно полезными и значительно упрощают задачу. Поэтому неудивительно, " "что все используют man:rc.subr[8] в скриптах [.filename]#rc.d#. Мы не будем " "исключением." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:176 msgid "" "An [.filename]#rc.d# script must \"source\"[.filename]#/etc/rc.subr# " "(include it using \"`.`\") _before_ it calls man:rc.subr[8] functions so " "that man:sh[1] has an opportunity to learn the functions. The preferred " "style is to source [.filename]#/etc/rc.subr# first of all." msgstr "" "Файл [.filename]#rc.d# должен \"подгрузить\" ([.filename]#/etc/rc.subr#, " "включить его с помощью \"`.`\") _до_ вызова функций man:rc.subr[8], чтобы у " "man:sh[1] была возможность знать об этих функциях заранее. Предпочтительный " "стиль — подгружать [.filename]#/etc/rc.subr# в самом начале." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:180 msgid "" "Some useful functions related to networking are provided by another include " "file, [.filename]#/etc/network.subr#." msgstr "" "Некоторые полезные функции, связанные с сетью, предоставляются другим " "включаемым файлом — [.filename]#/etc/network.subr#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:185 msgid "" "➌ [[name-var]]The mandatory variable `name` specifies the name of our " "script. It is required by man:rc.subr[8]. That is, each [.filename]#rc.d# " "script _must_ set `name` before it calls man:rc.subr[8] functions." msgstr "" "➌ [[name-var]]Обязательная переменная `name` определяет имя нашего " "скрипта. Она требуется man:rc.subr[8]. То есть, каждый скрипт в [." "filename]#rc.d# _должен_ установить `name` перед вызовом функций man:rc." "subr[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:191 msgid "" "Now it is the right time to choose a unique name for our script once and for " "all. We will use it in a number of places while developing the script. The " "content of the name variable needs to match the script name, some parts of " "FreeBSD (e.g., crossref:rc-scripting[rcng-service-jails, service jails] and " "the cpuset feature of the rc framework) depend upon this. As such the " "filename shall also not contain characters which may be troublesome in " "scripting (e.g., do not use a hyphen \"-\" and others)." msgstr "" "Теперь самое время раз и навсегда выбрать уникальное имя для нашего скрипта. " "Мы будем использовать его в нескольких местах при разработке скрипта. " "Содержимое переменной name должно соответствовать имени скрипта, так как " "некоторые части FreeBSD (например, crossref:rc-scripting[rcng-service-jails, " "сервисные клетки (jail)] и функция cpuset в rc framework) зависят от этого. " "Таким образом, имя файла также не должно содержать символов, которые могут " "вызвать проблемы в скриптах (например, не используйте дефис \"-\" и другие)." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:198 msgid "" "The current style of [.filename]#rc.d# scripting is to enclose values " "assigned to variables in double quotes. Keep in mind that it is just a " "style issue that may not always be applicable. You can safely omit quotes " "from around simple words without man:sh[1] metacharacters in them, while in " "certain cases you will need single quotes to prevent any interpretation of " "the value by man:sh[1]. A programmer should be able to tell the language " "syntax from style conventions and use both of them wisely." msgstr "" "Текущий стиль написания скриптов в [.filename]#rc.d# заключается в " "заключении значений, присваиваемых переменным, в двойные кавычки. Имейте в " "виду, что это всего лишь вопрос стиля, который может быть не всегда " "применим. Вы можете безопасно опустить кавычки вокруг простых слов без " "метасимволов man:sh[1], тогда как в некоторых случаях вам понадобятся " "одинарные кавычки, чтобы предотвратить интерпретацию значения man:sh[1]. " "Программист должен уметь отличать синтаксис языка от стилевых соглашений и " "разумно использовать и то, и другое." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:204 msgid "" "➍ The main idea behind man:rc.subr[8] is that an [.filename]#rc.d# " "script provides handlers, or methods, for man:rc.subr[8] to invoke. In " "particular, `start`, `stop`, and other arguments to an [.filename]#rc.d# " "script are handled this way. A method is a man:sh[1] expression stored in a " "variable named `argument_cmd`, where _argument_ corresponds to what can be " "specified on the script's command line. We will see later how man:rc." "subr[8] provides default methods for the standard arguments." msgstr "" "➍ Основная идея man:rc.subr[8] заключается в том, что скрипт [." "filename]#rc.d# предоставляет обработчики (или методы) для вызова man:rc." "subr[8]. В частности, аргументы `start`, `stop` и другие, передаваемые в " "скрипт [.filename]#rc.d#, обрабатываются таким образом. Метод представляет " "собой выражение man:sh[1], сохранённое в переменной с именем `argument_cmd`, " "где _argument_ соответствует тому, что может быть указано в командной строке " "скрипта. Далее мы увидим, как man:rc.subr[8] предоставляет стандартные " "методы для типовых аргументов." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:209 msgid "" -"To make the code in [.filename]#rc.d# more uniform, it is common to use " -"`${name}` wherever appropriate. Thus a number of lines can be just copied " +"To make the code in [.filename]#rc.d# more uniform, it is common to use `" +"${name}` wherever appropriate. Thus a number of lines can be just copied " "from one script to another." msgstr "" "Чтобы сделать код в [.filename]#rc.d# более единообразным, обычно используют " "`${name}` везде, где это уместно. Таким образом, множество строк можно " "просто копировать из одного скрипта в другой." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:213 msgid "" "➎ We should keep in mind that man:rc.subr[8] provides default methods " "for the standard arguments. Consequently, we must override a standard " "method with a no-op man:sh[1] expression if we want it to do nothing." msgstr "" "➎ Следует помнить, что man:rc.subr[8] предоставляет методы по " "умолчанию для стандартных аргументов. Следовательно, если мы хотим, чтобы " "стандартный метод ничего не делал, мы должны переопределить его с помощью no-" "op man:sh[1] выражения." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:216 msgid "" "➏ The body of a sophisticated method can be implemented as a " "function. It is a good idea to make the function name meaningful." msgstr "" "➏ Тело сложного метода может быть реализовано в виде функции. Хорошей " "практикой является использование осмысленного имени функции." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:220 msgid "" "It is strongly recommended to add the prefix `${name}` to the names of all " "functions defined in our script so they never clash with the functions from " "man:rc.subr[8] or another common include file." msgstr "" "Настоятельно рекомендуется добавлять префикс `${name}` к именам всех " "функций, определенных в нашем скрипте, чтобы они никогда не конфликтовали с " "функциями из man:rc.subr[8] или другого общего включаемого файла." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:224 msgid "" "➐ This call to man:rc.subr[8] loads man:rc.conf[5] variables. Our " "script makes no use of them yet, but it still is recommended to load man:rc." "conf[5] because there can be man:rc.conf[5] variables controlling man:rc." "subr[8] itself." msgstr "" "➐ Этот вызов man:rc.subr[8] загружает переменные man:rc.conf[5]. Наш " "скрипт пока их не использует, но всё равно рекомендуется загружать man:rc." "conf[5], потому что могут быть переменные man:rc.conf[5], управляющие самим " "man:rc.subr[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:227 msgid "" "➑ Usually this is the last command in an [.filename]#rc.d# script. " "It invokes the man:rc.subr[8] machinery to perform the requested action " "using the variables and methods our script has provided." msgstr "" "➑ Обычно это последняя команда в скрипте [.filename]#rc.d#. Она " "вызывает механизм man:rc.subr[8] для выполнения запрошенного действия, " "используя переменные и методы, предоставленные нашим скриптом." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:229 #, no-wrap msgid "A configurable dummy script" msgstr "Настраиваемый фиктивный скрипт" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:239 msgid "" "Now let us add some controls to our dummy script. As you may know, [." "filename]#rc.d# scripts are controlled with man:rc.conf[5]. Fortunately, " "man:rc.subr[8] hides all the complications from us. The following script " "uses man:rc.conf[5] via man:rc.subr[8] to see whether it is enabled in the " "first place, and to fetch a message to show at boot time. These two tasks " "in fact are independent. On the one hand, an [.filename]#rc.d# script can " "just support enabling and disabling its service. On the other hand, a " "mandatory [.filename]#rc.d# script can have configuration variables. We " "will do both things in the same script though:" msgstr "" "Теперь добавим некоторые элементы управления в наш тестовый скрипт. Как вам " "может быть известно, скрипты [.filename]#rc.d# управляются с помощью man:rc." "conf[5]. К счастью, man:rc.subr[8] скрывает от нас все сложности. Следующий " "скрипт использует man:rc.conf[5] через man:rc.subr[8], чтобы проверить, " "включен ли он вообще, и получить сообщение для отображения во время " "загрузки. Эти две задачи на самом деле независимы. С одной стороны, скрипт [." "filename]#rc.d# может просто поддерживать включение и выключение своего " "сервиса. С другой стороны, обязательный скрипт [.filename]#rc.d# может иметь " "переменные конфигурации. Однако мы реализуем обе возможности в одном скрипте:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:243 #: documentation/content/en/articles/rc-scripting/_index.adoc:334 #: documentation/content/en/articles/rc-scripting/_index.adoc:392 #: documentation/content/en/articles/rc-scripting/_index.adoc:624 #: documentation/content/en/articles/rc-scripting/_index.adoc:755 #: documentation/content/en/articles/rc-scripting/_index.adoc:860 #: documentation/content/en/articles/rc-scripting/_index.adoc:893 #: documentation/content/en/articles/rc-scripting/_index.adoc:927 #, no-wrap msgid "#!/bin/sh\n" msgstr "#!/bin/sh\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:245 #: documentation/content/en/articles/rc-scripting/_index.adoc:336 #: documentation/content/en/articles/rc-scripting/_index.adoc:394 #: documentation/content/en/articles/rc-scripting/_index.adoc:631 #: documentation/content/en/articles/rc-scripting/_index.adoc:757 #: documentation/content/en/articles/rc-scripting/_index.adoc:862 #: documentation/content/en/articles/rc-scripting/_index.adoc:895 #: documentation/content/en/articles/rc-scripting/_index.adoc:943 #, no-wrap msgid ". /etc/rc.subr\n" msgstr ". /etc/rc.subr\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:248 #, no-wrap msgid "" "name=dummy\n" "rcvar=dummy_enable <.>\n" msgstr "" "name=dummy\n" "rcvar=dummy_enable <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:251 #, no-wrap msgid "" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" msgstr "" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:255 #, no-wrap msgid "" "load_rc_config $name <.>\n" ": ${dummy_enable:=no} <.>\n" ": ${dummy_msg=\"Nothing started.\"} <.>\n" msgstr "" "load_rc_config $name <.>\n" ": ${dummy_enable:=no} <.>\n" ": ${dummy_msg=\"Nothing started.\"} <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:260 #, no-wrap msgid "" "dummy_start()\n" "{\n" "\techo \"$dummy_msg\" <.>\n" "}\n" msgstr "" "dummy_start()\n" "{\n" "\techo \"$dummy_msg\" <.>\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:262 #: documentation/content/en/articles/rc-scripting/_index.adoc:972 #, no-wrap msgid "run_rc_command \"$1\"\n" msgstr "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:265 msgid "What changed in this example?" msgstr "Что изменилось в этом примере?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:267 msgid "" "➊ The variable `rcvar` specifies the name of the ON/OFF knob variable." msgstr "" "➊ Переменная `rcvar` определяет имя переменной-переключателя ON/OFF." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:269 msgid "" "➋ Now `load_rc_config` is invoked earlier in the script, before any " "man:rc.conf[5] variables are accessed." msgstr "" "➋ Теперь `load_rc_config` вызывается раньше в скрипте, до обращения к " "любым переменным man:rc.conf[5]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:275 msgid "" "While examining [.filename]#rc.d# scripts, keep in mind that man:sh[1] " "defers the evaluation of expressions in a function until the latter is " "called. Therefore it is not an error to invoke `load_rc_config` as late as " "just before `run_rc_command` and still access man:rc.conf[5] variables from " "the method functions exported to `run_rc_command`. This is because the " "method functions are to be called by `run_rc_command`, which is invoked " "_after_ `load_rc_config`." msgstr "" "При изучении скриптов в [.filename]#rc.d# следует помнить, что man:sh[1] " "откладывает вычисление выражений в функции до её вызова. Поэтому не будет " "ошибкой вызвать `load_rc_config` непосредственно перед `run_rc_command` и " "при этом обращаться к переменным man:rc.conf[5] из функций методов, " "экспортируемых в `run_rc_command`. Это связано с тем, что функции методов " "вызываются `run_rc_command`, который выполняется _после_ `load_rc_config`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:281 msgid "" "➌ A warning will be emitted by `run_rc_command` if `rcvar` itself is " "set, but the indicated knob variable is unset. If your [.filename]#rc.d# " "script is for the base system, you should add a default setting for the knob " "to [.filename]#/etc/defaults/rc.conf# and document it in man:rc.conf[5]. " "Otherwise it is your script that should provide a default setting for the " "knob. The canonical approach to the latter case is shown in the example." msgstr "" "➌ `run_rc_command` выдаст предупреждение, если переменная `rcvar` " "установлена, но указанная переменная-флаг не задана. Если ваш скрипт [." "filename]#rc.d# предназначен для базовой системы, вы должны добавить " "значение по умолчанию для флага в [.filename]#/etc/defaults/rc.conf# и " "задокументировать его в man:rc.conf[5]. В противном случае ваш скрипт должен " "предоставить значение по умолчанию для флага. Канонический подход для " "последнего случая показан в примере." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:288 msgid "" "You can make man:rc.subr[8] act as though the knob is set to `ON`, " "irrespective of its current setting, by prefixing the argument to the script " "with `one` or `force`, as in `onestart` or `forcestop`. Keep in mind though " "that `force` has other dangerous effects we will touch upon below, while " "`one` just overrides the ON/OFF knob. E.g., assume that `dummy_enable` is " "`OFF`. The following command will run the `start` method in spite of the " "setting:" msgstr "" "Вы можете заставить man:rc.subr[8] действовать так, как если бы " "переключатель установлен в `ON`, независимо от его текущего значения, " "добавив перед аргументом скрипта префикс `one` или `force`, например " "`onestart` или `forcestop`. Однако учтите, что `force` имеет другие опасные " "эффекты, которые мы затронем ниже, тогда как `one` просто переопределяет " "переключатель ON/OFF. Например, предположим, что `dummy_enable` установлен в " "`OFF`. Следующая команда выполнит метод `start`, несмотря на настройку:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:292 #, no-wrap msgid "# /etc/rc.d/dummy onestart\n" msgstr "# /etc/rc.d/dummy onestart\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:299 msgid "" "➍ Now the message to be shown at boot time is no longer hard-coded in " "the script. It is specified by an man:rc.conf[5] variable named " "`dummy_msg`. This is a trivial example of how man:rc.conf[5] variables can " "control an [.filename]#rc.d# script." msgstr "" "➍ Теперь сообщение, отображаемое при загрузке, больше не жестко " -"закодировано в скрипте. Оно задается переменной `dummy_msg` в man:rc.conf[5]" -". Это простой пример того, как переменные man:rc.conf[5] могут управлять " -"скриптом в [.filename]#rc.d#." +"закодировано в скрипте. Оно задается переменной `dummy_msg` в man:rc." +"conf[5]. Это простой пример того, как переменные man:rc.conf[5] могут " +"управлять скриптом в [.filename]#rc.d#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:304 msgid "" "The names of all man:rc.conf[5] variables used exclusively by our script " "_must_ have the same prefix: `${name}_`. For example: `dummy_mode`, " "`dummy_state_file`, and so on." msgstr "" "Имена всех переменных man:rc.conf[5], используемых исключительно нашим " "скриптом, _должны_ иметь один и тот же префикс: `${name}_`. Например: " "`dummy_mode`, `dummy_state_file` и так далее." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:309 msgid "" "While it is possible to use a shorter name internally, e.g., just `msg`, " "adding the unique prefix `${name}_` to all global names introduced by our " "script will save us from possible collisions with the man:rc.subr[8] " "namespace." msgstr "" "Хотя можно использовать более короткое имя внутри, например, просто `msg`, " "добавление уникального префикса `${name}_` ко всем глобальным именам, " "вводимым нашим скриптом, избавит нас от возможных конфликтов с пространством " "имен man:rc.subr[8]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:312 msgid "" "As a rule, [.filename]#rc.d# scripts of the base system need not provide " "defaults for their man:rc.conf[5] variables because the defaults should be " "set in [.filename]#/etc/defaults/rc.conf# instead. On the other hand, [." "filename]#rc.d# scripts for ports should provide the defaults as shown in " "the example." msgstr "" "Как правило, скрипты [.filename]#rc.d# базовой системы не должны " "предоставлять значения по умолчанию для своих переменных man:rc.conf[5], " "поскольку значения по умолчанию должны быть установлены в [.filename]#/etc/" "defaults/rc.conf#. С другой стороны, скрипты [.filename]#rc.d# для портов " "должны предоставлять значения по умолчанию, как показано в примере." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:316 msgid "" "➎ Here we use `dummy_msg` to actually control our script, i.e., to " "emit a variable message. Use of a shell function is overkill here, since it " "only runs a single command; an equally valid alternative is:" msgstr "" "➎ Здесь мы используем `dummy_msg` для фактического управления нашим " "скриптом, т.е., для выдачи переменного сообщения. Использование shell-" "функции здесь избыточно, так как она выполняет только одну команду; " "равнозначной альтернативой является:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:320 #, no-wrap msgid "start_cmd=\"echo \\\"$dummy_msg\\\"\"\n" msgstr "start_cmd=\"echo \\\"$dummy_msg\\\"\"\n" #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:323 #, no-wrap msgid "Startup and shutdown of a simple daemon" msgstr "Запуск и остановка простого демона" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:330 msgid "" "We said earlier that man:rc.subr[8] could provide default methods. " "Obviously, such defaults cannot be too general. They are suited for the " "common case of starting and shutting down a simple daemon program. Let us " "assume now that we need to write an [.filename]#rc.d# script for such a " "daemon called `mumbled`. Here it is:" msgstr "" "Мы ранее говорили, что man:rc.subr[8] может предоставлять методы по " "умолчанию. Очевидно, что такие методы не могут быть слишком общими. Они " "подходят для стандартного случая запуска и остановки простого демона. " "Предположим, что нам нужно написать скрипт [.filename]#rc.d# для такого " "демона с именем `mumbled`. Вот он:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:339 #: documentation/content/en/articles/rc-scripting/_index.adoc:397 #: documentation/content/en/articles/rc-scripting/_index.adoc:634 #, no-wrap msgid "" "name=mumbled\n" "rcvar=mumbled_enable\n" msgstr "" "name=mumbled\n" "rcvar=mumbled_enable\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:341 #, no-wrap msgid "command=\"/usr/sbin/${name}\" <.>\n" msgstr "command=\"/usr/sbin/${name}\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:344 #: documentation/content/en/articles/rc-scripting/_index.adoc:443 #: documentation/content/en/articles/rc-scripting/_index.adoc:649 #: documentation/content/en/articles/rc-scripting/_index.adoc:876 #, no-wrap msgid "" "load_rc_config $name\n" "run_rc_command \"$1\"\n" msgstr "" "load_rc_config $name\n" "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:348 msgid "" "Pleasingly simple, isn't it? Let us examine our little script. The only new " "thing to note is as follows:" msgstr "" "Приятно просто, не так ли? Давайте рассмотрим наш небольшой скрипт. " "Единственное новое, на что стоит обратить внимание, это следующее:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:352 msgid "" "➊ The `command` variable is meaningful to man:rc.subr[8]. If it is " "set, man:rc.subr[8] will act according to the scenario of serving a " "conventional daemon. In particular, the default methods will be provided " "for such arguments: `start`, `stop`, `restart`, `poll`, and `status`." msgstr "" "➊ Переменная `command` имеет значение для man:rc.subr[8]. Если она " "установлена, man:rc.subr[8] будет действовать по сценарию обслуживания " "обычного демона. В частности, будут предоставлены стандартные методы для " "таких аргументов: `start`, `stop`, `restart`, `poll` и `status`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:361 msgid "" "The daemon will be started by running `$command` with command-line flags " "specified by `$mumbled_flags`. Thus all the input data for the default " "`start` method are available in the variables set by our script. Unlike " "`start`, other methods may require additional information about the process " "started. For instance, `stop` must know the PID of the process to terminate " "it. In the present case, man:rc.subr[8] will scan through the list of all " "processes, looking for a process with its name equal to `procname`. The " "latter is another variable of meaning to man:rc.subr[8], and its value " "defaults to that of `command`. In other words, when we set `command`, " "`procname` is effectively set to the same value. This enables our script to " "kill the daemon and to check if it is running in the first place." msgstr "" "Демон будет запущен выполнением `$command` с флагами командной строки, " "указанными в `$mumbled_flags`. Таким образом, все входные данные для метода " "`start` по умолчанию доступны в переменных, установленных нашим скриптом. В " "отличие от `start`, другие методы могут требовать дополнительной информации " "о запущенном процессе. Например, `stop` должен знать PID процесса, чтобы " "завершить его. В данном случае, man:rc.subr[8] будет просматривать список " "всех процессов, ища процесс с именем, равным `procname`. Последний является " "ещё одной значимой переменной для man:rc.subr[8], и её значение по умолчанию " "совпадает со значением `command`. Другими словами, когда мы устанавливаем " "`command`, `procname` фактически устанавливается в то же значение. Это " "позволяет нашему скрипту завершить демон и проверить, запущен ли он вообще." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:368 msgid "" "Some programs are in fact executable scripts. The system runs such a script " "by starting its interpreter and passing the name of the script to it as a " "command-line argument. This is reflected in the list of processes, which " "can confuse man:rc.subr[8]. You should additionally set " "`command_interpreter` to let man:rc.subr[8] know the actual name of the " "process if `$command` is a script." msgstr "" "Некоторые программы на самом деле являются исполняемыми скриптами. Система " "запускает такие скрипты, запуская их интерпретатор и передавая ему имя " "скрипта в качестве аргумента командной строки. Это отражается в списке " "процессов, что может сбить с толку man:rc.subr[8]. Дополнительно следует " "установить `command_interpreter`, чтобы man:rc.subr[8] знал фактическое имя " "процесса, если `$command` является скриптом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:374 msgid "" "For each [.filename]#rc.d# script, there is an optional man:rc.conf[5] " "variable that takes precedence over `command`. Its name is constructed as " "follows: `${name}_program`, where `name` is the mandatory variable we " "discussed crossref:rc-scripting[name-var, earlier]. E.g., in this case it " "will be `mumbled_program`. It is man:rc.subr[8] that arranges `${name}" "_program` to override `command`." msgstr "" "Для каждого скрипта [.filename]#rc.d# существует необязательная переменная " "man:rc.conf[5], которая имеет приоритет над `command`. Её имя формируется " "следующим образом: `${name}_program`, где `name` — это обязательная " "переменная, которую мы обсуждали crossref:rc-scripting[name-var, ранее]. " "Например, в данном случае это будет `mumbled_program`. Именно man:rc.subr[8] " "обеспечивает переопределение `command` с помощью `${name}_program`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:378 msgid "" "Of course, man:sh[1] will permit you to set `${name}_program` from man:rc." "conf[5] or the script itself even if `command` is unset. In that case, the " "special properties of `${name}_program` are lost, and it becomes an ordinary " "variable your script can use for its own purposes. However, the sole use of " "`${name}_program` is discouraged because using it together with `command` " "became an idiom of [.filename]#rc.d# scripting." msgstr "" "Конечно, man:sh[1] позволяет установить `${name}_program` из man:rc.conf[5] " "или самого скрипта, даже если `command` не задан. В этом случае специальные " "свойства `${name}_program` теряются, и она становится обычной переменной, " -"которую ваш скрипт может использовать для своих целей. Однако использование " -"`${name}_program` в одиночку не рекомендуется, так как совместное " +"которую ваш скрипт может использовать для своих целей. Однако использование `" +"${name}_program` в одиночку не рекомендуется, так как совместное " "использование с `command` стало идиомой в [.filename]#rc.d# скриптах." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:381 msgid "" "For more detailed information on default methods, refer to man:rc.subr[8]." msgstr "" "Для получения более подробной информации о стандартных методах обратитесь к " "man:rc.subr[8]." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:383 #, no-wrap msgid "Startup and shutdown of an advanced daemon" msgstr "Запуск и остановка продвинутого демона" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:388 msgid "" "Let us add some meat onto the bones of the previous script and make it more " "complex and featureful. The default methods can do a good job for us, but " "we may need some of their aspects tweaked. Now we will learn how to tune " "the default methods to our needs." msgstr "" "Добавим немного мяса к костям предыдущего скрипта и сделаем его более " "сложным и функциональным. Стандартные методы могут хорошо справляться с " "задачами, но иногда требуется их тонкая настройка. Теперь мы узнаем, как " "адаптировать стандартные методы под наши нужды." #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:400 #, no-wrap msgid "" "command=\"/usr/sbin/${name}\"\n" "command_args=\"mock arguments > /dev/null 2>&1\" <.>\n" msgstr "" "command=\"/usr/sbin/${name}\"\n" "command_args=\"mock arguments > /dev/null 2>&1\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:402 #, no-wrap msgid "pidfile=\"/var/run/${name}.pid\" <.>\n" msgstr "pidfile=\"/var/run/${name}.pid\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:404 #, no-wrap msgid "required_files=\"/etc/${name}.conf /usr/share/misc/${name}.rules\" <.>\n" -msgstr "" -"required_files=\"/etc/${name}.conf /usr/share/misc/${name}.rules\" <.>\n" +msgstr "required_files=\"/etc/${name}.conf /usr/share/misc/${name}.rules\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:406 #, no-wrap msgid "sig_reload=\"USR1\" <.>\n" msgstr "sig_reload=\"USR1\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:409 #, no-wrap msgid "" "start_precmd=\"${name}_prestart\" <.>\n" "stop_postcmd=\"echo Bye-bye\" <.>\n" msgstr "" "start_precmd=\"${name}_prestart\" <.>\n" "stop_postcmd=\"echo Bye-bye\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:411 #, no-wrap msgid "extra_commands=\"reload plugh xyzzy\" <.>\n" msgstr "extra_commands=\"reload plugh xyzzy\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:414 #, no-wrap msgid "" "plugh_cmd=\"mumbled_plugh\" <.>\n" "xyzzy_cmd=\"echo 'Nothing happens.'\"\n" msgstr "" "plugh_cmd=\"mumbled_plugh\" <.>\n" "xyzzy_cmd=\"echo 'Nothing happens.'\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:435 #, no-wrap msgid "" "mumbled_prestart()\n" "{\n" "\tif checkyesno mumbled_smart; then <.>\n" "\t\trc_flags=\"-o smart ${rc_flags}\" <.>\n" "\tfi\n" "\tcase \"$mumbled_mode\" in\n" "\tfoo)\n" "\t\trc_flags=\"-frotz ${rc_flags}\"\n" "\t\t;;\n" "\tbar)\n" "\t\trc_flags=\"-baz ${rc_flags}\"\n" "\t\t;;\n" "\t*)\n" "\t\twarn \"Invalid value for mumbled_mode\" <.>\n" "\t\treturn 1 <.>\n" "\t\t;;\n" "\tesac\n" "\trun_rc_command xyzzy <.>\n" "\treturn 0\n" "}\n" msgstr "" "mumbled_prestart()\n" "{\n" "\tif checkyesno mumbled_smart; then <.>\n" "\t\trc_flags=\"-o smart ${rc_flags}\" <.>\n" "\tfi\n" "\tcase \"$mumbled_mode\" in\n" "\tfoo)\n" "\t\trc_flags=\"-frotz ${rc_flags}\"\n" "\t\t;;\n" "\tbar)\n" "\t\trc_flags=\"-baz ${rc_flags}\"\n" "\t\t;;\n" "\t*)\n" "\t\twarn \"Invalid value for mumbled_mode\" <.>\n" "\t\treturn 1 <.>\n" "\t\t;;\n" "\tesac\n" "\trun_rc_command xyzzy <.>\n" "\treturn 0\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:440 #, no-wrap msgid "" "mumbled_plugh() <.>\n" "{\n" "\techo 'A hollow voice says \"plugh\".'\n" "}\n" msgstr "" "mumbled_plugh() <.>\n" "{\n" "\techo 'A hollow voice says \"plugh\".'\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:448 msgid "" "➊ Additional arguments to `$command` can be passed in " -"`command_args`. They will be added to the command line after " -"`$mumbled_flags`. Since the final command line is passed to `eval` for its " +"`command_args`. They will be added to the command line after `" +"$mumbled_flags`. Since the final command line is passed to `eval` for its " "actual execution, input and output redirections can be specified in " "`command_args`." msgstr "" "➊ Дополнительные аргументы для `$command` могут быть переданы в " -"`command_args`. Они будут добавлены в командную строку после `$mumbled_flags`" -". Поскольку итоговая командная строка передаётся в `eval` для фактического " -"выполнения, перенаправления ввода и вывода могут быть указаны в " +"`command_args`. Они будут добавлены в командную строку после `" +"$mumbled_flags`. Поскольку итоговая командная строка передаётся в `eval` для " +"фактического выполнения, перенаправления ввода и вывода могут быть указаны в " "`command_args`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:455 msgid "" "_Never_ include dashed options, like `-X` or `--foo`, in `command_args`. " "The contents of `command_args` will appear at the end of the final command " "line, hence they are likely to follow arguments present in `${name}_flags`; " "but most commands will not recognize dashed options after ordinary " "arguments. A better way of passing additional options to `$command` is to " "add them to the beginning of `${name}_flags`. Another way is to modify " "`rc_flags` crossref:rc-scripting[rc-flags, as shown later]." msgstr "" "Никогда не включайте параметры с дефисами, такие как `-X` или `--foo`, в " "`command_args`. Содержимое `command_args` будет добавлено в конец итоговой " "командной строки, поэтому, скорее всего, окажется после аргументов, " "указанных в `${name}_flags`; однако большинство команд не распознают " "параметры с дефисами после обычных аргументов. Лучший способ передать " -"дополнительные параметры в `$command` — добавить их в начало `${name}_flags`" -". Другой способ — изменить `rc_flags` crossref:rc-scripting[rc-flags, как " -"показано далее]." +"дополнительные параметры в `$command` — добавить их в начало `${name}" +"_flags`. Другой способ — изменить `rc_flags` crossref:rc-scripting[rc-flags, " +"как показано далее]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:459 msgid "" "➋ A good-mannered daemon should create a _pidfile_ so that its " "process can be found more easily and reliably. The variable `pidfile`, if " "set, tells man:rc.subr[8] where it can find the pidfile for its default " "methods to use." msgstr "" "➋ Вежливый демон должен создавать _pidfile_, чтобы его процесс можно " "было найти проще и надежнее. Переменная `pidfile`, если она установлена, " "указывает man:rc.subr[8], где можно найти pidfile для использования его " "стандартными методами." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:464 msgid "" "In fact, man:rc.subr[8] will also use the pidfile to see if the daemon is " "already running before starting it. This check can be skipped by using the " "`faststart` argument." msgstr "" "На самом деле, man:rc.subr[8] также использует pidfile для проверки, запущен " "ли демон, перед его запуском. Эту проверку можно пропустить, используя " "аргумент `faststart`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:469 msgid "" "➌ If the daemon cannot run unless certain files exist, just list them " "in `required_files`, and man:rc.subr[8] will check that those files do exist " "before starting the daemon. There also are `required_dirs` and " "`required_vars` for directories and environment variables, respectively. " "They all are described in detail in man:rc.subr[8]." msgstr "" "➌ Если демон не может работать без определённых файлов, просто " "укажите их в `required_files`, и man:rc.subr[8] проверит их наличие перед " "запуском демона. Также существуют `required_dirs` и `required_vars` для " "каталогов и переменных окружения соответственно. Все они подробно описаны в " "man:rc.subr[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:473 msgid "" "The default method from man:rc.subr[8] can be forced to skip the " "prerequisite checks by using `forcestart` as the argument to the script." msgstr "" "Метод по умолчанию из man:rc.subr[8] можно принудительно заставить " "пропустить проверки предварительных условий, используя аргумент `forcestart` " "в скрипте." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:479 msgid "" "➍ We can customize signals to send to the daemon in case they differ " "from the well-known ones. In particular, `sig_reload` specifies the signal " "that makes the daemon reload its configuration; it is SIGHUP by default. " "Another signal is sent to stop the daemon process; the default is SIGTERM, " "but this can be changed by setting `sig_stop` appropriately." msgstr "" "➍ Мы можем настроить сигналы, отправляемые демону, если они " "отличаются от общеизвестных. В частности, `sig_reload` указывает сигнал, " "который заставляет демона перезагрузить свою конфигурацию; по умолчанию это " "SIGHUP. Другой сигнал отправляется для остановки процесса демона; по " "умолчанию используется SIGTERM, но это можно изменить, установив `sig_stop` " "соответствующим образом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:484 msgid "" "The signal names should be specified to man:rc.subr[8] without the `SIG` " "prefix, as it is shown in the example. The FreeBSD version of man:kill[1] " "can recognize the `SIG` prefix, but the versions from other OS types may not." msgstr "" "Имена сигналов должны указываться для man:rc.subr[8] без префикса `SIG`, как " "показано в примере. Версия man:kill[1] в FreeBSD может распознавать префикс " "`SIG`, но версии из других типов ОС могут не поддерживать его." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:489 msgid "" "➎➏ Performing additional tasks before or after the default " "methods is easy. For each command-argument supported by our script, we can " "define `argument_precmd` and `argument_postcmd`. These man:sh[1] commands " "are invoked before and after the respective method, as it is evident from " "their names." msgstr "" "➎➏ Выполнение дополнительных задач до или после стандартных " "методов — это просто. Для каждого аргумента команды, поддерживаемого нашим " "скриптом, мы можем определить `argument_precmd` и `argument_postcmd`. Эти " "команды man:sh[1] вызываются до и после соответствующего метода, что " "очевидно из их названий." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:495 msgid "" "Overriding a default method with a custom `argument_cmd` still does not " "prevent us from making use of `argument_precmd` or `argument_postcmd` if we " "need to. In particular, the former is good for checking custom, " "sophisticated conditions that should be met before performing the command " "itself. Using `argument_precmd` along with `argument_cmd` lets us logically " "separate the checks from the action." msgstr "" "Переопределение стандартного метода с помощью пользовательского " "`argument_cmd` всё равно не мешает нам использовать `argument_precmd` или " "`argument_postcmd`, если это необходимо. В частности, первый полезен для " "проверки пользовательских сложных условий, которые должны быть выполнены " "перед выполнением самой команды. Использование `argument_precmd` вместе с " "`argument_cmd` позволяет логически разделить проверки от действия." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:498 msgid "" "Do not forget that you can cram any valid man:sh[1] expressions into the " "methods, pre-, and post-commands you define. Just invoking a function that " "makes the real job is a good style in most cases, but never let style limit " "your understanding of what is going on behind the curtain." msgstr "" -"Не забывайте, что вы можете вставлять любые допустимые выражения из man:sh[1]" -" в определяемые вами методы, а также команды pre- и post-. Просто вызывать " -"функцию, которая выполняет основную работу, — это хороший стиль в " +"Не забывайте, что вы можете вставлять любые допустимые выражения из man:" +"sh[1] в определяемые вами методы, а также команды pre- и post-. Просто " +"вызывать функцию, которая выполняет основную работу, — это хороший стиль в " "большинстве случаев, но никогда не позволяйте стилю ограничивать ваше " "понимание того, что происходит за кулисами." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:501 msgid "" "➐ If we would like to implement custom arguments, which can also be " "thought of as _commands_ to our script, we need to list them in " "`extra_commands` and provide methods to handle them." msgstr "" "➐ Если мы хотим реализовать пользовательские аргументы, которые также " "можно рассматривать как _команды_ для нашего скрипта, необходимо перечислить " "их в `extra_commands` и предоставить методы для их обработки." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:509 msgid "" "The `reload` command is special. On the one hand, it has a preset method in " "man:rc.subr[8]. On the other hand, `reload` is not offered by default. The " "reason is that not all daemons use the same reload mechanism and some have " "nothing to reload at all. So we need to ask explicitly that the builtin " "functionality be provided. We can do so via `extra_commands`." msgstr "" "Команда `reload` является особенной. С одной стороны, у неё есть " "предустановленный метод в man:rc.subr[8]. С другой стороны, `reload` не " "предлагается по умолчанию. Причина в том, что не все демоны используют " "одинаковый механизм перезагрузки, а у некоторых вообще нет ничего для " "перезагрузки. Поэтому нам нужно явно запросить предоставление встроенной " "функциональности. Это можно сделать с помощью `extra_commands`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:513 msgid "" "What do we get from the default method for `reload`? Quite often daemons " "reload their configuration upon reception of a signal - typically, SIGHUP. " "Therefore man:rc.subr[8] attempts to reload the daemon by sending a signal " "to it. The signal is preset to SIGHUP but can be customized via " "`sig_reload` if necessary." msgstr "" "Что мы получаем от метода по умолчанию для `reload`? Довольно часто демоны " "перезагружают свою конфигурацию при получении сигнала — обычно, SIGHUP. " "Поэтому man:rc.subr[8] пытается перезагрузить демона, отправляя ему сигнал. " "Сигнал предустановлен на SIGHUP, но может быть изменён через `sig_reload` " "при необходимости." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:518 msgid "" "➑⓮ Our script supports two non-standard commands, `plugh` and " "`xyzzy`. We saw them listed in `extra_commands`, and now it is time to " "provide methods for them. The method for `xyzzy` is just inlined while that " "for `plugh` is implemented as the `mumbled_plugh` function." msgstr "" "➑⓮ Наш скрипт поддерживает две нестандартные команды: `plugh` и " "`xyzzy`. Мы видели их в списке `extra_commands`, и теперь пришло время " "реализовать методы для них. Метод для `xyzzy` просто встроен в код, а для " "`plugh` он реализован как функция `mumbled_plugh`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:522 msgid "" "Non-standard commands are not invoked during startup or shutdown. Usually " "they are for the system admin's convenience. They can also be used from " "other subsystems, e.g., man:devd[8] if specified in man:devd.conf[5]." msgstr "" "Нестандартные команды не вызываются во время запуска или завершения работы. " "Обычно они предназначены для удобства системного администратора. Они также " "могут использоваться другими подсистемами, например, man:devd[8], если " "указаны в man:devd.conf[5]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:525 msgid "" "The full list of available commands can be found in the usage line printed " "by man:rc.subr[8] when the script is invoked without arguments. For " "example, here is the usage line from the script under study:" msgstr "" "Полный список доступных команд можно найти в строке использования, выводимой " "man:rc.subr[8], когда скрипт вызывается без аргументов. Например, вот строка " "использования из изучаемого скрипта:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:530 #, no-wrap msgid "" "# /etc/rc.d/mumbled\n" "Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)\n" msgstr "" "# /etc/rc.d/mumbled\n" -"Usage: /etc/rc.d/mumbled " -"[fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)\n" +"Usage: /etc/rc.d/mumbled [fast|force|one](start|stop|restart|rcvar|reload|plugh|xyzzy|status|poll)\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:537 msgid "" "⓭ A script can invoke its own standard or non-standard commands if " "needed. This may look similar to calling functions, but we know that " "commands and shell functions are not always the same thing. For instance, " "`xyzzy` is not implemented as a function here. In addition, there can be a " "pre-command and post-command, which should be invoked orderly. So the " "proper way for a script to run its own command is by means of man:rc." "subr[8], as shown in the example." msgstr "" "⓭ Скрипт может вызывать свои собственные стандартные или нестандартные " "команды, если это необходимо. Это может выглядеть похоже на вызов функций, " "но мы знаем, что команды и функции оболочки не всегда одно и то же. " "Например, `xyzzy` не реализован как функция в данном случае. Кроме того, " "могут существовать пред-команда и пост-команда, которые должны вызываться в " "определённом порядке. Поэтому правильный способ для скрипта выполнить свою " "собственную команду — с помощью man:rc.subr[8], как показано в примере." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:543 msgid "" "➒ A handy function named `checkyesno` is provided by man:rc.subr[8]. " "It takes a variable name as its argument and returns a zero exit code if and " "only if the variable is set to `YES`, or `TRUE`, or `ON`, or `1`, case " "insensitive; a non-zero exit code is returned otherwise. In the latter " "case, the function tests the variable for being set to `NO`, `FALSE`, `OFF`, " "or `0`, case insensitive; it prints a warning message if the variable " "contains anything else, i.e., junk." msgstr "" "➒ Полезная функция `checkyesno` предоставляется man:rc.subr[8]. Она " "принимает имя переменной в качестве аргумента и возвращает нулевой код " "выхода только если переменная установлена в `YES`, `TRUE`, `ON` или `1`, без " "учёта регистра; в противном случае возвращается ненулевой код выхода. В " -"последнем случае функция проверяет, установлена ли переменная в `NO`, `FALSE`" -", `OFF` или `0`, также без учёта регистра; если переменная содержит что-то " -"иное (т.е. мусор), функция выводит предупреждение." +"последнем случае функция проверяет, установлена ли переменная в `NO`, " +"`FALSE`, `OFF` или `0`, также без учёта регистра; если переменная содержит " +"что-то иное (т.е. мусор), функция выводит предупреждение." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:545 msgid "" "Keep in mind that for man:sh[1] a zero exit code means true and a non-zero " "exit code means false." msgstr "" "Имейте в виду, что для man:sh[1] нулевой код возврата означает истину, а " "ненулевой код возврата означает ложь." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:550 msgid "" "The `checkyesno` function takes a __variable name__. Do not pass the " "expanded _value_ of a variable to it; it will not work as expected." msgstr "" "Функция `checkyesno` принимает __имя переменной__. Не передавайте ей " "_значение_ переменной; это не будет работать, как ожидается." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:552 msgid "The following is the correct usage of `checkyesno`:" msgstr "Ниже приведено правильное использование `checkyesno`:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:558 #, no-wrap msgid "" "if checkyesno mumbled_enable; then\n" " foo\n" "fi\n" msgstr "" "if checkyesno mumbled_enable; then\n" " foo\n" "fi\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:561 msgid "" "On the contrary, calling `checkyesno` as shown below will not work - at " "least not as expected:" msgstr "" "Напротив, вызов `checkyesno`, как показано ниже, не сработает — по крайней " "мере, не так, как ожидается:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:567 #, no-wrap msgid "" "if checkyesno \"${mumbled_enable}\"; then\n" " foo\n" "fi\n" msgstr "" "if checkyesno \"${mumbled_enable}\"; then\n" " foo\n" "fi\n" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:572 msgid "" "➓ [[rc-flags]]We can affect the flags to be passed to `$command` by " "modifying `rc_flags` in `$start_precmd`." msgstr "" -"➓ [[rc-flags]] Мы можем влиять на флаги, передаваемые команде " -"`$command`, изменяя `rc_flags` в `$start_precmd`." +"➓ [[rc-flags]] Мы можем влиять на флаги, передаваемые команде `" +"$command`, изменяя `rc_flags` в `$start_precmd`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:576 msgid "" "⓫ In certain cases we may need to emit an important message that " "should go to `syslog` as well. This can be done easily with the following " "man:rc.subr[8] functions: `debug`, `info`, `warn`, and `err`. The latter " "function then exits the script with the code specified." msgstr "" "⓫ В некоторых случаях может потребоваться вывести важное сообщение, " "которое также должно попасть в `syslog`. Это можно легко сделать с помощью " "следующих функций man:rc.subr[8]: `debug`, `info`, `warn` и `err`. Последняя " "функция завершает выполнение скрипта с указанным кодом." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:580 msgid "" "⓬ The exit codes from methods and their pre-commands are not just " "ignored by default. If `argument_precmd` returns a non-zero exit code, the " "main method will not be performed. In turn, `argument_postcmd` will not be " "invoked unless the main method returns a zero exit code." msgstr "" "⓬ Коды выхода из методов и их предварительных команд не просто " "игнорируются по умолчанию. Если `argument_precmd` возвращает ненулевой код " "выхода, основной метод не будет выполнен. В свою очередь, `argument_postcmd` " "не будет вызван, если основной метод возвращает ненулевой код выхода." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:584 msgid "" "However, man:rc.subr[8] can be instructed from the command line to ignore " "those exit codes and invoke all commands anyway by prefixing an argument " "with `force`, as in `forcestart`." msgstr "" "Однако man:rc.subr[8] можно указать из командной строки игнорировать эти " "коды завершения и выполнять все команды в любом случае, добавив префикс " "`force` к аргументу, например `forcestart`." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:587 #, no-wrap msgid "Connecting a script to the rc.d framework" msgstr "Подключение скрипта к инфраструктуре rc.d" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:594 msgid "" "After a script has been written, it needs to be integrated into [." "filename]#rc.d#. The crucial step is to install the script in [.filename]#/" "etc/rc.d# (for the base system) or [.filename]#/usr/local/etc/rc.d# (for " "ports). Both [.filename]#bsd.prog.mk# and [.filename]#bsd.port.mk# provide " "convenient hooks for that, and usually you do not have to worry about the " "proper ownership and mode. System scripts should be installed from [." "filename]#src/libexec/rc/rc.d# through the [.filename]#Makefile# found " "there. Port scripts can be installed using `USE_RC_SUBR` as described " -"extref:{porters-handbook}[in the Porter's Handbook, rc-scripts]." +"extref:{porters-handbook}special[in the Porter's Handbook, rc-scripts]." msgstr "" "После написания скрипта его необходимо интегрировать в [.filename]#rc.d#. " "Ключевой шаг — установка скрипта в [.filename]#/etc/rc.d# (для базовой " "системы) или [.filename]#/usr/local/etc/rc.d# (для портов). И [.filename]#bsd" ".prog.mk#, и [.filename]#bsd.port.mk# предоставляют удобные механизмы для " "этого, и обычно вам не нужно беспокоиться о правильных правах доступа и " "режиме. Системные скрипты должны устанавливаться из [.filename]#src/libexec/" "rc/rc.d# через [.filename]#Makefile#, находящийся там. Скрипты портов можно " -"установить с помощью `USE_RC_SUBR`, как описано extref:{porters-handbook}" -"special/[в Руководстве FreeBSD по созданию портов, rc-скрипты]." +"установить с помощью `USE_RC_SUBR`, как описано extref:{porters-" +"handbook}special[в Руководстве FreeBSD по созданию портов, rc-скрипты]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:599 msgid "" "However, we should consider beforehand the place of our script in the system " "startup sequence. The service handled by our script is likely to depend on " "other services. For instance, a network daemon cannot function without the " "network interfaces and routing up and running. Even if a service seems to " "demand nothing, it can hardly start before the basic filesystems have been " "checked and mounted." msgstr "" "Однако следует заранее продумать место нашего скрипта в последовательности " "запуска системы. Скорее всего, обслуживаемый нашим скриптом сервис зависит " "от других сервисов. Например, сетевой демон не может работать без поднятых " "сетевых интерфейсов и маршрутизации. Даже если сервис, казалось бы, ничего " "не требует, он вряд ли сможет запуститься до проверки и монтирования " "основных файловых систем." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:605 msgid "" "We mentioned man:rcorder[8] already. Now it is time to have a close look at " "it. In a nutshell, man:rcorder[8] takes a set of files, examines their " "contents, and prints a dependency-ordered list of files from the set to " "`stdout`. The point is to keep dependency information _inside_ the files so " "that each file can speak for itself only. A file can specify the following " "information:" msgstr "" "Мы уже упоминали man:rcorder[8]. Теперь пришло время рассмотреть его " "подробнее. В двух словах, man:rcorder[8] принимает набор файлов, анализирует " "их содержимое и выводит на `stdout` список этих файлов, упорядоченный по " "зависимостям. Главная идея заключается в том, чтобы хранить информацию о " "зависимостях _внутри_ файлов, чтобы каждый файл мог описывать только себя. " "Файл может содержать следующую информацию:" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:607 msgid "" "the names of the \"conditions\" (which means services to us) it __provides__;" msgstr "" "имена \"условий\" (что для нас означает сервисы), которые он " "__предоставляет__;" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:608 msgid "the names of the \"conditions\" it __requires__;" msgstr "имена \"условий\", которые он __требует__;" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:609 msgid "the names of the \"conditions\" this file should run __before__;" msgstr "имена \"условий\", перед которыми должен выполняться этот файл;" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:610 msgid "" "additional _keywords_ that can be used to select a subset from the whole set " "of files (man:rcorder[8] can be instructed via options to include or omit " "the files having particular keywords listed.)" msgstr "" "дополнительные _ключевые слова_, которые могут использоваться для выбора " "подмножества из всего набора файлов (man:rcorder[8] может быть настроен с " "помощью опций для включения или исключения файлов, содержащих указанные " "ключевые слова.)" #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:615 msgid "" "It is no surprise that man:rcorder[8] can handle only text files with a " "syntax close to that of man:sh[1]. That is, special lines understood by man:" "rcorder[8] look like man:sh[1] comments. The syntax of such special lines " "is rather rigid to simplify their processing. See man:rcorder[8] for " "details." msgstr "" "Неудивительно, что man:rcorder[8] может обрабатывать только текстовые файлы " "с синтаксисом, близким к man:sh[1]. То есть специальные строки, понимаемые " "man:rcorder[8], выглядят как комментарии в man:sh[1]. Синтаксис таких " "специальных строк довольно жёсткий, чтобы упростить их обработку. " "Подробности см. в man:rcorder[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:618 msgid "" "Besides using man:rcorder[8] special lines, a script can insist on its " "dependency upon another service by just starting it forcibly. This can be " "needed when the other service is optional and will not start by itself " "because the system admin has disabled it mistakenly in man:rc.conf[5]." msgstr "" "Помимо использования специальных строк man:rcorder[8], скрипт может " "настаивать на своей зависимости от другой службы, просто принудительно " "запуская её. Это может быть необходимо, когда другая служба является " "опциональной и не запускается самостоятельно, потому что системный " "администратор ошибочно отключил её в man:rc.conf[5]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:620 msgid "" "With this general knowledge in mind, let us consider the simple daemon " "script enhanced with dependency stuff:" msgstr "" "С учетом этих общих знаний рассмотрим простой скрипт демона, дополненный " "зависимостями:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:629 #, no-wrap msgid "" "# PROVIDE: mumbled oldmumble <.>\n" "# REQUIRE: DAEMON cleanvar frotz <.>\n" "# BEFORE: LOGIN <.>\n" "# KEYWORD: nojail shutdown <.>\n" msgstr "" "# PROVIDE: mumbled oldmumble <.>\n" "# REQUIRE: DAEMON cleanvar frotz <.>\n" "# BEFORE: LOGIN <.>\n" "# KEYWORD: nojail shutdown <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:637 #, no-wrap msgid "" "command=\"/usr/sbin/${name}\"\n" "start_precmd=\"${name}_prestart\"\n" msgstr "" "command=\"/usr/sbin/${name}\"\n" "start_precmd=\"${name}_prestart\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:646 #, no-wrap msgid "" "mumbled_prestart()\n" "{\n" "\tif ! checkyesno frotz_enable && \\\n" "\t ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then\n" "\t\tforce_depend frotz || return 1 <.>\n" "\tfi\n" "\treturn 0\n" "}\n" msgstr "" "mumbled_prestart()\n" "{\n" "\tif ! checkyesno frotz_enable && \\\n" "\t ! /etc/rc.d/frotz forcestatus 1>/dev/null 2>&1; then\n" "\t\tforce_depend frotz || return 1 <.>\n" "\tfi\n" "\treturn 0\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:652 msgid "As before, detailed analysis follows:" msgstr "Как и ранее, следует детальный анализ:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:655 msgid "" "➊ That line declares the names of \"conditions\" our script " "provides. Now other scripts can record a dependency on our script by those " "names." msgstr "" "➊ Эта строка объявляет названия \"условий\", которые предоставляет " "наш скрипт. Теперь другие скрипты могут указывать зависимость от нашего " "скрипта по этим именам." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:660 msgid "" "Usually a script specifies a single condition provided. However, nothing " "prevents us from listing several conditions there, e.g., for compatibility " "reasons." msgstr "" "Обычно скрипт указывает одно предоставленное условие. Однако ничто не мешает " "нам перечислить несколько условий, например, по причинам совместимости." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:662 msgid "" "In any case, the name of the main, or the only, `PROVIDE:` condition should " "be the same as `${name}`." msgstr "" "В любом случае, название основного или единственного условия `PROVIDE:` " "должно совпадать с `${name}`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:666 msgid "" "➋➌ So our script indicates which \"conditions\" provided by " "other scripts it depends on. According to the lines, our script asks man:" "rcorder[8] to put it after the script(s) providing [.filename]#DAEMON# and [." "filename]#cleanvar#, but before that providing [.filename]#LOGIN#." msgstr "" "➋➌ Таким образом, наш скрипт указывает, от каких \"условий\", " "предоставляемых другими скриптами, он зависит. Согласно строкам, наш скрипт " "просит man:rcorder[8] разместить его после скрипта(ов), предоставляющих [." "filename]#DAEMON# и [.filename]#cleanvar#, но перед тем, который " "предоставляет [.filename]#LOGIN#." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:672 msgid "" "The `BEFORE:` line should not be abused to work around an incomplete " "dependency list in the other script. The appropriate case for using `BEFORE:" "` is when the other script does not care about ours, but our script can do " "its task better if run before the other one. A typical real-life example is " "the network interfaces vs. the firewall: While the interfaces do not depend " "on the firewall in doing their job, the system security will benefit from " "the firewall being ready before there is any network traffic." msgstr "" "Строку `BEFORE:` не следует использовать для обхода неполного списка " "зависимостей в другом скрипте. Правильный случай для использования `BEFORE:` " "— когда другой скрипт не зависит от нашего, но наш скрипт может выполнить " "свою задачу лучше, если запустится до другого. Типичный пример из реальной " "жизни — сетевые интерфейсы и межсетевой экран: хотя интерфейсы не зависят от " "межсетевого экрана при выполнении своей работы, безопасность системы " "выиграет, если межсетевой экран будет готов до начала сетевого трафика." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:676 msgid "" "Besides conditions corresponding to a single service each, there are meta-" "conditions and their \"placeholder\" scripts used to ensure that certain " "groups of operations are performed before others. These are denoted by [." "filename]#UPPERCASE# names. Their list and purposes can be found in man:" "rc[8]." msgstr "" "Помимо условий, соответствующих отдельным службам, существуют метаусловия и " "их \"заглушки\" скриптов, используемые для обеспечения выполнения " "определённых групп операций в заданном порядке. Они обозначаются именами в [." "filename]#ВЕРХНЕМ РЕГИСТРЕ#. Их список и назначение можно найти в man:rc[8]." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:682 msgid "" "Keep in mind that putting a service name in the `REQUIRE:` line does not " "guarantee that the service will actually be running by the time our script " "starts. The required service may fail to start or just be disabled in man:" "rc.conf[5]. Obviously, man:rcorder[8] cannot track such details, and man:" "rc[8] will not do that either. Consequently, the application started by our " "script should be able to cope with any required services being unavailable. " "In certain cases, we can help it as discussed crossref:rc-" "scripting[forcedep, below]" msgstr "" "Имейте в виду, что указание имени службы в строке `REQUIRE:` не гарантирует, " "что служба действительно будет запущена к моменту старта нашего скрипта. " "Требуемая служба может не запуститься или быть отключена в man:rc.conf[5]. " "Очевидно, man:rcorder[8] не может отслеживать такие детали, и man:rc[8] тоже " "этого не делает. Следовательно, приложение, запускаемое нашим скриптом, " "должно быть способно обрабатывать ситуации, когда требуемые службы " -"недоступны. В некоторых случаях мы можем помочь ему, как описано в crossref" -":rc-scripting[forcedep, ниже]" +"недоступны. В некоторых случаях мы можем помочь ему, как описано в crossref:" +"rc-scripting[forcedep, ниже]" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:687 msgid "" "[[keywords]]➍ As we remember from the above text, man:rcorder[8] " "keywords can be used to select or leave out some scripts. Namely any man:" "rcorder[8] consumer can specify through `-k` and `-s` options which keywords " "are on the \"keep list\" and \"skip list\", respectively. From all the " "files to be dependency sorted, man:rcorder[8] will pick only those having a " "keyword from the keep list (unless empty) and not having a keyword from the " "skip list." msgstr "" -"[[keywords]]➍ Как мы помним из текста выше, ключевые слова " -"man:rcorder[8] могут использоваться для выбора или исключения некоторых " +"[[keywords]]➍ Как мы помним из текста выше, ключевые слова man:" +"rcorder[8] могут использоваться для выбора или исключения некоторых " "скриптов. А именно, любой потребитель man:rcorder[8] может указать с помощью " "опций `-k` и `-s`, какие ключевые слова находятся в \"списке сохранения\" и " "\"списке пропуска\" соответственно. Из всех файлов, подлежащих сортировке по " "зависимостям, man:rcorder[8] выберет только те, которые имеют ключевое слово " "из списка сохранения (если он не пуст) и не имеют ключевого слова из списка " "пропуска." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:690 msgid "" "In FreeBSD, man:rcorder[8] is used by [.filename]#/etc/rc# and [.filename]#/" "etc/rc.shutdown#. These two scripts define the standard list of FreeBSD [." "filename]#rc.d# keywords and their meanings as follows:" msgstr "" "В FreeBSD, man:rcorder[8] используется [.filename]#/etc/rc# и [.filename]#/" "etc/rc.shutdown#. Эти два скрипта определяют стандартный список ключевых " "слов [.filename]#rc.d# FreeBSD и их значения следующим образом:" #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:691 #, no-wrap msgid "nojail" msgstr "nojail" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:693 msgid "" "The service is not for man:jail[8] environment. The automatic startup and " "shutdown procedures will ignore the script if inside a jail." msgstr "" "Сервис не предназначен для окружения man:jail[8]. Процедуры автоматического " "запуска и остановки будут игнорировать скрипт, если он находится внутри " "клетки." #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:694 #, no-wrap msgid "nostart" msgstr "nostart" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:697 msgid "" "The service is to be started manually or not started at all. The automatic " "startup procedure will ignore the script. In conjunction with the [." "filename]#shutdown# keyword, this can be used to write scripts that do " "something only at system shutdown." msgstr "" "Служба должна запускаться вручную или не запускаться вовсе. Процедура " -"автоматического запуска проигнорирует скрипт. В сочетании с ключевым словом [" -".filename]#shutdown# это может использоваться для написания скриптов, " +"автоматического запуска проигнорирует скрипт. В сочетании с ключевым словом " +"[.filename]#shutdown# это может использоваться для написания скриптов, " "выполняющих действия только при выключении системы." #. type: Labeled list #: documentation/content/en/articles/rc-scripting/_index.adoc:698 #, no-wrap msgid "shutdown" msgstr "shutdown" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:699 msgid "" "This keyword is to be listed __explicitly__ if the service needs to be " "stopped before system shutdown." msgstr "" "Этот ключевой параметр должен быть указан __явно__, если службу необходимо " "остановить перед завершением работы системы." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:712 msgid "" "When the system is going to shut down, [.filename]#/etc/rc.shutdown# runs. " "It assumes that most [.filename]#rc.d# scripts have nothing to do at that " "time. Therefore [.filename]#/etc/rc.shutdown# selectively invokes [." "filename]#rc.d# scripts with the [.filename]#shutdown# keyword, effectively " "ignoring the rest of the scripts. For even faster shutdown, [.filename]#/" "etc/rc.shutdown# passes the [.filename]#faststop# command to the scripts it " "runs so that they skip preliminary checks, e.g., the pidfile check. As " "dependent services should be stopped before their prerequisites, [." "filename]#/etc/rc.shutdown# runs the scripts in reverse dependency order. " "If writing a real [.filename]#rc.d# script, you should consider whether it " "is relevant at system shutdown time. E.g., if your script does its work in " "response to the [.filename]#start# command only, then you need not to " "include this keyword. However, if your script manages a service, it is " "probably a good idea to stop it before the system proceeds to the final " "stage of its shutdown sequence described in man:halt[8]. In particular, a " "service should be stopped explicitly if it needs considerable time or " "special actions to shut down cleanly. A typical example of such a service " "is a database engine." msgstr "" "Когда система собирается завершить работу, выполняется [.filename]#/etc/rc." "shutdown#. Предполагается, что большинству скриптов [.filename]#rc.d# в этот " "момент нечего делать. Поэтому [.filename]#/etc/rc.shutdown# выборочно " "запускает скрипты [.filename]#rc.d# с ключевым словом [.filename]#shutdown#, " "фактически игнорируя остальные скрипты. Для ещё более быстрого завершения " "работы [.filename]#/etc/rc.shutdown# передаёт команду [.filename]#faststop# " "запускаемым скриптам, чтобы они пропускали предварительные проверки, " "например, проверку pid-файла. Поскольку зависимые службы должны быть " "остановлены до своих зависимостей, [.filename]#/etc/rc.shutdown# запускает " "скрипты в обратном порядке зависимостей. Если вы пишете настоящий скрипт [." "filename]#rc.d#, стоит подумать, актуален ли он во время завершения работы " "системы. Например, если ваш скрипт выполняет свою работу только в ответ на " "команду [.filename]#start#, то включать это ключевое слово не нужно. Однако " "если ваш скрипт управляет службой, вероятно, стоит остановить её до того, " -"как система перейдёт к финальной стадии завершения работы, описанной в " -"man:halt[8]. В частности, службу следует останавливать явно, если для её " +"как система перейдёт к финальной стадии завершения работы, описанной в man:" +"halt[8]. В частности, службу следует останавливать явно, если для её " "корректного завершения требуется значительное время или специальные " "действия. Типичный пример такой службы — система управления базами данных." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:716 msgid "" "[[forcedep]]➎ To begin with, `force_depend` should be used with much " "care. It is generally better to revise the hierarchy of configuration " "variables for your [.filename]#rc.d# scripts if they are interdependent." msgstr "" "[[forcedep]]➎ Прежде всего, `force_depend` следует использовать с " "большой осторожностью. Обычно лучше пересмотреть иерархию конфигурационных " "переменных для ваших [.filename]#rc.d# скриптов, если они взаимозависимы." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:725 msgid "" "If you still cannot do without `force_depend`, the example offers an idiom " "of how to invoke it conditionally. In the example, our `mumbled` daemon " "requires that another one, `frotz`, be started in advance. However, `frotz` " "is optional, too; and man:rcorder[8] knows nothing about such details. " "Fortunately, our script has access to all man:rc.conf[5] variables. If " "`frotz_enable` is true, we hope for the best and rely on [.filename]#rc.d# " "to have started `frotz`. Otherwise we forcibly check the status of " "`frotz`. Finally, we enforce our dependency on `frotz` if it is found to be " "not running. A warning message will be emitted by `force_depend` because it " "should be invoked only if a misconfiguration has been detected." msgstr "" "Если вам всё ещё не обойтись без `force_depend`, в примере показано, как " "вызвать его условно. В примере наш демон `mumbled` требует, чтобы другой " "демон, `frotz`, был запущен заранее. Однако `frotz` также является " "опциональным, и man:rcorder[8] ничего не знает о таких деталях. К счастью, " "наш скрипт имеет доступ ко всем переменным man:rc.conf[5]. Если " "`frotz_enable` имеет значение true, мы надеемся на лучшее и полагаемся на [." "filename]#rc.d#, что `frotz` был запущен. В противном случае мы " "принудительно проверяем статус `frotz`. Наконец, мы принудительно " "устанавливаем зависимость от `frotz`, если обнаруживаем, что он не запущен. " "`force_depend` выдаст предупреждение, так как его следует вызывать только в " "случае обнаружения неправильной конфигурации." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:727 #, no-wrap msgid "Giving more flexibility to an rc.d script" msgstr "Придание большей гибкости скрипту rc.d" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:736 msgid "" "When invoked during startup or shutdown, an [.filename]#rc.d# script is " "supposed to act on the entire subsystem it is responsible for. E.g., [." "filename]#/etc/rc.d/netif# should start or stop all network interfaces " "described by man:rc.conf[5]. Either task can be uniquely indicated by a " "single command argument such as `start` or `stop`. Between startup and " "shutdown, [.filename]#rc.d# scripts help the admin to control the running " "system, and it is when the need for more flexibility and precision arises. " "For instance, the admin may want to add the settings of a new network " "interface to man:rc.conf[5] and then to start it without interfering with " "the operation of the existing interfaces. Next time the admin may need to " "shut down a single network interface. In the spirit of the command line, " "the respective [.filename]#rc.d# script calls for an extra argument, the " "interface name." msgstr "" "При вызове во время запуска или завершения работы скрипт [.filename]#rc.d# " "должен воздействовать на всю подсистему, за которую он отвечает. Например, [." "filename]#/etc/rc.d/netif# должен запускать или останавливать все сетевые " "интерфейсы, описанные в man:rc.conf[5]. Любая из этих задач может быть " "однозначно указана единственным аргументом команды, таким как `start` или " "`stop`. Между запуском и завершением работы скрипты [.filename]#rc.d# " "помогают администратору управлять работающей системой, и именно тогда " "возникает потребность в большей гибкости и точности. Например, администратор " "может добавить настройки нового сетевого интерфейса в man:rc.conf[5], а " "затем запустить его, не затрагивая работу существующих интерфейсов. В " "следующий раз администратору может потребоваться остановить отдельный " "сетевой интерфейс. В духе командной строки, соответствующий скрипт [." "filename]#rc.d# требует дополнительного аргумента — имени интерфейса." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:739 msgid "" "Fortunately, man:rc.subr[8] allows for passing any number of arguments to " "script's methods (within the system limits). Due to that, the changes in " "the script itself can be minimal." msgstr "" -"К счастью, man:rc.subr[8] позволяет передавать любое количество аргументов (" -"в пределах системных ограничений) методам скрипта. Благодаря этому изменения " -"в самом скрипте могут быть минимальными." +"К счастью, man:rc.subr[8] позволяет передавать любое количество аргументов " +"(в пределах системных ограничений) методам скрипта. Благодаря этому " +"изменения в самом скрипте могут быть минимальными." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:744 msgid "" "How can man:rc.subr[8] gain access to the extra command-line arguments. " "Should it just grab them directly? Not by any means. Firstly, an man:sh[1] " "function has no access to the positional parameters of its caller, but man:" "rc.subr[8] is just a sack of such functions. Secondly, the good manner of [." "filename]#rc.d# dictates that it is for the main script to decide which " "arguments are to be passed to its methods." msgstr "" "Как man:rc.subr[8] может получить доступ к дополнительным аргументам " "командной строки. Должен ли он просто захватывать их напрямую? Ни в коем " "случае. Во-первых, функция man:sh[1] не имеет доступа к позиционным " "параметрам своего вызывающего объекта, но man:rc.subr[8] — это просто набор " "таких функций. Во-вторых, хороший стиль [.filename]#rc.d# предписывает, что " "именно главный скрипт должен решать, какие аргументы передавать его методам." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:748 msgid "" "So the approach adopted by man:rc.subr[8] is as follows: `run_rc_command` " "passes on all its arguments but the first one to the respective method " "verbatim. The first, omitted, argument is the name of the method itself: " "`start`, `stop`, etc. It will be shifted out by `run_rc_command`, so what " "is `$2` in the original command line will be presented as `$1` to the " "method, and so on." msgstr "" "Итак, подход, принятый в man:rc.subr[8], следующий: `run_rc_command` " "передаёт все свои аргументы, кроме первого, в соответствующий метод в " -"неизменном виде. Первый, опущенный аргумент — это имя самого метода: `start`" -", `stop` и т.д. Он будет удалён с помощью `shift` в `run_rc_command`, так " -"что то, что было `$2` в оригинальной командной строке, будет представлено " -"как `$1` в методе, и так далее." +"неизменном виде. Первый, опущенный аргумент — это имя самого метода: " +"`start`, `stop` и т.д. Он будет удалён с помощью `shift` в `run_rc_command`, " +"так что то, что было `$2` в оригинальной командной строке, будет " +"представлено как `$1` в методе, и так далее." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:751 msgid "" "To illustrate this opportunity, let us modify the primitive dummy script so " "that its messages depend on the additional arguments supplied. Here we go:" msgstr "" "Чтобы проиллюстрировать эту возможность, давайте изменим примитивный скрипт-" "заглушку так, чтобы его сообщения зависели от дополнительных переданных " "аргументов. Вот как это выглядит:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:763 #, no-wrap msgid "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" "kiss_cmd=\"${name}_kiss\"\n" "extra_commands=\"kiss\"\n" msgstr "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" "kiss_cmd=\"${name}_kiss\"\n" "extra_commands=\"kiss\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:772 #, no-wrap msgid "" "dummy_start()\n" "{\n" " if [ $# -gt 0 ]; then <.>\n" " echo \"Greeting message: $*\"\n" " else\n" " echo \"Nothing started.\"\n" " fi\n" "}\n" msgstr "" "dummy_start()\n" "{\n" " if [ $# -gt 0 ]; then <.>\n" " echo \"Greeting message: $*\"\n" " else\n" " echo \"Nothing started.\"\n" " fi\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:788 #, no-wrap msgid "" "dummy_kiss()\n" "{\n" " echo -n \"A ghost gives you a kiss\"\n" " if [ $# -gt 0 ]; then <.>\n" " echo -n \" and whispers: $*\"\n" " fi\n" " case \"$*\" in\n" " *[.!?])\n" " echo\n" " ;;\n" " *)\n" " echo .\n" " ;;\n" " esac\n" "}\n" msgstr "" "dummy_kiss()\n" "{\n" " echo -n \"A ghost gives you a kiss\"\n" " if [ $# -gt 0 ]; then <.>\n" " echo -n \" and whispers: $*\"\n" " fi\n" " case \"$*\" in\n" " *[.!?])\n" " echo\n" " ;;\n" " *)\n" " echo .\n" " ;;\n" " esac\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:791 #, no-wrap msgid "" "load_rc_config $name\n" "run_rc_command \"$@\" <.>\n" msgstr "" "load_rc_config $name\n" "run_rc_command \"$@\" <.>\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:794 msgid "What essential changes can we notice in the script?" msgstr "Какие основные изменения мы можем заметить в скрипте?" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:799 msgid "" "➊ All arguments you type after `start` can end up as positional " "parameters to the respective method. We can use them in any way according " "to our task, skills, and fancy. In the current example, we just pass all of " "them to man:echo[1] as one string in the next line - note `$*` within the " "double quotes. Here is how the script can be invoked now:" msgstr "" "➊ Все аргументы, которые вы вводите после `start`, могут стать " "позиционными параметрами для соответствующего метода. Мы можем использовать " "их любым способом в соответствии с нашей задачей, навыками и предпочтениями. " "В текущем примере мы просто передаем все их в man:echo[1] как одну строку в " "следующей строке — обратите внимание на `$*` в двойных кавычках. Вот как " "теперь можно вызывать этот скрипт:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:804 #, no-wrap msgid "" "# /etc/rc.d/dummy start\n" "Nothing started.\n" msgstr "" "# /etc/rc.d/dummy start\n" "Nothing started.\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:807 #, no-wrap msgid "" "# /etc/rc.d/dummy start Hello world!\n" "Greeting message: Hello world!\n" msgstr "" "# /etc/rc.d/dummy start Hello world!\n" "Greeting message: Hello world!\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:811 msgid "" "➋ The same applies to any method our script provides, not only to a " "standard one. We have added a custom method named `kiss`, and it can take " "advantage of the extra arguments not less than `start` does. E.g.:" msgstr "" "➋ То же самое относится к любому методу, который предоставляет наш " "скрипт, не только к стандартному. Мы добавили пользовательский метод с " "именем `kiss`, и он может использовать дополнительные аргументы не меньше, " "чем `start`. Например:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:816 #, no-wrap msgid "" "# /etc/rc.d/dummy kiss\n" "A ghost gives you a kiss.\n" msgstr "" "# /etc/rc.d/dummy kiss\n" "A ghost gives you a kiss.\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:819 #, no-wrap msgid "" "# /etc/rc.d/dummy kiss Once I was Etaoin Shrdlu...\n" "A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu...\n" msgstr "" "# /etc/rc.d/dummy kiss Once I was Etaoin Shrdlu...\n" "A ghost gives you a kiss and whispers: Once I was Etaoin Shrdlu...\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:822 msgid "" "➌ If we want just to pass all extra arguments to any method, we can " "merely substitute `\"$@\"` for `\"$1\"` in the last line of our script, " "where we invoke `run_rc_command`." msgstr "" "➌ Если мы хотим просто передать все дополнительные аргументы любому " "методу, мы можем просто заменить `\"$@\"` на `\"$1\"` в последней строке " "нашего скрипта, где мы вызываем `run_rc_command`." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:828 msgid "" -"An man:sh[1] programmer ought to understand the subtle difference between " -"`$*` and `$@` as the ways to designate all positional parameters. For its " -"in-depth discussion, refer to a good handbook on man:sh[1] scripting. _Do " -"not_ use the expressions until you fully understand them because their " -"misuse will result in buggy and insecure scripts." +"An man:sh[1] programmer ought to understand the subtle difference between `" +"$*` and `$@` as the ways to designate all positional parameters. For its in-" +"depth discussion, refer to a good handbook on man:sh[1] scripting. _Do not_ " +"use the expressions until you fully understand them because their misuse " +"will result in buggy and insecure scripts." msgstr "" "Программист man:sh[1] должен понимать тонкую разницу между `$*` и `$@` как " "способами обозначения всех позиционных параметров. Для детального обсуждения " "обратитесь к хорошему руководству по написанию скриптов на man:sh[1]. _Не " "используйте_ эти выражения, пока полностью не поймёте их, так как их " "неправильное применение приведёт к созданию ненадёжных и небезопасных " "скриптов." #. type: delimited block = 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:835 msgid "" "Currently `run_rc_command` may have a bug that prevents it from keeping the " "original boundaries between arguments. That is, arguments with embedded " "whitespace may not be processed correctly. The bug stems from `$*` misuse." msgstr "" "В настоящее время в `run_rc_command` может присутствовать ошибка, которая " "мешает ему сохранять исходные границы между аргументами. То есть аргументы с " "встроенными пробелами могут обрабатываться некорректно. Ошибка возникает из-" "за неправильного использования `$*`." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:838 #, no-wrap msgid "Making a script ready for Service Jails" msgstr "Подготовка скрипта для сервисных клеток" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:841 msgid "" "Scripts which start a long running service are suitable for service jails, " "and should come with a suitable service jail configuration." msgstr "" "Скрипты, запускающие долго работающую службу, подходят для служебных клеток " "и должны поставляться с соответствующей конфигурацией сервисной клетки." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:843 msgid "" "Some examples of scripts which are not suitable to run in a service jail:" msgstr "" "Некоторые примеры скриптов, которые не подходят для запуска в сервисной " "клетке:" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:845 msgid "" "any script which in the start command only changes a runtime setting for " "programs or the kernel," msgstr "" "любой скрипт, который в команде start только изменяет настройки времени " "выполнения для программ или ядра," #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:846 msgid "or tries to mount something," msgstr "или пытается что-то смонтировать," #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:847 msgid "or finds and deletes files" msgstr "или находит и удаляет файлы" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:849 msgid "" "Scripts not suitable to run in a service jail need to prevent the use within " "service jails." msgstr "" "Необходимо предотвратить использование внутри сервисных клеток скриптов, не " "предназначенных для запуска в сервисной клетке." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:851 msgid "" "A script with a long running service which needs to do something listed " "above before the start or after the stop, can either be split-up into two " "scripts with dependencies, or use the precommand and postcommand parts of " "the script to perform this action." msgstr "" "Скрипт с долго работающей службой, которому необходимо выполнить одно из " "перечисленных выше действий перед запуском или после остановки, может быть " "разделён на два скрипта с зависимостями или использовать части `precommand` " "и `postcommand` скрипта для выполнения этого действия." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:854 msgid "" "By default, only the start and stop parts of a script are run within a " "service jail, the rest is run outside the jail. As such any setting used in " "the start/stop parts of the script can not be set from e.g. a precommand." msgstr "" "По умолчанию только части `start` и `stop` скрипта выполняются внутри " "сервисной клетки, остальное выполняется вне клетки. Таким образом, любые " "настройки, используемые в частях `start`/`stop` скрипта, не могут быть " "заданы, например, из `precommand`." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:856 msgid "" -"To make a script ready for use with extref:../../books/handbook/jails/" -"#service-jails[Service Jails], only one more config line needs to be " -"inserted:" +"To make a script ready for use with extref:{handbook}jails[Service Jails, " +"service-jails], only one more config line needs to be inserted:" msgstr "" -"Чтобы сделать скрипт готовым к использованию с extref:../../books/handbook/" -"jails/#service-jails[Сервисными Клетками], необходимо добавить всего одну " -"строку конфигурации:" +"Чтобы сделать скрипт готовым к использованию с extref:{handbook}jails[" +"Сервисными Клетками, service-jails], необходимо добавить всего одну строку " +"конфигурации:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:866 #: documentation/content/en/articles/rc-scripting/_index.adoc:899 #, no-wrap msgid "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" msgstr "" "name=\"dummy\"\n" "start_cmd=\"${name}_start\"\n" "stop_cmd=\":\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:868 #, no-wrap msgid ": ${dummy_svcj_options:=\"\"} <.>\n" msgstr ": ${dummy_svcj_options:=\"\"} <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:873 #: documentation/content/en/articles/rc-scripting/_index.adoc:904 #, no-wrap msgid "" "dummy_start()\n" "{\n" " echo \"Nothing started.\"\n" "}\n" msgstr "" "dummy_start()\n" "{\n" " echo \"Nothing started.\"\n" "}\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:880 msgid "" "➊ If it makes sense that the script runs in a jail, it must have an " "overridable service jails configuration. If it does not need network access " "or access to any other resource which is restricted in jails, an empty " "config like displayed is enough." msgstr "" "➊ Если имеет смысл, чтобы скрипт выполнялся в клетке, он должен иметь " "переопределяемую конфигурацию сервисных клеток. Если ему не требуется доступ " "к сети или любым другим ресурсам, которые ограничены в клетках, достаточно " "пустой конфигурации, как показано." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:885 msgid "" "Strictly speaking an empty config is not needed, but it explicitly describes " "that the script is service jails ready, and that it does not need additional " "jail permissions. As such it is highly recommended to add such an empty " "config in such a case. The most common option to use is \"net_basic\", " "which enables the use of the hosts IPv4 and IPv6 addresses. All possible " "options are explained in man:rc.conf[5]." msgstr "" "Строго говоря, пустая конфигурация не обязательна, но она явно указывает, " "что скрипт готов к работе с сервисными клетками и не требует дополнительных " "разрешений для клеток. Поэтому настоятельно рекомендуется добавить такую " "пустую конфигурацию в таком случае. Наиболее распространённая опция — " "\"net_basic\", которая позволяет использовать IPv4 и IPv6 адреса хоста. Все " "возможные опции описаны в man:rc.conf[5]." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:887 msgid "" "If a setting for the start/stop depends on variables from the rc-framework " "(e.g., set inside man:rc.conf[5]), this needs to be handled by " "``load_rc_config`` and ``run_rc_command`` instead of inside a precommand." msgstr "" -"Если настройка запуска/остановки зависит от переменных из rc-фреймворка (" -"например, заданных в man:rc.conf[5]), это должно обрабатываться с помощью " +"Если настройка запуска/остановки зависит от переменных из rc-фреймворка " +"(например, заданных в man:rc.conf[5]), это должно обрабатываться с помощью " "``load_rc_config`` и ``run_rc_command``, а не внутри precommand." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:889 msgid "" "If for some reason a script can not be run within a service jail, e.g., " "because it is not possible to run or it does not make sense to run it in a " "jail, use the following:" msgstr "" "Если по какой-то причине скрипт не может быть запущен внутри сервисной " "клетки, например, потому что его невозможно запустить или нет смысла " "запускать его в клетке, используйте следующее:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:908 #, no-wrap msgid "" "load_rc_config $name\n" "dummy_svcj=\"NO\"\t\t# does not make sense to run in a svcj <.>\n" "run_rc_command \"$1\"\n" msgstr "" "load_rc_config $name\n" "dummy_svcj=\"NO\"\t\t# does not make sense to run in a svcj <.>\n" "run_rc_command \"$1\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:911 msgid "" "➊ The disabling needs to happen after the ``load_rc_config`` call, " "else a man:rc.conf[5] setting may override it." msgstr "" "➊ Отключение должно происходить после вызова ``load_rc_config``, " "иначе параметр из man:rc.conf[5] может переопределить его." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:913 #, no-wrap msgid "Advanced rc-scripting: Instancing" msgstr "Продвинутые сценарии rc: запуск нескольких экземпляров" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:921 msgid "" "Sometimes it is useful to run several instances of a service. Typically you " "want to be able to start/stop such instances independently, and you want to " "have a separate config file for each instance. Each instance should be " "started at boot, survive updates, and benefit from updates." msgstr "" "Иногда полезно запускать несколько экземпляров службы. Обычно требуется " "иметь возможность независимо запускать/останавливать такие экземпляры, а " "также иметь отдельный файл конфигурации для каждого из них. Каждый экземпляр " "должен запускаться при загрузке, после обновления каждый экземпляр должен " "оставаться, и при этом должен обновиться." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:923 msgid "Here is an example of a rc script which supports this:" msgstr "Вот пример rc-скрипта, который поддерживает это:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:941 #, no-wrap msgid "" "#\n" "# PROVIDE: dummy\n" "# REQUIRE: NETWORKING SERVERS\n" "# KEYWORD: shutdown\n" "#\n" "# Add these following line to /etc/rc.conf.local or /etc/rc.conf\n" "# to enable this service:\n" "#\n" "# dummy_enable (bool):\tSet it to YES to enable dummy on startup.\n" "#\t\t\tDefault: NO\n" "# dummy_user (string):\tUser account to run with.\n" "#\t\t\tDefault: www\n" "#\n" msgstr "" "#\n" "# PROVIDE: dummy\n" "# REQUIRE: NETWORKING SERVERS\n" "# KEYWORD: shutdown\n" "#\n" "# Add these following line to /etc/rc.conf.local or /etc/rc.conf\n" "# to enable this service:\n" "#\n" "# dummy_enable (bool):\tSet it to YES to enable dummy on startup.\n" "#\t\t\tDefault: NO\n" "# dummy_user (string):\tUser account to run with.\n" "#\t\t\tDefault: www\n" "#\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:954 #, no-wrap msgid "" "case $0 in <.>\n" "/etc/rc*)\n" "\t# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),\n" "\t# so get the name of the script from $_file\n" "\tname=$_file\n" "\t;;\n" "*)\n" "\tname=$0\n" "\t;;\n" "esac\n" msgstr "" "case $0 in <.>\n" "/etc/rc*)\n" "\t# during boot (shutdown) $0 is /etc/rc (/etc/rc.shutdown),\n" "\t# so get the name of the script from $_file\n" "\tname=$_file\n" "\t;;\n" "*)\n" "\tname=$0\n" "\t;;\n" "esac\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:959 #, no-wrap msgid "" "name=${name##*/} <.>\n" "rcvar=\"${name}_enable\" <.>\n" "desc=\"Short description of this service\"\n" "command=\"/usr/local/sbin/dummy\"\n" msgstr "" "name=${name##*/} <.>\n" "rcvar=\"${name}_enable\" <.>\n" "desc=\"Short description of this service\"\n" "command=\"/usr/local/sbin/dummy\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:961 #, no-wrap msgid "load_rc_config \"$name\"\n" msgstr "load_rc_config \"$name\"\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:965 #, no-wrap msgid "" "eval \"${rcvar}=\\${${rcvar}:-'NO'}\" <.>\n" "eval \"${name}_svcj_options=\\${${name}_svcj_options:-'net_basic'}\" <.>\n" "eval \"_dummy_user=\\${${name}_user:-'www'}\" <.>\n" msgstr "" "eval \"${rcvar}=\\${${rcvar}:-'NO'}\" <.>\n" "eval \"${name}_svcj_options=\\${${name}_svcj_options:-'net_basic'}\" <.>\n" "eval \"_dummy_user=\\${${name}_user:-'www'}\" <.>\n" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:970 #, no-wrap msgid "" "_dummy_configname=/usr/local/etc/${name}.cfg <.>\n" "pidfile=/var/run/dummy/${name}.pid\n" "required_files ${_dummy_configname}\n" "command_args=\"-u ${_dummy_user} -c ${_dummy_configfile} -p ${pidfile}\"\n" msgstr "" "_dummy_configname=/usr/local/etc/${name}.cfg <.>\n" "pidfile=/var/run/dummy/${name}.pid\n" "required_files ${_dummy_configname}\n" "command_args=\"-u ${_dummy_user} -c ${_dummy_configfile} -p ${pidfile}\"\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:978 msgid "" "➊ and ➋ make sure to set the name variable to the man:" "basename[1] of the script name. If the filename is [.filename]#/usr/local/" "etc/rc.d/dummy#, name is set to [.filename]#dummy#. This way changing the " "filename of the rc script changes automatically the content of the name " "variable." msgstr "" "➊ и ➋ убедитесь, что переменная name установлена в значение " -"man:basename[1] имени скрипта. Если имя файла — [.filename]#/usr/local/etc/rc" -".d/dummy#, то name будет установлено в [.filename]#dummy#. Таким образом, " +"man:basename[1] имени скрипта. Если имя файла — [.filename]#/usr/local/etc/" +"rc.d/dummy#, то name будет установлено в [.filename]#dummy#. Таким образом, " "изменение имени rc-скрипта автоматически изменит содержимое переменной name." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:981 msgid "" "➌ specifies the variable name which is used in [.filename]#rc.conf# " "to enable this service based upon the filename of this script. In this " "example this resolves to dummy_enable." msgstr "" "➌ указывает имя переменной, которая используется в [.filename]#rc." "conf# для включения этой службы на основе имени файла этого скрипта. В " "данном примере это преобразуется в dummy_enable." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:983 msgid "➍ makes sure the default for the _enable variable is NO." msgstr "" "➍ убеждается, что значение по умолчанию для переменной _enable " "установлено в NO." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:986 msgid "" "➎ is an example of having some defaults for service specific " "framework variables, in this case the service jails options." msgstr "" "➎ Вот пример установки некоторых значений по умолчанию для переменных " "фреймворка, специфичных для службы, в данном случае — опций клетки службы." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:988 msgid "" "➏ and ➐ set variables internal to the script (pay attention to " "the underscore in front of _dummy_user to make it different from dummy_user " "which can be set in [.filename]#rc.conf#)." msgstr "" -"➏ и ➐ устанавливают переменные, внутренние для скрипта (" -"обратите внимание на подчёркивание в начале _dummy_user, чтобы отличать её " +"➏ и ➐ устанавливают переменные, внутренние для скрипта " +"(обратите внимание на подчёркивание в начале _dummy_user, чтобы отличать её " "от dummy_user, которая может быть задана в [.filename]#rc.conf#)." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:991 msgid "" "The part in ➎ is for variables which are not used inside the script " "itself but in the rc framework. All the variables which are used as " "parameters somewhere in the script are assigned to a generic variable like " "in ➐ to make it more easy to reference them (no need to eval them at " "each place of use)." msgstr "" "Часть в ➎ предназначена для переменных, которые не используются " "внутри самого скрипта, но используются в рамках rc. Все переменные, которые " "используются как параметры в скрипте, присваиваются общей переменной, как в " "➐, чтобы упростить их использование (нет необходимости выполнять eval " "при каждом обращении)." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:994 msgid "" "This script will now behave differently if the start script has a different " "name. This allows to create symlinks to it:" msgstr "" "Этот скрипт теперь будет вести себя по-другому, если скрипт запуска имеет " "другое имя. Это позволяет создавать символьные ссылки на него:" #. type: delimited block . 4 #: documentation/content/en/articles/rc-scripting/_index.adoc:1000 #, no-wrap msgid "" "# ln -s dummy /usr/local/etc/rc.d/dummy_foo\n" "# sysrc dummy_foo_enable=YES\n" "# service dummy_foo start\n" msgstr "" "# ln -s dummy /usr/local/etc/rc.d/dummy_foo\n" "# sysrc dummy_foo_enable=YES\n" "# service dummy_foo start\n" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1005 msgid "" "The above creates an instance of the dummy service with the name dummy_foo. " "It does not use the config file [.filename]#/usr/local/etc/dummy.cfg# but " "the config file [.filename]#/usr/local/etc/dummy_foo.cfg# (➐), and it " "uses the PID file [.filename]#/var/run/dummy/dummy_foo.pid# instead of [." "filename]#/var/run/dummy/dummy.pid#." msgstr "" "Вышеприведенное создает экземпляр службы dummy с именем dummy_foo. Он " "использует не файл конфигурации [.filename]#/usr/local/etc/dummy.cfg#, а " "файл конфигурации [.filename]#/usr/local/etc/dummy_foo.cfg# (➐), и " "использует PID-файл [.filename]#/var/run/dummy/dummy_foo.pid# вместо [." "filename]#/var/run/dummy/dummy.pid#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1012 msgid "" "The services dummy and dummy_foo can be managed independently of each other, " "while having the start script update itself on package update (due to the " "symlink). This does not update the REQUIRE line, as such there is no easy " "way of depending on a specific instance. To depend upon a specific instance " "in the startup order a copy needs to be made instead of using a symlink. " "This prevents the automatic pick-up of changes to the start script when an " "update is installed." msgstr "" "Сервисы dummy и dummy_foo могут управляться независимо друг от друга, при " -"этом скрипт запуска обновляется автоматически при обновлении пакета (" -"благодаря символьной ссылке). Это не обновляет строку REQUIRE, поэтому нет " +"этом скрипт запуска обновляется автоматически при обновлении пакета " +"(благодаря символьной ссылке). Это не обновляет строку REQUIRE, поэтому нет " "простого способа зависеть от конкретного экземпляра. Чтобы зависеть от " "конкретного экземпляра в порядке запуска, необходимо создать копию вместо " "использования символьной ссылки. Это предотвращает автоматическое применение " "изменений в скрипте запуска при установке обновления." #. type: Title == #: documentation/content/en/articles/rc-scripting/_index.adoc:1014 #, no-wrap msgid "Further reading" msgstr "Дополнительная литература" #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1018 msgid "" "[[lukem]]http://www.mewburn.net/luke/papers/rc.d.pdf[The original article by " "Luke Mewburn] offers a general overview of [.filename]#rc.d# and detailed " "rationale for its design decisions. It provides insight on the whole [." "filename]#rc.d# framework and its place in a modern BSD operating system." msgstr "" "[[lukem]]http://www.mewburn.net/luke/papers/rc.d.pdf[Оригинальная статья " "Люка Мьюберна] предлагает общий обзор [.filename]#rc.d# и подробное " "обоснование принятых при его проектировании решений. В ней представлено " -"понимание всего фреймворка [.filename]#rc.d# и его места в современной " -"BSD-системе." +"понимание всего фреймворка [.filename]#rc.d# и его места в современной BSD-" +"системе." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1021 msgid "" "[[manpages]]The manual pages man:rc[8], man:rc.subr[8], and man:rcorder[8] " "document the [.filename]#rc.d# components in great detail. You cannot fully " "use the [.filename]#rc.d# power without studying the manual pages and " "referring to them while writing your own scripts." msgstr "" "[[manpages]]Руководства man:rc[8], man:rc.subr[8] и man:rcorder[8] подробно " "описывают компоненты [.filename]#rc.d#. Без изучения этих руководств и " "обращения к ним при написании собственных скриптов невозможно в полной мере " "использовать возможности [.filename]#rc.d#." #. type: Plain text #: documentation/content/en/articles/rc-scripting/_index.adoc:1025 msgid "" "The major source of working, real-life examples is [.filename]#/etc/rc.d# in " "a live system. Its contents are easy and pleasant to read because most " "rough corners are hidden deep in man:rc.subr[8]. Keep in mind though that " "the [.filename]#/etc/rc.d# scripts were not written by angels, so they might " "suffer from bugs and suboptimal design decisions. Now you can improve them!" msgstr "" "Основным источником рабочих, жизненных примеров является [.filename]#/etc/rc." "d# в работающей системе. Его содержимое легко и приятно читать, поскольку " "большинство сложных моментов скрыто глубоко в man:rc.subr[8]. Однако " "помните, что скрипты в [.filename]#/etc/rc.d# были написаны не ангелами, " "поэтому они могут содержать ошибки и неоптимальные решения. Теперь вы можете " "их улучшить!" diff --git a/documentation/content/ru/articles/releng/_index.adoc b/documentation/content/ru/articles/releng/_index.adoc index 055890b07c..c8032ff04d 100644 --- a/documentation/content/ru/articles/releng/_index.adoc +++ b/documentation/content/ru/articles/releng/_index.adoc @@ -1,358 +1,358 @@ --- 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: :sectnumlevels: 6 :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[Core Team 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}[Пересборка world, makeworld]] помогает поддерживать FreeBSD-STABLE в очень надежном состоянии даже до того, как активизируются мероприятия по обеспечению качества перед основным выпуском. +В промежуточный период между выпусками еженедельные снимки состояния системы автоматически создаются сборщиками 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]:: Некоторые уроки, извлеченные в процессе выпуска 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}[Запуск системы по сети (PXE) без использования локальных накопителей, network-diskless]] для загрузки систем по сети. +Инструмент установки и настройки системы 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 f970a926cf..63f6facf51 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-09-24 18:56+0300\n" -"PO-Revision-Date: 2025-09-05 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. 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 Hash Value: title +#. 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 msgid "Abstract" msgstr "Аннотация" #. type: delimited block = 4 #: documentation/content/en/articles/releng/_index.adoc:51 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 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 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/releng/_index.adoc:61 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:71 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}" +"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-" "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[Core Team FreeBSD]] — обеспечивает " +"разработки FreeBSD. Избранная группа разработчиков — link:https://www." +"FreeBSD.org/administration/#t-core[Core Team]footnote:[link:https://www." +"FreeBSD.org/administration/#t-core[Core Team FreeBSD]] — обеспечивает " "некоторый уровень руководства проектом." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:76 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 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\". Все ветви находятся в главном хранилище " +"Набор более стабильных ветвей поддерживается под названием \"FreeBSD-STABLE" +"\" или сокращённо \"-STABLE\". Все ветви находятся в главном хранилище " "Subversion, которое поддерживается проектом FreeBSD. FreeBSD-CURRENT — это " "\"передний край\" разработки FreeBSD, куда сначала попадают все новые " "изменения. FreeBSD-STABLE — это ветвь разработки, на основе которой " "выпускаются основные релизы. Изменения попадают в эту ветвь с другой " "скоростью и с общим предположением, что они сначала попали в FreeBSD-CURRENT " "и были тщательно протестированы сообществом пользователей." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:87 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 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}[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." +"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}[Пересборка world, " -"makeworld]] помогает поддерживать FreeBSD-STABLE в очень надежном состоянии " -"даже до того, как активизируются мероприятия по обеспечению качества перед " -"основным выпуском." +"\"`make buildworld`\" footnote:[extref:{handbook}cutting-edge[Пересборка " +"world, makeworld]] помогает поддерживать FreeBSD-STABLE в очень надежном " +"состоянии даже до того, как активизируются мероприятия по обеспечению " +"качества перед основным выпуском." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:93 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 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 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/]." +"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 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 #, no-wrap msgid "What This Article Describes" msgstr "Что описывает эта статья" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:107 msgid "The following sections of this article describe:" msgstr "Следующие разделы этой статьи описывают:" #. type: Labeled list #: documentation/content/en/articles/releng/_index.adoc:108 #, 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 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 #, 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 msgid "The actual build process." msgstr "Фактический процесс сборки." #. type: Labeled list #: documentation/content/en/articles/releng/_index.adoc:114 #, no-wrap msgid "crossref:releng[extensibility, Extensibility]" msgstr "crossref:releng[extensibility, Расширяемость]" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:116 msgid "How the base release may be extended by third parties." msgstr "Как базовый выпуск может быть расширен третьими сторонами." #. type: Labeled list #: documentation/content/en/articles/releng/_index.adoc:117 #, no-wrap msgid "crossref:releng[lessons-learned, Lessons Learned from FreeBSD 4.4]" msgstr "crossref:releng[lessons-learned, Уроки, извлеченные из FreeBSD 4.4]" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:119 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 #, no-wrap msgid "crossref:releng[future, Future Directions]" msgstr "crossref:releng[future, Перспективы развития]" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:122 msgid "Future directions of development." msgstr "Перспективные направления развития." #. type: Title == #: documentation/content/en/articles/releng/_index.adoc:124 #, no-wrap msgid "Release Process" msgstr "Процесс выпуска релиза" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:129 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 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 #, no-wrap msgid "Code Review" msgstr "Проверка кода" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:140 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}`. Процесс утверждения технически " +"переходит в режим «заморозки кода». В этот период все коммиты в ветку -" +"STABLE должны быть одобрены `{re}`. Процесс утверждения технически " "обеспечивается предкоммитным хуком. В этот период допускаются следующие виды " "изменений:" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:142 msgid "Bug fixes." msgstr "Исправления ошибок." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:143 msgid "Documentation updates." msgstr "Обновления документации." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:144 msgid "Security-related fixes of any kind." msgstr "Исправления, связанные с безопасностью, любого рода." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:145 msgid "Minor changes to device drivers, such as adding new Device IDs." msgstr "" "Незначительные изменения в драйверах устройств, такие как добавление новых " "идентификаторов устройств." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:146 msgid "Driver updates from the vendors." msgstr "Обновления драйверов от поставщиков." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:147 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 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 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 #, no-wrap msgid "Final Release Checklist" msgstr "Контрольный список финального выпуска" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:158 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 #, no-wrap msgid "Creating the Release Branch" msgstr "Создание ветки релиза" #. type: delimited block = 4 #: documentation/content/en/articles/releng/_index.adoc:165 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 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 #, 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 msgid "The next step is to create the _release branch_" msgstr "Следующий шаг — создание _ветки релиза_" #. type: delimited block . 4 #: documentation/content/en/articles/releng/_index.adoc:180 #, 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 msgid "This branch can be checked out:" msgstr "Эту ветку можно извлечь:" #. type: delimited block . 4 #: documentation/content/en/articles/releng/_index.adoc:187 #, 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 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 #, no-wrap msgid "FreeBSD Development Branch" msgstr "Ветка разработки FreeBSD" #. type: Target for macro image #: documentation/content/en/articles/releng/_index.adoc:194 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, 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 #, no-wrap msgid "branches-releng9.png" msgstr "branches-releng9.png" #. type: Title ==== #: documentation/content/en/articles/releng/_index.adoc:211 #, no-wrap msgid "Bumping up the Version Number" msgstr "Увеличение номера версии" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:214 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 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 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 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 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 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 msgid "[.filename]#src/Makefile.inc1#" msgstr "[.filename]#src/Makefile.inc1#" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:222 msgid "[.filename]#src/UPDATING#" msgstr "[.filename]#src/UPDATING#" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:223 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 msgid "[.filename]#src/release/Makefile#" msgstr "[.filename]#src/release/Makefile#" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:225 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 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 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 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 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 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 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 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 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 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 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] В настоящее время эта " "информация хранится в [.filename]#src/usr.sbin/bsdinstall/dist.c#." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:243 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 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 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 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 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 msgid "[.filename]#share/xml/news.xml#" msgstr "[.filename]#share/xml/news.xml#" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:251 msgid "Additionally, update the \"BSD Family Tree\" file:" msgstr "Кроме того, обновите файл \"Генеалогическое древо BSD\":" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:253 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 #, no-wrap msgid "Creating the Release Tag" msgstr "Создание тега релиза" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:257 msgid "" "When the final release is ready, the following command will create the " "`release/9.2.0` tag." msgstr "" -"Когда финальный выпуск будет готов, следующая команда создаст тег `release/" -"9.2.0`." +"Когда финальный выпуск будет готов, следующая команда создаст тег " +"`release/9.2.0`." #. type: delimited block . 4 #: documentation/content/en/articles/releng/_index.adoc:261 #, 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 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 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 #, no-wrap msgid "Release Building" msgstr "Сборка релиза" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:280 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 " +"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 #, no-wrap msgid "Building a Release" msgstr "Сборка релиза" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:285 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 #, 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 msgid "" -"After running these commands, all prepared release files are available in " -"[.filename]#/local3/release/R# directory." +"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 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 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 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 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 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 msgid "`make world` in the chrooted environment." msgstr "Запуск `make world` в окружении `chroot`." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:302 msgid "Build of Kerberos-related binaries." msgstr "Сборка связанных с Kerberos бинарных файлов." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:303 msgid "Build [.filename]#GENERIC# kernel." msgstr "Сборка ядра [.filename]#GENERIC#." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:304 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 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 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 msgid "Package up distribution tarballs of the binaries and sources." msgstr "" "Создание распространяемых tar-архивов с бинарными файлами и исходными кодами." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:308 msgid "Create FTP installation hierarchy." msgstr "Создание иерархии установки FTP." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:309 msgid "_(optionally)_ Create ISO images for CDROM/DVD media." msgstr "_(необязательно)_ Создание ISO-образов для носителей CDROM/DVD." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:311 msgid "" -"For more information about the release build infrastructure, please see " -"man:release[7]." +"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 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` для конкретного процессора." +"Важно удалить все специфичные для сайта настройки из [.filename]#/etc/make." +"conf#. Например, было бы неразумно распространять бинарные файлы, собранные " +"на системе с установленным `CPUTYPE` для конкретного процессора." #. type: Title === #: documentation/content/en/articles/releng/_index.adoc:318 #, no-wrap msgid "Contributed Software (\"ports\")" msgstr "Предоставленное программное обеспечение (\"порты\")" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:322 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 #, no-wrap msgid "Release ISOs" msgstr "Релизные ISO-образы" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:328 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:" +"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#, содержащий манифест диска. Этот _манифест_ можно " +"[.filename]#README.TXT#, объясняющий содержимое диска, файл [." +"filename]#CDROM.INF#, предоставляющий метаданные для диска, чтобы man:" +"bsdinstall[8] мог проверить и использовать содержимое, и файл [." +"filename]#filename.txt#, содержащий манифест диска. Этот _манифест_ можно " "создать простой командой:" #. type: delimited block . 4 #: documentation/content/en/articles/releng/_index.adoc:332 #, 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 msgid "The specific requirements of each CD are outlined below." msgstr "Конкретные требования для каждого CD приведены ниже." #. type: Title ==== #: documentation/content/en/articles/releng/_index.adoc:336 #, no-wrap msgid "Disc 1" msgstr "Диск 1" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:342 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 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#." +"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# в " +"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 #, no-wrap msgid "Disc 2" msgstr "Диск 2" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:353 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." +"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. Этот диск должен быть " -"загрузочным и также содержать сжатую копию репозитория CVS в директории " -"[.filename]#CVSROOT# и демонстрационные версии коммерческого ПО в директории " -"[.filename]#commerce#." +"содержит «живую файловую систему», которая может использоваться через man:" +"bsdinstall[8] для диагностики установки FreeBSD. Этот диск должен быть " +"загрузочным и также содержать сжатую копию репозитория CVS в директории [." +"filename]#CVSROOT# и демонстрационные версии коммерческого ПО в директории [." +"filename]#commerce#." #. type: Title ==== #: documentation/content/en/articles/releng/_index.adoc:354 #, no-wrap msgid "Multi-volume Support" msgstr "Поддержка нескольких томов" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:360 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 предложит ему вставить соответствующий диск." +"должен иметь установленную переменную `CD_VOLUME` в файле [.filename]#cdrom." +"inf#, чтобы bsdinstall мог определить, какой том является каким. Когда " +"пользователь пытается установить пакет, которого нет на текущем диске, " +"bsdinstall предложит ему вставить соответствующий диск." #. type: Title == #: documentation/content/en/articles/releng/_index.adoc:362 #, no-wrap msgid "Distribution" msgstr "Распространение" #. type: Title === #: documentation/content/en/articles/releng/_index.adoc:365 #, no-wrap msgid "FTP Sites" msgstr "Сайты FTP" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:371 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 #, 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 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 #, 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 msgid "The complete package build for this release." msgstr "Полная сборка пакетов для этого выпуска." #. type: Labeled list #: documentation/content/en/articles/releng/_index.adoc:378 #, 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 msgid "A symlink to [.filename]#../../../tools#." msgstr "Символическая ссылка на [.filename]#../../../tools#." #. type: Labeled list #: documentation/content/en/articles/releng/_index.adoc:381 #, 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 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 #, 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 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 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 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 #, no-wrap msgid "CD-ROM Replication" msgstr "Репликация CD-ROM" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:402 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 #, no-wrap msgid "Extensibility" msgstr "Расширяемость" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:411 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 #, no-wrap msgid "Scripting `bsdinstall`" msgstr "Скриптинг `bsdinstall`" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:416 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}[Diskless Operation with PXE, network-diskless]] to bootstrap " -"systems from the network." +"{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}[Запуск системы по сети (PXE) без использования локальных " -"накопителей, network-diskless]] для загрузки систем по сети." +"функциональность может использоваться совместно с Intel(R) PXE " +"footnote:[extref:{handbook}advanced-networking[Запуск системы по сети (PXE) " +"без использования локальных накопителей, network-diskless]] для загрузки " +"систем по сети." #. type: Title == #: documentation/content/en/articles/releng/_index.adoc:418 #, no-wrap msgid "Lessons Learned from FreeBSD 4.4" msgstr "Уроки, извлеченные из FreeBSD 4.4" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:425 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 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 #, no-wrap msgid "Future Directions" msgstr "Перспективы развития" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:435 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 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 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 msgid "" "_Regression Testing_ - We need better automated correctness testing for " "FreeBSD." msgstr "" "_Регрессионное тестирование_ - Нам необходимы более совершенные " "автоматизированные тесты на корректность для FreeBSD." #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:440 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 #, no-wrap msgid "Acknowledgements" msgstr "Благодарности" #. type: Plain text #: documentation/content/en/articles/releng/_index.adoc:447 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]" +"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[Управление выпусками " +"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/remote-install/_index.adoc b/documentation/content/ru/articles/remote-install/_index.adoc index 729e2e3057..cb22910bf8 100644 --- a/documentation/content/ru/articles/remote-install/_index.adoc +++ b/documentation/content/ru/articles/remote-install/_index.adoc @@ -1,347 +1,347 @@ --- authors: - author: 'Daniel Gerzo' email: danger@FreeBSD.org copyright: '2008-2021 The FreeBSD Documentation Project' description: 'Описывает удалённую установку операционной системы FreeBSD, когда консоль удалённой системы недоступна' tags: ["Remote", "Installation", "FreeBSD"] title: 'Удалённая установка операционной системы FreeBSD без удалённой консоли' trademarks: ["freebsd", "general"] --- = Удалённая установка операционной системы FreeBSD без удалённой консоли :doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental: :images-path: articles/remote-install/ 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, когда консоль удалённой системы недоступна. Основная идея этой статьи является результатом сотрудничества с `{mm}` при ценных вкладах от `{pjd}`. ''' toc::[] [[background]] == Пояснения В мире существует множество хостинг-провайдеров, но лишь немногие из них официально поддерживают FreeBSD. Обычно они предоставляют поддержку для дистрибутивов Linux(R), которые можно установить на предлагаемые серверы. В некоторых случаях эти компании могут установить предпочитаемый вами дистрибутив Linux(R) по вашему запросу. Используя эту опцию, мы попытаемся установить FreeBSD. В других случаях они могут предложить систему восстановления, которая используется в чрезвычайных ситуациях. Её также можно использовать для наших целей. В этой статье описаны основные шаги установки и настройки, необходимые для удалённой установки FreeBSD с поддержкой RAID-1 и ZFS. [[intro]] == Введение В этом разделе будет коротко расскажем о цели данной статьи и будет дано более подробное объяснение того, что в ней рассматривается. Инструкции, приведённые в статье, будут полезны тем, кто использует услуги колокационных центров, не поддерживающих FreeBSD. [.procedure] ==== . Как мы упоминали в разделе crossref:remote-install[background, Предыстория], многие авторитетные компании, предоставляющие хостинг серверов, предлагают своего рода систему восстановления, которая загружается из их локальной сети и доступна через SSH. Обычно они предоставляют эту возможность, чтобы помочь клиентам восстановить повреждённые операционные системы. Как будет объяснено в этой статье, с помощью таких систем восстановления можно установить FreeBSD. + . Следующий раздел этой статьи описывает, как настроить и собрать минималистичную FreeBSD на локальной машине. Эта версия в конечном итоге будет запущена на удаленной машине с ramdisk, что позволит нам установить полную операционную систему FreeBSD с FTP-зеркала с помощью утилиты sysinstall. . Оставшаяся часть статьи описывает процедуру установки, а также настройку файловой системы ZFS. ==== [[requirements]] === Требования Для успешного продолжения необходимо: * Иметь операционную систему с доступом по сети и доступом по SSH * Понимать процесса установки FreeBSD * Быть знакомым с утилитой man:sysinstall[8] * Иметь под рукой установочный образ SO или CD с FreeBSD [[preparation]] == Подготовка - mfsBSD Прежде чем FreeBSD может быть установлена на целевую систему, необходимо собрать минимальный образ операционной системы FreeBSD, который будет загружаться с жёсткого диска. Таким образом, новая система будет доступна из сети, а остальная часть установки может быть выполнена без удалённого доступа к консоли системы. Набор инструментов mfsBSD можно использовать для создания компактного образа FreeBSD. Как следует из названия mfsBSD («mfs» означает «файловая система в памяти»), итоговый образ полностью запускается с RAM-диска. Благодаря этой особенности не будет ограничений на работу с жёсткими дисками, что позволит установить полноценную операционную систему FreeBSD. На http://mfsbsd.vx.sk/[домашней странице] mfsBSD есть ссылки на последнюю версию набора инструментов. Обратите внимание, что внутреннее устройство mfsBSD и принципы его работы выходят за рамки данной статьи. Заинтересованным читателям следует обратиться к оригинальной документации mfsBSD для получения более подробной информации. Скачайте и распакуйте последний выпуск mfsBSD и перейдите в рабочий каталог, где будут находиться скрипты mfsBSD: [source, shell] .... # fetch http://mfsbsd.vx.sk/release/mfsbsd-2.1.tar.gz # tar xvzf mfsbsd-2.1.tar.gz # cd mfsbsd-2.1/ .... [[mfsbsd-config]] === Конфигурация mfsBSD Прежде чем загрузить mfsBSD, необходимо установить несколько важных параметров конфигурации. Самое важное, что нужно правильно настроить, — это, естественно, сеть. Наиболее подходящий метод настройки параметров сети зависит от того, знаем ли мы заранее тип используемого сетевого интерфейса и драйвер сетевого интерфейса, который нужно загрузить для нашего оборудования. Мы рассмотрим, как можно настроить mfsBSD в обоих случаях. Еще одна важная настройка — установка пароля `root`. Это можно сделать, отредактировав файл [.filename]#conf/loader.conf#. Пожалуйста, ознакомьтесь с приложенными комментариями. ==== Метод [.filename]#conf/interfaces.conf# Если установленная сетевая карта неизвестна, можно использовать функцию автоматического определения в mfsBSD. Скрипты запуска mfsBSD могут определить правильный драйвер для использования на основе MAC-адреса интерфейса, если установить следующие параметры в [.filename]#conf/interfaces.conf#: [.programlisting] .... mac_interfaces="ext1" ifconfig_ext1_mac="00:00:00:00:00:00" ifconfig_ext1="inet 192.168.0.2/24" .... Не забудьте добавить информацию о `defaultrouter` в [.filename]#conf/rc.conf#: [.programlisting] .... defaultrouter="192.168.0.1" .... ==== Метод [.filename]#conf/rc.conf# Когда драйвер сетевого интерфейса известен, удобнее использовать [.filename]#conf/rc.conf# для настройки сети. Синтаксис этого файла такой же, как в стандартном файле man:rc.conf[5] FreeBSD. Например, если известно, что сетевой интерфейс man:re[4] будет доступен, можно задать следующие параметры в [.filename]#conf/rc.conf#: [.programlisting] .... defaultrouter="192.168.0.1" ifconfig_re0="inet 192.168.0.2/24" .... [[mfsbsd-build]] === Создание образа mfsBSD Процесс создания образа mfsBSD довольно прост. Первым шагом необходимо подключить установочный CD FreeBSD или образ ISO установки к [.filename]#/cdrom#. В качестве примера в этой статье мы будем предполагать, что вы загрузили образ ISO FreeBSD 10.1-RELEASE. Подключение этого образа ISO к директории [.filename]#/cdrom# легко выполняется с помощью утилиты man:mdconfig[8]: [source, shell] .... # mdconfig -a -t vnode -u 10 -f FreeBSD-10.1-RELEASE-amd64-disc1.iso # mount_cd9660 /dev/md10 /cdrom .... Поскольку последние выпуски FreeBSD не содержат обычных наборов дистрибутивов, необходимо извлечь файлы дистрибутива FreeBSD из архивов дистрибутива, расположенных на образе ISO: [source, shell] .... # mkdir DIST # tar -xvf /cdrom/usr/freebsd-dist/base.txz -C DIST # tar -xvf /cdrom/usr/freebsd-dist/kernel.txz -C DIST .... Далее соберите загружаемый образ mfsBSD: [source, shell] .... # make BASE=DIST .... [NOTE] ==== Указанную команду `make` необходимо выполнять из корневой директории дерева каталогов mfsBSD, например, [.filename]#~/mfsbsd-2.1/#. ==== === Загрузка mfsBSD Теперь, когда образ mfsBSD готов, его необходимо загрузить на удалённую систему, работающую под управлением live-системы восстановления или предустановленного дистрибутива Linux(R). Наиболее подходящий инструмент для этой задачи — scp: [source, shell] .... # scp disk.img root@192.168.0.2:. .... Для правильной загрузки образа mfsBSD он должен быть размещен на первом (загрузочном) устройстве данной машины. Это может быть выполнено с помощью следующего примера, при условии что [.filename]#sda# является первым загрузочным дисковым устройством: [source, shell] .... # dd if=/root/disk.img of=/dev/sda bs=1m .... Если всё прошло успешно, образ теперь должен находиться в MBR первого устройства, и машину можно перезагрузить. Следите за корректной загрузкой системы с помощью инструмента man:ping[8]. Как только машина снова окажется в сети, к ней можно будет подключиться через man:ssh[1] под пользователем `root` с настроенным паролем. [[installation]] == Установка операционной системы FreeBSD Система mfsBSD успешно загружена, и теперь можно войти через man:ssh[1]. В этом разделе будет описано, как создавать и размечать разделы, настраивать `gmirror` для RAID-1, а также как использовать `sysinstall` для установки минимальной дистрибуции операционной системы FreeBSD. === Подготовка жестких дисков Первая задача — выделить дисковое пространство для FreeBSD, т.е.: создать слайсы и разделы. Очевидно, что текущая работающая система полностью загружена в оперативную память, поэтому не будет проблем с манипуляциями жёсткими дисками. Для выполнения этой задачи можно использовать либо `sysinstall`, либо man:fdisk[8] в сочетании с man:bsdlabel[8]. В начале пометьте все системные диски как пустые. Повторите следующую команду для каждого жёсткого диска: [source, shell] .... # dd if=/dev/zero of=/dev/ad0 count=2 .... -Далее создайте разделы и пометьте их с помощью предпочитаемого инструмента. Хотя использование `sysinstall` считается более простым, но мощным и, вероятно, менее подверженным ошибкам методом будет использование стандартных текстовых инструментов UNIX(R), таких как man:fdisk[8] и man:bsdlabel[8], которые также будут рассмотрены в этом разделе. Первый вариант хорошо документирован в главе extref:{handbook}[Установка FreeBSD, install-steps] Руководства FreeBSD. Как упоминалось во введении, в этой статье будет показано, как настроить систему с возможностями RAID-1 и ZFS. Наша конфигурация будет состоять из небольшого зеркального раздела man:gmirror[8] для [.filename]#/# (корневого), [.filename]#/usr# и [.filename]#/var#, а остальное место на диске будет выделено для зеркальной файловой системы ZFS man:zpool[8]. Обратите внимание, что файловая система ZFS будет настроена после успешной установки и загрузки операционной системы FreeBSD. +Далее создайте разделы и пометьте их с помощью предпочитаемого инструмента. Хотя использование `sysinstall` считается более простым, но мощным и, вероятно, менее подверженным ошибкам методом будет использование стандартных текстовых инструментов UNIX(R), таких как man:fdisk[8] и man:bsdlabel[8], которые также будут рассмотрены в этом разделе. Первый вариант хорошо документирован в главе extref:{handbook}install[Установка FreeBSD, install-steps] Руководства FreeBSD. Как упоминалось во введении, в этой статье будет показано, как настроить систему с возможностями RAID-1 и ZFS. Наша конфигурация будет состоять из небольшого зеркального раздела man:gmirror[8] для [.filename]#/# (корневого), [.filename]#/usr# и [.filename]#/var#, а остальное место на диске будет выделено для зеркальной файловой системы ZFS man:zpool[8]. Обратите внимание, что файловая система ZFS будет настроена после успешной установки и загрузки операционной системы FreeBSD. Следующий пример описывает, как создать слайсы и метки, инициализировать man:gmirror[8] на каждом разделе и как создать файловую систему UFS2 в каждом зеркальном разделе: [source, shell] .... # fdisk -BI /dev/ad0 <.> # fdisk -BI /dev/ad1 # bsdlabel -wB /dev/ad0s1 <.> # bsdlabel -wB /dev/ad1s1 # bsdlabel -e /dev/ad0s1 <.> # bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt <.> # gmirror label root /dev/ad[01]s1a <.> # gmirror label var /dev/ad[01]s1d # gmirror label usr /dev/ad[01]s1e # gmirror label -F swap /dev/ad[01]s1b <.> # newfs /dev/mirror/root <.> # newfs /dev/mirror/var # newfs /dev/mirror/usr .... <.> Создайте раздел, охватывающий весь диск, и инициализируйте загрузочный код, содержащийся в секторе 0 данного диска. Повторите эту команду для всех жестких дисков в системе. <.> Запишите стандартную метку для каждого диска, включая загрузочный код. <.> Теперь вручную отредактируйте метку указанного диска. Обратитесь к странице руководства man:bsdlabel[8], чтобы узнать, как создавать разделы. Создайте раздел `a` для [.filename]#/# — корневой файловой системы, `b` для раздела подкачки, `d` для [.filename]#/var#, `e` для [.filename]#/usr# и, наконец, `f`, который позже будет использоваться для ZFS. <.> Импортируйте только что созданную метку для второго жесткого диска, чтобы оба жестких диска были размечены одинаковым образом. <.> Инициализируйте man:gmirror[8] на каждом разделе. <.> Обратите внимание, что `-F` используется для раздела подкачки. Это указывает man:gmirror[8] предполагать, что устройство находится в согласованном состоянии после сбоя питания/системы. <.> Создайте файловую систему UFS2 на каждом зеркальном разделе. === Установка системы Это самая важная часть. В этом разделе будет описано, как фактически установить минимальный дистрибутив FreeBSD на жёсткие диски, которые мы подготовили в предыдущем разделе. Для достижения этой цели необходимо смонтировать все файловые системы, чтобы `sysinstall` мог записать содержимое FreeBSD на жёсткие диски: [source, shell] .... # mount /dev/mirror/root /mnt # mkdir /mnt/var /mnt/usr # mount /dev/mirror/var /mnt/var # mount /dev/mirror/usr /mnt/usr .... Когда вы закончите, запустите man:sysinstall[8]. Выберите установку [.guimenuitem]#Custom# в главном меню. Выберите [.guimenuitem]#Options# и нажмите kbd:[Enter]. С помощью клавиш со стрелками переместите курсор на пункт `Install Root`, нажмите kbd:[Space] и измените его на [.filename]#/mnt#. Нажмите kbd:[Enter], чтобы подтвердить изменения, и выйдите из меню [.guimenuitem]#Options#, нажав kbd:[q]. [WARNING] ==== Обратите внимание, что этот шаг очень важен, и если его пропустить, `sysinstall` не сможет установить FreeBSD. ==== Перейдите в меню [.guimenuitem]#Distributions#, с помощью клавиш со стрелками переместите курсор к пункту `Minimal` и отметьте его, нажав kbd:[Space]. В этой статье используется дистрибутив Minimal для экономии сетевого трафика, так как сама система будет устанавливаться через ftp. Выйдите из этого меню, выбрав `Exit`. [NOTE] ==== [.guimenuitem]#Partition# и [.guimenuitem]#Label# будут пропущены, так как сейчас они бесполезны. ==== В меню [.guimenuitem]#Media# выберите `FTP`. Выберите ближайший зеркальный сервер и позвольте `sysinstall` предположить, что сеть уже настроена. Вы вернётесь обратно в меню [.guimenuitem]#Custom#. Наконец, выполните установку системы, выбрав последний пункт [.guimenuitem]#Commit#. Выйдите из `sysinstall` после завершения установки. === Шаги после установки Операционная система FreeBSD теперь должна быть установлена; однако процесс еще не завершен. Необходимо выполнить несколько шагов после установки, чтобы FreeBSD могла загружаться в будущем и чтобы можно было войти в систему. Вы должны теперь выполнить man:chroot[8] в только что установленную систему, чтобы завершить установку. Используйте следующую команду: [source, shell] .... # chroot /mnt .... Для достижения нашей цели выполните следующие шаги: * Скопируйте ядро `GENERIC` в директорию [.filename]#/boot/kernel#: + [source, shell] .... # cp -Rp /boot/GENERIC/* /boot/kernel .... * Создайте файлы [.filename]#/etc/rc.conf#, [.filename]#/etc/resolv.conf# и [.filename]#/etc/fstab#. Не забудьте правильно настроить сетевые параметры и включить sshd в [.filename]#/etc/rc.conf#. Содержимое [.filename]#/etc/fstab# будет выглядеть примерно следующим образом: + [.programlisting] .... # Device Mountpoint FStype Options Dump Pass# /dev/mirror/swap none swap sw 0 0 /dev/mirror/root / ufs rw 1 1 /dev/mirror/usr /usr ufs rw 2 2 /dev/mirror/var /var ufs rw 2 2 /dev/cd0 /cdrom cd9660 ro,noauto 0 0 .... * Создайте файл [.filename]#/boot/loader.conf# со следующим содержимым: + [.programlisting] .... geom_mirror_load="YES" zfs_load="YES" .... * Выполните следующую команду, чтобы сделать ZFS доступным при следующей загрузке: + [source, shell] .... # sysrc zfs_enable="YES" .... * Добавьте дополнительных пользователей в систему с помощью инструмента man:adduser[8]. Не забудьте добавить пользователя в группу `wheel`, чтобы получить доступ к root после перезагрузки. * Перепроверьте все ваши настройки. Система теперь должна быть готова к следующей загрузке. Используйте команду man:reboot[8] для перезагрузки системы. [[zfs]] == ZFS Если ваша система пережила перезагрузку, теперь должно быть возможно войти в систему. Добро пожаловать в новую установку FreeBSD, выполненную удалённо без использования удалённой консоли! Остался только последний шаг — настроить man:zpool[8] и создать несколько файловых систем man:zfs[8]. Создание и администрирование ZFS очень просто. Сначала создайте зеркальный пул: [source, shell] .... # zpool create tank mirror /dev/ad[01]s1f .... Далее создайте несколько файловых систем: [source, shell] .... # zfs create tank/ports # zfs create tank/src # zfs set compression=gzip tank/ports # zfs set compression=on tank/src # zfs set mountpoint=/usr/ports tank/ports # zfs set mountpoint=/usr/src tank/src .... Вот и все. Если вас интересуют более подробные сведения о ZFS в FreeBSD, обратитесь к разделу https://wiki.freebsd.org/ZFS[ZFS] на вики FreeBSD. diff --git a/documentation/content/ru/articles/remote-install/_index.po b/documentation/content/ru/articles/remote-install/_index.po index 451bbfa093..b387174ea4 100644 --- a/documentation/content/ru/articles/remote-install/_index.po +++ b/documentation/content/ru/articles/remote-install/_index.po @@ -1,1007 +1,1007 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-01 18:11+0300\n" -"PO-Revision-Date: 2025-10-01 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/articles/remote-install/_index.adoc:1 #, no-wrap msgid "Describes the remote installation of the FreeBSD operating system when the console of the remote system is unavailable" msgstr "Описывает удалённую установку операционной системы FreeBSD, когда консоль удалённой системы недоступна" #. type: Title = #: documentation/content/en/articles/remote-install/_index.adoc:1 #: documentation/content/en/articles/remote-install/_index.adoc:12 #, no-wrap msgid "Remote Installation of the FreeBSD Operating System Without a Remote Console" msgstr "Удалённая установка операционной системы FreeBSD без удалённой консоли" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:45 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:48 msgid "" "This article documents the remote installation of the FreeBSD operating " "system when the console of the remote system is unavailable. The main idea " "behind this article is the result of a collaboration with `{mm}` with " "valuable input provided by `{pjd}`." msgstr "" "В этой статье описывается удалённая установка операционной системы FreeBSD, " "когда консоль удалённой системы недоступна. Основная идея этой статьи " "является результатом сотрудничества с `{mm}` при ценных вкладах от `{pjd}`." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:50 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/remote-install/_index.adoc:54 #, no-wrap msgid "Background" msgstr "Пояснения" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:58 msgid "" "There are many server hosting providers in the world, but very few of them " "are officially supporting FreeBSD. They usually provide support for a " "Linux(R) distribution to be installed on the servers they offer." msgstr "" "В мире существует множество хостинг-провайдеров, но лишь немногие из них " "официально поддерживают FreeBSD. Обычно они предоставляют поддержку для " "дистрибутивов Linux(R), которые можно установить на предлагаемые серверы." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:62 msgid "" "In some cases, these companies will install your preferred Linux(R) " "distribution if you request it. Using this option, we will attempt to " "install FreeBSD. In other cases, they may offer a rescue system which would " "be used in an emergency. It is possible to use this for our purposes as " "well." msgstr "" "В некоторых случаях эти компании могут установить предпочитаемый вами " "дистрибутив Linux(R) по вашему запросу. Используя эту опцию, мы попытаемся " "установить FreeBSD. В других случаях они могут предложить систему " "восстановления, которая используется в чрезвычайных ситуациях. Её также " "можно использовать для наших целей." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:64 msgid "" "This article covers the basic installation and configuration steps required " "to bootstrap a remote installation of FreeBSD with RAID-1 and ZFS " "capabilities." msgstr "" "В этой статье описаны основные шаги установки и настройки, необходимые для " "удалённой установки FreeBSD с поддержкой RAID-1 и ZFS." #. type: Title == #: documentation/content/en/articles/remote-install/_index.adoc:66 #, no-wrap msgid "Introduction" msgstr "Введение" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:70 msgid "" "This section will summarize the purpose of this article and better explain " "what is covered herein. The instructions included in this article will " "benefit those using services provided by colocation facilities not " "supporting FreeBSD." msgstr "" "В этом разделе будет коротко расскажем о цели данной статьи и будет дано " "более подробное объяснение того, что в ней рассматривается. Инструкции, " "приведённые в статье, будут полезны тем, кто использует услуги колокационных " "центров, не поддерживающих FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:74 msgid "" "As we have mentioned in the crossref:remote-install[background, Background] " "section, many of the reputable server hosting companies provide some kind of " "rescue system, which is booted from their LAN and accessible over SSH. They " "usually provide this support to help their customers fix broken operating " "systems. As this article will explain, it is possible to install FreeBSD " "with the help of these rescue systems." msgstr "" "Как мы упоминали в разделе crossref:remote-install[background, Предыстория], " "многие авторитетные компании, предоставляющие хостинг серверов, предлагают " "своего рода систему восстановления, которая загружается из их локальной сети " "и доступна через SSH. Обычно они предоставляют эту возможность, чтобы помочь " "клиентам восстановить повреждённые операционные системы. Как будет объяснено " "в этой статье, с помощью таких систем восстановления можно установить " "FreeBSD." #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:76 msgid "" "The next section of this article will describe how to configure, and build " "minimalistic FreeBSD on the local machine. That version will eventually be " "running on the remote machine from a ramdisk, which will allow us to install " "a complete FreeBSD operating system from an FTP mirror using the sysinstall " "utility." msgstr "" "Следующий раздел этой статьи описывает, как настроить и собрать " "минималистичную FreeBSD на локальной машине. Эта версия в конечном итоге " "будет запущена на удаленной машине с ramdisk, что позволит нам установить " "полную операционную систему FreeBSD с FTP-зеркала с помощью утилиты " "sysinstall." #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:77 msgid "" "The rest of this article will describe the installation procedure itself, as " "well as the configuration of the ZFS file system." msgstr "" "Оставшаяся часть статьи описывает процедуру установки, а также настройку " "файловой системы ZFS." #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:80 #, no-wrap msgid "Requirements" msgstr "Требования" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:83 msgid "To continue successfully, you must:" msgstr "Для успешного продолжения необходимо:" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:85 msgid "Have a network accessible operating system with SSH access" msgstr "Иметь операционную систему с доступом по сети и доступом по SSH" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:86 msgid "Understand the FreeBSD installation process" msgstr "Понимать процесса установки FreeBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:87 msgid "Be familiar with the man:sysinstall[8] utility" msgstr "Быть знакомым с утилитой man:sysinstall[8]" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:88 msgid "Have the FreeBSD installation SO image or CD handy" msgstr "Иметь под рукой установочный образ SO или CD с FreeBSD" #. type: Title == #: documentation/content/en/articles/remote-install/_index.adoc:90 #, no-wrap msgid "Preparation - mfsBSD" msgstr "Подготовка - mfsBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:94 msgid "" "Before FreeBSD may be installed on the target system, it is necessary to " "build the minimal FreeBSD operating system image which will boot from the " "hard drive. This way the new system can be accessed from the network, and " "the rest of the installation can be done without remote access to the system " "console." msgstr "" "Прежде чем FreeBSD может быть установлена на целевую систему, необходимо " "собрать минимальный образ операционной системы FreeBSD, который будет " "загружаться с жёсткого диска. Таким образом, новая система будет доступна из " "сети, а остальная часть установки может быть выполнена без удалённого " "доступа к консоли системы." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:99 msgid "" "The mfsBSD tool-set can be used to build a tiny FreeBSD image. As the name " "of mfsBSD suggests (\"mfs\" means \"memory file system\"), the resulting " "image runs entirely from a ramdisk. Thanks to this feature, the " "manipulation of hard drives will not be limited, therefore it will be " "possible to install a complete FreeBSD operating system. The mfsBSD http://" "mfsbsd.vx.sk/[home page] includes pointers to the latest release of the " "toolset." msgstr "" "Набор инструментов mfsBSD можно использовать для создания компактного образа " "FreeBSD. Как следует из названия mfsBSD («mfs» означает «файловая система в " "памяти»), итоговый образ полностью запускается с RAM-диска. Благодаря этой " "особенности не будет ограничений на работу с жёсткими дисками, что позволит " "установить полноценную операционную систему FreeBSD. На http://mfsbsd.vx.sk/" "[домашней странице] mfsBSD есть ссылки на последнюю версию набора " "инструментов." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:102 msgid "" "Please note that the internals of mfsBSD and how it all fits together is " "beyond the scope of this article. The interested reader should consult the " "original documentation of mfsBSD for more details." msgstr "" "Обратите внимание, что внутреннее устройство mfsBSD и принципы его работы " "выходят за рамки данной статьи. Заинтересованным читателям следует " "обратиться к оригинальной документации mfsBSD для получения более подробной " "информации." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:104 msgid "" "Download and extract the latest mfsBSD release and change your working " "directory to the directory where the mfsBSD scripts will reside:" msgstr "" "Скачайте и распакуйте последний выпуск mfsBSD и перейдите в рабочий каталог, " "где будут находиться скрипты mfsBSD:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:110 #, no-wrap msgid "" "# fetch http://mfsbsd.vx.sk/release/mfsbsd-2.1.tar.gz\n" "# tar xvzf mfsbsd-2.1.tar.gz\n" "# cd mfsbsd-2.1/\n" msgstr "" "# fetch http://mfsbsd.vx.sk/release/mfsbsd-2.1.tar.gz\n" "# tar xvzf mfsbsd-2.1.tar.gz\n" "# cd mfsbsd-2.1/\n" #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:113 #, no-wrap msgid "Configuration of mfsBSD" msgstr "Конфигурация mfsBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:119 msgid "" "Before booting mfsBSD, a few important configuration options have to be " "set. The most important that we have to get right is, naturally, the " "network setup. The most suitable method to configure networking options " "depends on whether we know beforehand the type of the network interface we " "will use, and the network interface driver to be loaded for our hardware. " "We will see how mfsBSD can be configured in either case." msgstr "" "Прежде чем загрузить mfsBSD, необходимо установить несколько важных " "параметров конфигурации. Самое важное, что нужно правильно настроить, — это, " "естественно, сеть. Наиболее подходящий метод настройки параметров сети " "зависит от того, знаем ли мы заранее тип используемого сетевого интерфейса и " "драйвер сетевого интерфейса, который нужно загрузить для нашего " "оборудования. Мы рассмотрим, как можно настроить mfsBSD в обоих случаях." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:123 msgid "" "Another important thing to set is the `root` password. This can be done by " "editing [.filename]#conf/loader.conf#. Please see the included comments." msgstr "" "Еще одна важная настройка — установка пароля `root`. Это можно сделать, " "отредактировав файл [.filename]#conf/loader.conf#. Пожалуйста, ознакомьтесь " "с приложенными комментариями." #. type: Title ==== #: documentation/content/en/articles/remote-install/_index.adoc:124 #, no-wrap msgid "The [.filename]#conf/interfaces.conf# method" msgstr "Метод [.filename]#conf/interfaces.conf#" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:128 msgid "" "When the installed network interface card is unknown, it is possible to use " "the auto-detection features of mfsBSD. The startup scripts of mfsBSD can " "detect the correct driver to use, based on the MAC address of the interface, " "if we set the following options in [.filename]#conf/interfaces.conf#:" msgstr "" "Если установленная сетевая карта неизвестна, можно использовать функцию " "автоматического определения в mfsBSD. Скрипты запуска mfsBSD могут " "определить правильный драйвер для использования на основе MAC-адреса " "интерфейса, если установить следующие параметры в [.filename]#conf/" "interfaces.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:134 #, no-wrap msgid "" "mac_interfaces=\"ext1\"\n" "ifconfig_ext1_mac=\"00:00:00:00:00:00\"\n" "ifconfig_ext1=\"inet 192.168.0.2/24\"\n" msgstr "" "mac_interfaces=\"ext1\"\n" "ifconfig_ext1_mac=\"00:00:00:00:00:00\"\n" "ifconfig_ext1=\"inet 192.168.0.2/24\"\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:137 msgid "" -"Do not forget to add the `defaultrouter` information to [.filename]#conf/" -"rc.conf#:" +"Do not forget to add the `defaultrouter` information to [.filename]#conf/rc." +"conf#:" msgstr "" -"Не забудьте добавить информацию о `defaultrouter` в [.filename]#conf/" -"rc.conf#:" +"Не забудьте добавить информацию о `defaultrouter` в [.filename]#conf/rc." +"conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:141 #, no-wrap msgid "defaultrouter=\"192.168.0.1\"\n" msgstr "defaultrouter=\"192.168.0.1\"\n" #. type: Title ==== #: documentation/content/en/articles/remote-install/_index.adoc:143 #, no-wrap msgid "The [.filename]#conf/rc.conf# Method" msgstr "Метод [.filename]#conf/rc.conf#" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:147 msgid "" -"When the network interface driver is known, it is more convenient to use " -"[.filename]#conf/rc.conf# for networking options. The syntax of this file " -"is the same as the one used in the standard man:rc.conf[5] file of FreeBSD." +"When the network interface driver is known, it is more convenient to use [." +"filename]#conf/rc.conf# for networking options. The syntax of this file is " +"the same as the one used in the standard man:rc.conf[5] file of FreeBSD." msgstr "" -"Когда драйвер сетевого интерфейса известен, удобнее использовать " -"[.filename]#conf/rc.conf# для настройки сети. Синтаксис этого файла такой " -"же, как в стандартном файле man:rc.conf[5] FreeBSD." +"Когда драйвер сетевого интерфейса известен, удобнее использовать [." +"filename]#conf/rc.conf# для настройки сети. Синтаксис этого файла такой же, " +"как в стандартном файле man:rc.conf[5] FreeBSD." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:149 msgid "" "For example, if you know that a man:re[4] network interface is going to be " "available, you can set the following options in [.filename]#conf/rc.conf#:" msgstr "" "Например, если известно, что сетевой интерфейс man:re[4] будет доступен, " "можно задать следующие параметры в [.filename]#conf/rc.conf#:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:154 #, no-wrap msgid "" "defaultrouter=\"192.168.0.1\"\n" "ifconfig_re0=\"inet 192.168.0.2/24\"\n" msgstr "" "defaultrouter=\"192.168.0.1\"\n" "ifconfig_re0=\"inet 192.168.0.2/24\"\n" #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:157 #, no-wrap msgid "Building an mfsBSD Image" msgstr "Создание образа mfsBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:160 msgid "The process of building an mfsBSD image is pretty straightforward." msgstr "Процесс создания образа mfsBSD довольно прост." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:164 msgid "" "The first step is to mount the FreeBSD installation CD, or the installation " "ISO image to [.filename]#/cdrom#. For the sake of example, in this article " "we will assume that you have downloaded the FreeBSD 10.1-RELEASE ISO. " "Mounting this ISO image to the [.filename]#/cdrom# directory is easy with " "the man:mdconfig[8] utility:" msgstr "" "Первым шагом необходимо подключить установочный CD FreeBSD или образ ISO " "установки к [.filename]#/cdrom#. В качестве примера в этой статье мы будем " "предполагать, что вы загрузили образ ISO FreeBSD 10.1-RELEASE. Подключение " "этого образа ISO к директории [.filename]#/cdrom# легко выполняется с " "помощью утилиты man:mdconfig[8]:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:169 #, no-wrap msgid "" "# mdconfig -a -t vnode -u 10 -f FreeBSD-10.1-RELEASE-amd64-disc1.iso\n" "# mount_cd9660 /dev/md10 /cdrom\n" msgstr "" "# mdconfig -a -t vnode -u 10 -f FreeBSD-10.1-RELEASE-amd64-disc1.iso\n" "# mount_cd9660 /dev/md10 /cdrom\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:172 msgid "" "Since the recent FreeBSD releases do not contain regular distribution sets, " "it is required to extract the FreeBSD distribution files from the " "distribution archives located on the ISO image:" msgstr "" "Поскольку последние выпуски FreeBSD не содержат обычных наборов " "дистрибутивов, необходимо извлечь файлы дистрибутива FreeBSD из архивов " "дистрибутива, расположенных на образе ISO:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:178 #, no-wrap msgid "" "# mkdir DIST\n" "# tar -xvf /cdrom/usr/freebsd-dist/base.txz -C DIST\n" "# tar -xvf /cdrom/usr/freebsd-dist/kernel.txz -C DIST\n" msgstr "" "# mkdir DIST\n" "# tar -xvf /cdrom/usr/freebsd-dist/base.txz -C DIST\n" "# tar -xvf /cdrom/usr/freebsd-dist/kernel.txz -C DIST\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:181 msgid "Next, build the bootable mfsBSD image:" msgstr "Далее соберите загружаемый образ mfsBSD:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:185 #, no-wrap msgid "# make BASE=DIST\n" msgstr "# make BASE=DIST\n" #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:190 msgid "" "The above `make` has to be run from the top level of the mfsBSD directory " "tree, for example [.filename]#~/mfsbsd-2.1/#." msgstr "" "Указанную команду `make` необходимо выполнять из корневой директории дерева " "каталогов mfsBSD, например, [.filename]#~/mfsbsd-2.1/#." #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:192 #, no-wrap msgid "Booting mfsBSD" msgstr "Загрузка mfsBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:196 msgid "" "Now that the mfsBSD image is ready, it must be uploaded to the remote system " "running a live rescue system or pre-installed Linux(R) distribution. The " "most suitable tool for this task is scp:" msgstr "" "Теперь, когда образ mfsBSD готов, его необходимо загрузить на удалённую " "систему, работающую под управлением live-системы восстановления или " "предустановленного дистрибутива Linux(R). Наиболее подходящий инструмент для " "этой задачи — scp:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:200 #, no-wrap msgid "# scp disk.img root@192.168.0.2:.\n" msgstr "# scp disk.img root@192.168.0.2:.\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:204 msgid "" "To boot mfsBSD image properly, it must be placed on the first (bootable) " "device of the given machine. This may be accomplished using this example " "providing that [.filename]#sda# is the first bootable disk device:" msgstr "" "Для правильной загрузки образа mfsBSD он должен быть размещен на первом " "(загрузочном) устройстве данной машины. Это может быть выполнено с помощью " "следующего примера, при условии что [.filename]#sda# является первым " "загрузочным дисковым устройством:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:208 #, no-wrap msgid "# dd if=/root/disk.img of=/dev/sda bs=1m\n" msgstr "# dd if=/root/disk.img of=/dev/sda bs=1m\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:213 msgid "" "If all went well, the image should now be in the MBR of the first device and " "the machine can be rebooted. Watch for the machine to boot up properly with " "the man:ping[8] tool. Once it has came back on-line, it should be possible " "to access it over man:ssh[1] as user `root` with the configured password." msgstr "" "Если всё прошло успешно, образ теперь должен находиться в MBR первого " "устройства, и машину можно перезагрузить. Следите за корректной загрузкой " "системы с помощью инструмента man:ping[8]. Как только машина снова окажется " "в сети, к ней можно будет подключиться через man:ssh[1] под пользователем " "`root` с настроенным паролем." #. type: Title == #: documentation/content/en/articles/remote-install/_index.adoc:215 #, no-wrap msgid "Installation of the FreeBSD Operating System" msgstr "Установка операционной системы FreeBSD" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:219 msgid "" "The mfsBSD has been successfully booted and it should be possible to log in " "through man:ssh[1]. This section will describe how to create and label " "slices, set up `gmirror` for RAID-1, and how to use `sysinstall` to install " "a minimal distribution of the FreeBSD operating system." msgstr "" "Система mfsBSD успешно загружена, и теперь можно войти через man:ssh[1]. В " "этом разделе будет описано, как создавать и размечать разделы, настраивать " "`gmirror` для RAID-1, а также как использовать `sysinstall` для установки " "минимальной дистрибуции операционной системы FreeBSD." #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:220 #, no-wrap msgid "Preparation of Hard Drives" msgstr "Подготовка жестких дисков" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:225 msgid "" "The first task is to allocate disk space for FreeBSD, i.e.: to create slices " "and partitions. Obviously, the currently running system is fully loaded in " "system memory and therefore there will be no problems with manipulating hard " "drives. To complete this task, it is possible to use either `sysinstall` or " "man:fdisk[8] in conjunction to man:bsdlabel[8]." msgstr "" "Первая задача — выделить дисковое пространство для FreeBSD, т.е.: создать " "слайсы и разделы. Очевидно, что текущая работающая система полностью " "загружена в оперативную память, поэтому не будет проблем с манипуляциями " "жёсткими дисками. Для выполнения этой задачи можно использовать либо " "`sysinstall`, либо man:fdisk[8] в сочетании с man:bsdlabel[8]." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:228 msgid "" "At the start, mark all system disks as empty. Repeat the following command " "for each hard drive:" msgstr "" "В начале пометьте все системные диски как пустые. Повторите следующую " "команду для каждого жёсткого диска:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:232 #, no-wrap msgid "# dd if=/dev/zero of=/dev/ad0 count=2\n" msgstr "# dd if=/dev/zero of=/dev/ad0 count=2\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:240 msgid "" "Next, create slices and label them with your preferred tool. While it is " "considered easier to use `sysinstall`, a powerful and also probably less " -"buggy method will be to use standard text-based UNIX(R) tools, such as " -"man:fdisk[8] and man:bsdlabel[8], which will also be covered in this " -"section. The former option is well documented in the extref:{handbook}" -"[Installing FreeBSD, install-steps] chapter of the FreeBSD Handbook. As it " -"was mentioned in the introduction, this article will present how to set up a " -"system with RAID-1 and ZFS capabilities. Our set up will consist of a small " -"man:gmirror[8] mirrored [.filename]#/# (root), [.filename]#/usr# and " -"[.filename]#/var# dataset, and the rest of the disk space will be allocated " -"for a man:zpool[8] mirrored ZFS file system. Please note, that the ZFS file " -"system will be configured after the FreeBSD operating system is successfully " -"installed and booted." +"buggy method will be to use standard text-based UNIX(R) tools, such as man:" +"fdisk[8] and man:bsdlabel[8], which will also be covered in this section. " +"The former option is well documented in the extref:{handbook}" +"install[Installing FreeBSD, install-steps] chapter of the FreeBSD Handbook. " +"As it was mentioned in the introduction, this article will present how to " +"set up a system with RAID-1 and ZFS capabilities. Our set up will consist " +"of a small man:gmirror[8] mirrored [.filename]#/# (root), [.filename]#/usr# " +"and [.filename]#/var# dataset, and the rest of the disk space will be " +"allocated for a man:zpool[8] mirrored ZFS file system. Please note, that " +"the ZFS file system will be configured after the FreeBSD operating system is " +"successfully installed and booted." msgstr "" "Далее создайте разделы и пометьте их с помощью предпочитаемого инструмента. " "Хотя использование `sysinstall` считается более простым, но мощным и, " "вероятно, менее подверженным ошибкам методом будет использование стандартных " "текстовых инструментов UNIX(R), таких как man:fdisk[8] и man:bsdlabel[8], " "которые также будут рассмотрены в этом разделе. Первый вариант хорошо " -"документирован в главе extref:{handbook}[Установка FreeBSD, install-steps] " -"Руководства FreeBSD. Как упоминалось во введении, в этой статье будет " +"документирован в главе extref:{handbook}install[Установка FreeBSD, install-" +"steps] Руководства FreeBSD. Как упоминалось во введении, в этой статье будет " "показано, как настроить систему с возможностями RAID-1 и ZFS. Наша " "конфигурация будет состоять из небольшого зеркального раздела man:gmirror[8] " "для [.filename]#/# (корневого), [.filename]#/usr# и [.filename]#/var#, а " "остальное место на диске будет выделено для зеркальной файловой системы ZFS " "man:zpool[8]. Обратите внимание, что файловая система ZFS будет настроена " "после успешной установки и загрузки операционной системы FreeBSD." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:242 msgid "" "The following example will describe how to create slices and labels, " "initialize man:gmirror[8] on each partition and how to create a UFS2 file " "system in each mirrored partition:" msgstr "" -"Следующий пример описывает, как создать слайсы и метки, инициализировать " -"man:gmirror[8] на каждом разделе и как создать файловую систему UFS2 в " -"каждом зеркальном разделе:" +"Следующий пример описывает, как создать слайсы и метки, инициализировать man:" +"gmirror[8] на каждом разделе и как создать файловую систему UFS2 в каждом " +"зеркальном разделе:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:258 #, no-wrap msgid "" "# fdisk -BI /dev/ad0 <.>\n" "# fdisk -BI /dev/ad1\n" "# bsdlabel -wB /dev/ad0s1 <.>\n" "# bsdlabel -wB /dev/ad1s1\n" "# bsdlabel -e /dev/ad0s1 <.>\n" "# bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt <.>\n" "# gmirror label root /dev/ad[01]s1a <.>\n" "# gmirror label var /dev/ad[01]s1d\n" "# gmirror label usr /dev/ad[01]s1e\n" "# gmirror label -F swap /dev/ad[01]s1b <.>\n" "# newfs /dev/mirror/root <.>\n" "# newfs /dev/mirror/var\n" "# newfs /dev/mirror/usr\n" msgstr "" "# fdisk -BI /dev/ad0 <.>\n" "# fdisk -BI /dev/ad1\n" "# bsdlabel -wB /dev/ad0s1 <.>\n" "# bsdlabel -wB /dev/ad1s1\n" "# bsdlabel -e /dev/ad0s1 <.>\n" "# bsdlabel /dev/ad0s1 > /tmp/bsdlabel.txt && bsdlabel -R /dev/ad1s1 /tmp/bsdlabel.txt <.>\n" "# gmirror label root /dev/ad[01]s1a <.>\n" "# gmirror label var /dev/ad[01]s1d\n" "# gmirror label usr /dev/ad[01]s1e\n" "# gmirror label -F swap /dev/ad[01]s1b <.>\n" "# newfs /dev/mirror/root <.>\n" "# newfs /dev/mirror/var\n" "# newfs /dev/mirror/usr\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:261 msgid "" "Create a slice covering the entire disk and initialize the boot code " "contained in sector 0 of the given disk. Repeat this command for all hard " "drives in the system." msgstr "" "Создайте раздел, охватывающий весь диск, и инициализируйте загрузочный код, " "содержащийся в секторе 0 данного диска. Повторите эту команду для всех " "жестких дисков в системе." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:263 msgid "Write a standard label for each disk including the bootstrap code." msgstr "Запишите стандартную метку для каждого диска, включая загрузочный код." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:265 msgid "" "Now, manually edit the label of the given disk. Refer to the man:bsdlabel[8] " "manual page to find out how to create partitions. Create partitions `a` for " "[.filename]#/# (root) file system, `b` for swap, `d` for [.filename]#/var#, " "`e` for [.filename]#/usr# and finally `f` which will later be used for ZFS." msgstr "" "Теперь вручную отредактируйте метку указанного диска. Обратитесь к странице " "руководства man:bsdlabel[8], чтобы узнать, как создавать разделы. Создайте " "раздел `a` для [.filename]#/# — корневой файловой системы, `b` для раздела " "подкачки, `d` для [.filename]#/var#, `e` для [.filename]#/usr# и, наконец, " "`f`, который позже будет использоваться для ZFS." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:267 msgid "" "Import the recently created label for the second hard drive, so both hard " "drives will be labeled in the same way." msgstr "" "Импортируйте только что созданную метку для второго жесткого диска, чтобы " "оба жестких диска были размечены одинаковым образом." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:269 msgid "Initialize man:gmirror[8] on each partition." msgstr "Инициализируйте man:gmirror[8] на каждом разделе." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:271 msgid "" "Note that `-F` is used for the swap partition. This instructs man:gmirror[8] " "to assume that the device is in the consistent state after the power/system " "failure." msgstr "" "Обратите внимание, что `-F` используется для раздела подкачки. Это указывает " "man:gmirror[8] предполагать, что устройство находится в согласованном " "состоянии после сбоя питания/системы." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:273 msgid "Create a UFS2 file system on each mirrored partition." msgstr "Создайте файловую систему UFS2 на каждом зеркальном разделе." #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:274 #, no-wrap msgid "System Installation" msgstr "Установка системы" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:279 msgid "" "This is the most important part. This section will describe how to actually " "install the minimal distribution of FreeBSD on the hard drives that we have " "prepared in the previous section. To accomplish this goal, all file systems " "need to be mounted so `sysinstall` may write the contents of FreeBSD to the " "hard drives:" msgstr "" "Это самая важная часть. В этом разделе будет описано, как фактически " "установить минимальный дистрибутив FreeBSD на жёсткие диски, которые мы " "подготовили в предыдущем разделе. Для достижения этой цели необходимо " "смонтировать все файловые системы, чтобы `sysinstall` мог записать " "содержимое FreeBSD на жёсткие диски:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:286 #, no-wrap msgid "" "# mount /dev/mirror/root /mnt\n" "# mkdir /mnt/var /mnt/usr\n" "# mount /dev/mirror/var /mnt/var\n" "# mount /dev/mirror/usr /mnt/usr\n" msgstr "" "# mount /dev/mirror/root /mnt\n" "# mkdir /mnt/var /mnt/usr\n" "# mount /dev/mirror/var /mnt/var\n" "# mount /dev/mirror/usr /mnt/usr\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:293 msgid "" -"When you are done, start man:sysinstall[8]. Select the " -"[.guimenuitem]#Custom# installation from the main menu. Select " -"[.guimenuitem]#Options# and press kbd:[Enter]. With the help of arrow keys, " +"When you are done, start man:sysinstall[8]. Select the [." +"guimenuitem]#Custom# installation from the main menu. Select [." +"guimenuitem]#Options# and press kbd:[Enter]. With the help of arrow keys, " "move the cursor on the `Install Root` item, press kbd:[Space] and change it " "to [.filename]#/mnt#. Press kbd:[Enter] to submit your changes and exit the " "[.guimenuitem]#Options# menu by pressing kbd:[q]." msgstr "" -"Когда вы закончите, запустите man:sysinstall[8]. Выберите установку " -"[.guimenuitem]#Custom# в главном меню. Выберите [.guimenuitem]#Options# и " +"Когда вы закончите, запустите man:sysinstall[8]. Выберите установку [." +"guimenuitem]#Custom# в главном меню. Выберите [.guimenuitem]#Options# и " "нажмите kbd:[Enter]. С помощью клавиш со стрелками переместите курсор на " "пункт `Install Root`, нажмите kbd:[Space] и измените его на [.filename]#/" -"mnt#. Нажмите kbd:[Enter], чтобы подтвердить изменения, и выйдите из меню " -"[.guimenuitem]#Options#, нажав kbd:[q]." +"mnt#. Нажмите kbd:[Enter], чтобы подтвердить изменения, и выйдите из меню [." +"guimenuitem]#Options#, нажав kbd:[q]." #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:297 msgid "" "Note that this step is very important and if skipped, `sysinstall` will be " "unable to install FreeBSD." msgstr "" "Обратите внимание, что этот шаг очень важен, и если его пропустить, " "`sysinstall` не сможет установить FreeBSD." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:302 msgid "" "Go to the [.guimenuitem]#Distributions# menu, move the cursor with the arrow " "keys to `Minimal`, and check it by pressing kbd:[Space]. This article uses " "the Minimal distribution to save network traffic, because the system itself " "will be installed over ftp. Exit this menu by choosing `Exit`." msgstr "" "Перейдите в меню [.guimenuitem]#Distributions#, с помощью клавиш со " "стрелками переместите курсор к пункту `Minimal` и отметьте его, нажав kbd:" "[Space]. В этой статье используется дистрибутив Minimal для экономии " "сетевого трафика, так как сама система будет устанавливаться через ftp. " "Выйдите из этого меню, выбрав `Exit`." #. type: delimited block = 4 #: documentation/content/en/articles/remote-install/_index.adoc:306 msgid "" "The [.guimenuitem]#Partition# and [.guimenuitem]#Label# menus will be " "skipped, as these are useless now." msgstr "" "[.guimenuitem]#Partition# и [.guimenuitem]#Label# будут пропущены, так как " "сейчас они бесполезны." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:311 msgid "" "In the [.guimenuitem]#Media# menu, select `FTP`. Select the nearest mirror " "and let `sysinstall` assume that the network is already configured. You " "will be returned back to the [.guimenuitem]#Custom# menu." msgstr "" "В меню [.guimenuitem]#Media# выберите `FTP`. Выберите ближайший зеркальный " "сервер и позвольте `sysinstall` предположить, что сеть уже настроена. Вы " "вернётесь обратно в меню [.guimenuitem]#Custom#." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:314 msgid "" -"Finally, perform the system installation by selecting the last option, " -"[.guimenuitem]#Commit#. Exit `sysinstall` when it finishes the installation." +"Finally, perform the system installation by selecting the last option, [." +"guimenuitem]#Commit#. Exit `sysinstall` when it finishes the installation." msgstr "" -"Наконец, выполните установку системы, выбрав последний пункт " -"[.guimenuitem]#Commit#. Выйдите из `sysinstall` после завершения установки." +"Наконец, выполните установку системы, выбрав последний пункт [." +"guimenuitem]#Commit#. Выйдите из `sysinstall` после завершения установки." #. type: Title === #: documentation/content/en/articles/remote-install/_index.adoc:315 #, no-wrap msgid "Post Installation Steps" msgstr "Шаги после установки" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:319 msgid "" "The FreeBSD operating system should be installed now; however, the process " "is not finished yet. It is necessary to perform some post installation " "steps to allow FreeBSD to boot in the future and to be able to log in to the " "system." msgstr "" "Операционная система FreeBSD теперь должна быть установлена; однако процесс " "еще не завершен. Необходимо выполнить несколько шагов после установки, чтобы " "FreeBSD могла загружаться в будущем и чтобы можно было войти в систему." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:322 msgid "" "You must now man:chroot[8] into the freshly installed system to finish the " "installation. Use the following command:" msgstr "" "Вы должны теперь выполнить man:chroot[8] в только что установленную систему, " "чтобы завершить установку. Используйте следующую команду:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:326 #, no-wrap msgid "# chroot /mnt\n" msgstr "# chroot /mnt\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:329 msgid "To complete our goal, perform these steps:" msgstr "Для достижения нашей цели выполните следующие шаги:" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:331 msgid "Copy the `GENERIC` kernel to the [.filename]#/boot/kernel# directory:" msgstr "Скопируйте ядро `GENERIC` в директорию [.filename]#/boot/kernel#:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:335 #, no-wrap msgid "# cp -Rp /boot/GENERIC/* /boot/kernel\n" msgstr "# cp -Rp /boot/GENERIC/* /boot/kernel\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:338 msgid "" -"Create the [.filename]#/etc/rc.conf#, [.filename]#/etc/resolv.conf# and " -"[.filename]#/etc/fstab# files. Do not forget to properly set the network " +"Create the [.filename]#/etc/rc.conf#, [.filename]#/etc/resolv.conf# and [." +"filename]#/etc/fstab# files. Do not forget to properly set the network " "information and to enable sshd in [.filename]#/etc/rc.conf#. The contents of " "[.filename]#/etc/fstab# will be similar to the following:" msgstr "" -"Создайте файлы [.filename]#/etc/rc.conf#, [.filename]#/etc/resolv.conf# и " -"[.filename]#/etc/fstab#. Не забудьте правильно настроить сетевые параметры и " +"Создайте файлы [.filename]#/etc/rc.conf#, [.filename]#/etc/resolv.conf# и [." +"filename]#/etc/fstab#. Не забудьте правильно настроить сетевые параметры и " "включить sshd в [.filename]#/etc/rc.conf#. Содержимое [.filename]#/etc/" "fstab# будет выглядеть примерно следующим образом:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:347 #, no-wrap msgid "" "# Device Mountpoint FStype Options Dump Pass#\n" "/dev/mirror/swap none swap sw 0 0\n" "/dev/mirror/root / ufs rw 1 1\n" "/dev/mirror/usr /usr ufs rw 2 2\n" "/dev/mirror/var /var ufs rw 2 2\n" "/dev/cd0 /cdrom cd9660 ro,noauto 0 0\n" msgstr "" "# Device Mountpoint FStype Options Dump Pass#\n" "/dev/mirror/swap none swap sw 0 0\n" "/dev/mirror/root / ufs rw 1 1\n" "/dev/mirror/usr /usr ufs rw 2 2\n" "/dev/mirror/var /var ufs rw 2 2\n" "/dev/cd0 /cdrom cd9660 ro,noauto 0 0\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:349 msgid "Create [.filename]#/boot/loader.conf# with the following contents:" msgstr "Создайте файл [.filename]#/boot/loader.conf# со следующим содержимым:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:354 #, no-wrap msgid "" "geom_mirror_load=\"YES\"\n" "zfs_load=\"YES\"\n" msgstr "" "geom_mirror_load=\"YES\"\n" "zfs_load=\"YES\"\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:356 msgid "" "Perform the following command, which will make ZFS available on the next " "boot:" msgstr "" "Выполните следующую команду, чтобы сделать ZFS доступным при следующей " "загрузке:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:360 #, no-wrap msgid "# sysrc zfs_enable=\"YES\"\n" msgstr "# sysrc zfs_enable=\"YES\"\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:363 msgid "" "Add additional users to the system using the man:adduser[8] tool. Do not " "forget to add a user to the `wheel` group so you may obtain root access " "after the reboot." msgstr "" -"Добавьте дополнительных пользователей в систему с помощью инструмента " -"man:adduser[8]. Не забудьте добавить пользователя в группу `wheel`, чтобы " +"Добавьте дополнительных пользователей в систему с помощью инструмента man:" +"adduser[8]. Не забудьте добавить пользователя в группу `wheel`, чтобы " "получить доступ к root после перезагрузки." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:364 msgid "Double-check all your settings." msgstr "Перепроверьте все ваши настройки." #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:367 msgid "" "The system should now be ready for the next boot. Use the man:reboot[8] " "command to reboot your system." msgstr "" "Система теперь должна быть готова к следующей загрузке. Используйте команду " "man:reboot[8] для перезагрузки системы." #. type: Title == #: documentation/content/en/articles/remote-install/_index.adoc:369 #, no-wrap msgid "ZFS" msgstr "ZFS" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:373 msgid "" "If your system survived the reboot, it should now be possible to log in. " "Welcome to the fresh FreeBSD installation, performed remotely without the " "use of a remote console!" msgstr "" "Если ваша система пережила перезагрузку, теперь должно быть возможно войти в " "систему. Добро пожаловать в новую установку FreeBSD, выполненную удалённо " "без использования удалённой консоли!" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:376 msgid "" -"The only remaining step is to configure man:zpool[8] and create some " -"man:zfs[8] file systems. Creating and administering ZFS is very " +"The only remaining step is to configure man:zpool[8] and create some man:" +"zfs[8] file systems. Creating and administering ZFS is very " "straightforward. First, create a mirrored pool:" msgstr "" "Остался только последний шаг — настроить man:zpool[8] и создать несколько " "файловых систем man:zfs[8]. Создание и администрирование ZFS очень просто. " "Сначала создайте зеркальный пул:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:380 #, no-wrap msgid "# zpool create tank mirror /dev/ad[01]s1f\n" msgstr "# zpool create tank mirror /dev/ad[01]s1f\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:383 msgid "Next, create some file systems:" msgstr "Далее создайте несколько файловых систем:" #. type: delimited block . 4 #: documentation/content/en/articles/remote-install/_index.adoc:392 #, no-wrap msgid "" "# zfs create tank/ports\n" "# zfs create tank/src\n" "# zfs set compression=gzip tank/ports\n" "# zfs set compression=on tank/src\n" "# zfs set mountpoint=/usr/ports tank/ports\n" "# zfs set mountpoint=/usr/src tank/src\n" msgstr "" "# zfs create tank/ports\n" "# zfs create tank/src\n" "# zfs set compression=gzip tank/ports\n" "# zfs set compression=on tank/src\n" "# zfs set mountpoint=/usr/ports tank/ports\n" "# zfs set mountpoint=/usr/src tank/src\n" #. type: Plain text #: documentation/content/en/articles/remote-install/_index.adoc:395 msgid "" "That is all. If you are interested in more details about ZFS on FreeBSD, " "please refer to the https://wiki.freebsd.org/ZFS[ZFS] section of the FreeBSD " "Wiki." msgstr "" "Вот и все. Если вас интересуют более подробные сведения о ZFS в FreeBSD, " "обратитесь к разделу https://wiki.freebsd.org/ZFS[ZFS] на вики FreeBSD." diff --git a/documentation/content/ru/articles/serial-uart/_index.adoc b/documentation/content/ru/articles/serial-uart/_index.adoc index 9b3e9830dd..09e043fe60 100644 --- a/documentation/content/ru/articles/serial-uart/_index.adoc +++ b/documentation/content/ru/articles/serial-uart/_index.adoc @@ -1,1034 +1,1034 @@ --- 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: :sectnumlevels: 6 :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. === Стандарты RS232-C и V.24 В большинстве компьютерных систем 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 году, они могут не отражать текущую производительность данного продукта от поставщика. Следует отметить, что 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 должны выполняться при отключенных прерываниях. + Бит 6 -> Установка прерывания. При установке в "1" передатчик начинает передавать непрерывный интервал (Spacing), пока этот бит не будет сброшен в "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] в руководстве FreeBSD для получения общих инструкций. Ниже приведены конкретные настройки для платы Boca 16, предполагается, что вы используете ядро с именем MYKERNEL и редактируете его с помощью vi. +Если у вас ещё нет настроенного файла конфигурации пользовательского ядра, обратитесь к 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 229288e632..f223723459 100644 --- a/documentation/content/ru/articles/serial-uart/_index.po +++ b/documentation/content/ru/articles/serial-uart/_index.po @@ -1,3964 +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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2022-02-01 10:28-0300\n" -"PO-Revision-Date: 2025-10-29 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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/serial-uart/_index.adoc:1 #, no-wrap msgid "Detailed information about the use of serial ports and UART with FreeBSD" -msgstr "" -"Подробная информация об использовании последовательных портов и UART в " -"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 msgid "Abstract" msgstr "Аннотация" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:46 msgid "This article talks about using serial hardware with FreeBSD." msgstr "" "Эта статья рассказывает об использовании последовательного оборудования с " "FreeBSD." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:48 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/serial-uart/_index.adoc:52 #, 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 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 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 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 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 msgid "Some common acronyms are:" msgstr "Некоторые распространённые сокращения:" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:70 msgid "UART Universal Asynchronous Receiver/Transmitter" msgstr "" "UART Universal Asynchronous Receiver/Transmitter — Универсальный асинхронный " "приёмопередатчик" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:73 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 #, no-wrap msgid "Synchronous Serial Transmission" msgstr "Синхронная последовательная передача" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:79 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 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 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 #, no-wrap msgid "Asynchronous Serial Transmission" msgstr "Асинхронная последовательная передача" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:91 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 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 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 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 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 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 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 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 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 #, no-wrap msgid "Other UART Functions" msgstr "Другие функции UART" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:124 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, является модемом, " "модем может сообщать о наличии несущей на телефонной линии, в то время как " "компьютер может дать команду модему сбросить себя или не принимать вызовы, " "поднимая или опуская один или несколько из этих дополнительных сигналов. " "Функция каждого из этих дополнительных сигналов определена в стандарте EIA " "RS232-C." #. type: Title === #: documentation/content/en/articles/serial-uart/_index.adoc:125 #, 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 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-C." +"CCITT под названием V.24, который отражает спецификации, включенные в RS232-" +"C." #. type: Title ==== #: documentation/content/en/articles/serial-uart/_index.adoc:130 #, 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 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). Когда линия связи находится в состоянии покоя, говорят, " +"В стандарте RS232-C значение `1` называется `Маркер` (Mark), а значение `0` " +"— `Пробел` (Space). Когда линия связи находится в состоянии покоя, говорят, " "что она \"маркирует\" (Marking), то есть передаёт непрерывные значения `1`." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:139 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 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 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 #, no-wrap msgid "RS232-C Break Signal" msgstr "Сигнал Break в RS232-C" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:150 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 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 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 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 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 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 в ответ на специальную команду от главного управляющего устройства (" -"процессора передачи)." +"Spacing в ответ на специальную команду от главного управляющего устройства " +"(процессора передачи)." #. type: Title ==== #: documentation/content/en/articles/serial-uart/_index.adoc:170 #, 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 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 — Data Carrier Equipment). Обычно устройство DTE — это терминал " +"(или компьютер), а DCE — модем. На другом конце телефонной линии в разговоре " "принимающий модем также является устройством DCE, а компьютер, подключённый " "к этому модему, — устройством DTE. Устройство DCE принимает сигналы на тех " "контактах, на которых устройство DTE передаёт, и наоборот." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:180 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 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 #, no-wrap msgid "RS232-C Pin Assignments" msgstr "Назначение контактов RS232-C" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:187 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 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 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 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 #, no-wrap msgid "DB25 RS232-C Pin" msgstr "Контакт в DB25 RS232-C" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:201 #, no-wrap msgid "DB9 IBM PC Pin" msgstr "Контакт в DB9 IBM PC" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:202 #, no-wrap msgid "EIA Circuit Symbol" msgstr "Символ цепи по EIA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:203 #, no-wrap msgid "CCITT Circuit Symbol" msgstr "Символ цепи по CCITT" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:204 #, no-wrap msgid "Common Name" msgstr "Общее имя" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:205 #, 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 #, 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 #, 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: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: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: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: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: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:401 #: documentation/content/en/articles/serial-uart/_index.adoc:402 #: documentation/content/en/articles/serial-uart/_index.adoc:404 #, no-wrap msgid "-" msgstr "-" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:210 #, no-wrap msgid "AA" msgstr "AA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:211 #, no-wrap msgid "101" msgstr "101" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:212 #, no-wrap msgid "PG/FG" msgstr "PG/FG" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:215 #, 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 #, 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 #, no-wrap msgid "3" msgstr "3" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:218 #, no-wrap msgid "BA" msgstr "BA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:219 #, no-wrap msgid "103" msgstr "103" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:220 #, 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 #, no-wrap msgid "DTE" msgstr "DTE" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:223 #, no-wrap msgid "Transmit Data" msgstr "Передача Данных (Transmit Data)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:226 #, no-wrap msgid "BB" msgstr "BB" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:227 #, no-wrap msgid "104" msgstr "104" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:228 #, 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 #, no-wrap msgid "DCE" msgstr "DCE" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:231 #, 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 #, 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 #, no-wrap msgid "7" msgstr "7" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:234 #, no-wrap msgid "CA" msgstr "CA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:235 #, no-wrap msgid "105" msgstr "105" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:236 #, no-wrap msgid "RTS" msgstr "RTS" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:239 #, 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 #, 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 #, no-wrap msgid "8" msgstr "8" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:242 #, no-wrap msgid "CB" msgstr "CB" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:243 #, no-wrap msgid "106" msgstr "106" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:244 #, no-wrap msgid "CTS" msgstr "CTS" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:247 #, no-wrap msgid "Clear to Send" msgstr "Готовность к приёму (Clear to Send)" #. type: Table #: 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 #, no-wrap msgid "CC" msgstr "CC" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:251 #, no-wrap msgid "107" msgstr "107" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:252 #, no-wrap msgid "DSR" msgstr "DSR" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:255 #, no-wrap msgid "Data Set Ready" msgstr "Готовность терминального оборудования (Data Set Ready)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:258 #, no-wrap msgid "AV" msgstr "AV" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:259 #, no-wrap msgid "102" msgstr "102" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:260 #, no-wrap msgid "SG/GND" msgstr "SG/GND" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:263 #, no-wrap msgid "Signal Ground" msgstr "Сигнальная земля (Signal Ground)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:266 #, no-wrap msgid "CF" msgstr "CF" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:267 #, no-wrap msgid "109" msgstr "109" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:268 #, no-wrap msgid "DCD/CD" msgstr "DCD/CD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:271 #, 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 #, 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 #, no-wrap msgid "Reserved for Test" msgstr "Зарезервировано для Теста" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:280 #, no-wrap msgid "10" msgstr "10" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:288 #, no-wrap msgid "11" msgstr "11" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:296 #, no-wrap msgid "12" msgstr "12" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:298 #, no-wrap msgid "CI" msgstr "CI" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:299 #, no-wrap msgid "122" msgstr "122" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:300 #, no-wrap msgid "SRLSD" msgstr "SRLSD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:303 #, no-wrap msgid "Sec. Recv. Line Signal Detector" msgstr "Детектор сигнала вторичной линии приёма" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:304 #, no-wrap msgid "13" msgstr "13" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:306 #, no-wrap msgid "SCB" msgstr "SCB" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:307 #, no-wrap msgid "121" msgstr "121" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:308 #, no-wrap msgid "SCTS" msgstr "SCTS" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:311 #, no-wrap msgid "Secondary Clear to Send" msgstr "Вторичный сигнал готовности к приёму" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:312 #, no-wrap msgid "14" msgstr "14" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:314 #, no-wrap msgid "SBA" msgstr "SBA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:315 #, no-wrap msgid "118" msgstr "118" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:316 #, no-wrap msgid "STD" msgstr "STD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:319 #, no-wrap msgid "Secondary Transmit Data" msgstr "Вторичная линия передачи данных" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:320 #, no-wrap msgid "15" msgstr "15" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:322 #, no-wrap msgid "DB" msgstr "DB" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:323 #, 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 #, 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 #, no-wrap msgid "Trans. Sig. Element Timing" msgstr "Тактирование элементов сигнала передатчика (Trans. Sig. Element Timing)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:328 #, no-wrap msgid "16" msgstr "16" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:330 #, no-wrap msgid "SBB" msgstr "SBB" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:331 #, no-wrap msgid "119" msgstr "119" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:332 #, no-wrap msgid "SRD" msgstr "SRD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:335 #, no-wrap msgid "Secondary Received Data" msgstr "Вторичная линия приема данных" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:336 #, no-wrap msgid "17" msgstr "17" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:338 #, no-wrap msgid "DD" msgstr "DD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:339 #, no-wrap msgid "115" msgstr "115" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:340 #, no-wrap msgid "RSET" msgstr "RSET" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:343 #, no-wrap msgid "Receiver Signal Element Timing" -msgstr "" -"Тактирование элементов сигнала приёмника (Receiver Signal Element Timing)" +msgstr "Тактирование элементов сигнала приёмника (Receiver Signal Element Timing)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:344 #, no-wrap msgid "18" msgstr "18" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:347 #, no-wrap msgid "141" msgstr "141" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:348 #, no-wrap msgid "LOOP" msgstr "LOOP" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:351 #, 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 #, no-wrap msgid "19" msgstr "19" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:354 #, no-wrap msgid "SCA" msgstr "SCA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:355 #, no-wrap msgid "120" msgstr "120" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:356 #, no-wrap msgid "SRS" msgstr "SRS" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:359 #, no-wrap msgid "Secondary Request to Send" msgstr "Вторичный запрос на передачу" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:360 #, no-wrap msgid "20" msgstr "20" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:362 #, no-wrap msgid "CD" msgstr "CD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:363 #, no-wrap msgid "108.2" msgstr "108.2" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:364 #, no-wrap msgid "DTR" msgstr "DTR" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:367 #, no-wrap msgid "Data Terminal Ready" msgstr "Готовность терминального оборудования (Data Terminal Ready)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:368 #, no-wrap msgid "21" msgstr "21" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:372 #, no-wrap msgid "RDL" msgstr "RDL" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:375 #, no-wrap msgid "Remote Digital Loopback" msgstr "Режим удалённой цифровой петли (Remote Digital Loopback)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:376 #, no-wrap msgid "22" msgstr "22" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:378 #, no-wrap msgid "CE" msgstr "CE" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:379 #, no-wrap msgid "125" msgstr "125" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:380 #, no-wrap msgid "RI" msgstr "RI" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:383 #, 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 #, no-wrap msgid "23" msgstr "23" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:386 #, no-wrap msgid "CH" msgstr "CH" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:387 #, no-wrap msgid "111" msgstr "111" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:388 #, no-wrap msgid "DSRS" msgstr "DSRS" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:391 #, no-wrap msgid "Data Signal Rate Selector" msgstr "Селектор скорости передачи данных" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:392 #, no-wrap msgid "24" msgstr "24" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:394 #, no-wrap msgid "DA" msgstr "DA" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:395 #, no-wrap msgid "113" msgstr "113" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:400 #, no-wrap msgid "25" msgstr "25" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:403 #, no-wrap msgid "142" msgstr "142" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:406 #, no-wrap msgid "Test Mode" msgstr "Режим тестирования" #. type: Title === #: documentation/content/en/articles/serial-uart/_index.adoc:408 #, no-wrap msgid "Bits, Baud and Symbols" msgstr "Биты, Боды и Символы" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:412 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 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 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 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 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 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 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 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 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, а термины «Бод» или «Биты в секунду» допустимы, когда соединение " -"устанавливается между двумя системами с проводным подключением или " -"используется модем, не выполняющий коррекцию ошибок или сжатие." +"искажать реальную скорость передачи. Таким образом, термин «Биты в " +"секунду» (bps) является корректным для описания скорости передачи на " +"интерфейсе DCE-DCE, а термины «Бод» или «Биты в секунду» допустимы, когда " +"соединение устанавливается между двумя системами с проводным подключением " +"или используется модем, не выполняющий коррекцию ошибок или сжатие." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:445 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 #, no-wrap msgid "The IBM Personal Computer UART" msgstr "UART в IBM PC" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:450 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 #, no-wrap msgid "National Semiconductor UART Family Tree" msgstr "Генеалогическое дерево National Semiconductor UART" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:454 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 #, 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 #, no-wrap msgid "INS8250" msgstr "INS8250" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:472 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 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 #, no-wrap msgid "INS8250-B" msgstr "INS8250-B" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:479 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 #, no-wrap msgid "INS8250A" msgstr "INS8250A" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:484 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 #, no-wrap msgid "INS82C50A" msgstr "INS82C50A" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:487 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 #, no-wrap msgid "NS16450" msgstr "NS16450" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:491 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 #, no-wrap msgid "NS16C450" msgstr "NS16C450" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:494 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 #, no-wrap msgid "NS16550" msgstr "NS16550" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:497 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 #, no-wrap msgid "NS16550A" msgstr "NS16550A" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:501 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 #, no-wrap msgid "NS16C552" msgstr "NS16C552" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:504 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 #, no-wrap msgid "PC16550D" msgstr "PC16550D" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:508 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 #, 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 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 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 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 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 #, no-wrap msgid "National Semiconductor Part Numbering System" msgstr "Система нумерации компонентов National Semiconductor" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:526 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 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 msgid "The `_p_` is the package-type field. The types are:" msgstr "`_p_` — это поле типа пакета. Типы:" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:536 #, no-wrap msgid "\"F\"" msgstr "\"F\"" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:537 #, no-wrap msgid "QFP" msgstr "QFP" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:539 #, 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 #, no-wrap msgid "\"N\"" msgstr "\"N\"" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:541 #, no-wrap msgid "DIP" msgstr "DIP" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:543 #, no-wrap msgid "(dual inline package) through hole straight lead type" -msgstr "" -"(dual inline package — корпус с двусторонним расположением выводов) для " -"сквозного монтажа с прямыми выводами" +msgstr "(dual inline package — корпус с двусторонним расположением выводов) для сквозного монтажа с прямыми выводами" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:544 #, no-wrap msgid "\"V\"" msgstr "\"V\"" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:545 #, no-wrap msgid "LPCC" msgstr "LPCC" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:546 #, 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 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 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 #, no-wrap msgid "Other Vendors and Similar UARTs" msgstr "Другие производители и аналогичные UART" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:559 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 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 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 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 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 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 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 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. Ниже приведен счетчик различий для некоторых из этих компонентов. " "Поскольку эти тесты проводились в 1994 году, они могут не отражать текущую " "производительность данного продукта от поставщика." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:586 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 #, no-wrap msgid "Vendor" msgstr "Поставщик" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:592 #, no-wrap msgid "Part Number" msgstr "Номер детали" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:594 #, 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 #, no-wrap msgid "National" msgstr "National" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:596 #, 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 #, no-wrap msgid "0" msgstr "0" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:600 #, no-wrap msgid "(NS16550AFN)" msgstr "(NS16550AFN)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:604 #, no-wrap msgid "(NS16C552V)" msgstr "(NS16C552V)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:607 #, no-wrap msgid "TI" msgstr "TI" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:608 #, no-wrap msgid "(TL16550AFN)" msgstr "(TL16550AFN)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:611 #, no-wrap msgid "CMD" msgstr "CMD" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:612 #, no-wrap msgid "(16C550PE)" msgstr "(16C550PE)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:615 #, no-wrap msgid "StarTech" msgstr "StarTech" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:616 #, no-wrap msgid "(ST16C550J)" msgstr "(ST16C550J)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:619 #, no-wrap msgid "Rockwell" msgstr "Rockwell" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:620 #, no-wrap msgid "Reference modem with internal 16550 or an emulation (RC144DPi/C3000-25)" -msgstr "" -"Стандартный модем с внутренним 16550 или его эмуляцией (RC144DPi/C3000-25)" +msgstr "Стандартный модем с внутренним 16550 или его эмуляцией (RC144DPi/C3000-25)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:622 #, no-wrap msgid "117" msgstr "117" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:623 #, no-wrap msgid "Sierra" msgstr "Sierra" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:624 #, 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 #, no-wrap msgid "91" msgstr "91" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:632 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 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 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 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 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 #, 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 #, no-wrap msgid "8250/16450/16550 Registers" msgstr "8250/16450/16550 Регистры" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:660 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 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 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 #, no-wrap msgid "I/O Port" msgstr "Порт ввода/вывода" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:673 #, 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 #, no-wrap msgid "+0x00" msgstr "+0x00" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:677 #, no-wrap msgid "write (DLAB==0)" msgstr "запись (DLAB==0)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:683 #, 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 #, no-wrap msgid "read (DLAB==0)" msgstr "чтение (DLAB==0)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:691 #, 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 из последовательного соединения, " -"доступны для чтения хостом через этот порт." +"Любые слова данных, полученные UART из последовательного соединения, доступны для чтения хостом через этот порт." #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:693 #: documentation/content/en/articles/serial-uart/_index.adoc:701 #, no-wrap msgid "write/read (DLAB==1)" msgstr "запись/чтение (DLAB==1)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:699 #, 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 " -"делителя." +"Это значение будет поделено от основного входного тактового сигнала (в 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 #, no-wrap msgid "+0x01" msgstr "+0x01" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:707 #, 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 делителя." +"Это значение будет разделено от основного входного тактового сигнала (в IBM PC основной тактовый сигнал равен 1,8432 МГц), и полученный тактовый сигнал будет определять скорость передачи данных UART. Этот регистр содержит биты с 8 по 15 делителя." #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:709 #, no-wrap msgid "write/read (DLAB==0)" msgstr "запись/чтение (DLAB==0)" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:721 #, 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" +"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." +"Бит 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 #, no-wrap msgid "+0x02" msgstr "+0x02" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:723 #, no-wrap msgid "write" msgstr "запись" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:740 #, 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. +" +"Бит 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 #, no-wrap msgid "read" msgstr "чтение" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:758 #, 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" +"Бит 3 -> Бит идентификатора прерывания №2. На UART 8250/16450 этот бит равен нулю. +\n" "Бит 2 -> Бит идентификатора прерывания №1 +\n" -"Бит 1 -> Бит идентификатора прерывания №0.Эти три бита объединяются для " -"указания категории события, вызвавшего текущее прерывание. Эти категории " -"имеют приоритеты, поэтому, если несколько категорий событий происходят " -"одновременно, UART сообщит о более важных событиях первыми, и хост должен " -"обрабатывать события в порядке их поступления. Все события, вызвавшие " -"текущее прерывание, должны быть обработаны до генерации новых прерываний. (" -"Это ограничение архитектуры ПК.) +\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" +"1 1 0 Второй Идентификация уровня триггера (Устаревшие данные в буфере приема) +\n" "0 0 1 Третий Передатчик готов принять больше данных (THRE) +\n" "0 0 0 Четвертый Изменение состояния модема (-CTS, -DSR, -RI или -DCD) +\n" -"Бит 0 -> Бит ожидания прерывания. Если этот бит установлен в \"0\", то как " -"минимум одно прерывание ожидает обработки." +"Бит 0 -> Бит ожидания прерывания. Если этот бит установлен в \"0\", то как минимум одно прерывание ожидает обработки." #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:759 #, 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 #, no-wrap msgid "write/read" msgstr "запись/чтение" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:776 #, 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 #, no-wrap msgid "+0x04" msgstr "+0x04" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:788 #, 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 переходит в низкий уровень (активное состояние). +" +"Бит 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 #, no-wrap msgid "+0x05" msgstr "+0x05" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:800 #, 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 #, no-wrap msgid "+0x06" msgstr "+0x06" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:811 #, 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" +"Бит 7 -> Обнаружение несущей данных (DCD). Отражает состояние линии DCD на UART. +\n" "Бит 6 -> Индикатор вызова (RI). Отражает состояние линии RI на UART. +\n" -"Бит 5 -> Готовность передатчика данных (DSR). Отражает состояние линии DSR " -"на 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 хостом. +" +"Бит 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 #, no-wrap msgid "+0x07" msgstr "+0x07" #. type: Table #: documentation/content/en/articles/serial-uart/_index.adoc:814 #, 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. Хост может записать любое значение в это место и позднее " -"считать его." +msgstr "Регистр Scratch (SCR — Scratch Register). Этот регистр не выполняет никакой функции в UART. Хост может записать любое значение в это место и позднее считать его." #. type: Title === #: documentation/content/en/articles/serial-uart/_index.adoc:816 #, no-wrap msgid "Beyond the 16550A UART" msgstr "За пределами UART 16550A" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:821 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 #, no-wrap msgid "ST16650" msgstr "ST16650" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:825 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 #, no-wrap msgid "TIL16660" msgstr "TIL16660" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:829 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 #, no-wrap msgid "Hayes ESP" msgstr "Hayes ESP" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:833 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 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 #, no-wrap msgid "Configuring the [.filename]#sio# driver" msgstr "Настройка драйвера [.filename]#sio#" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:845 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. Также " +"Драйвер [.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 #, 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 msgid "_Contributed by `{awebster}`. 26 August 1995._" msgstr "_Предоставлено `{awebster}`. 26 августа 1995._" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:853 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 #, 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 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 #, no-wrap msgid "Boca 16" msgstr "Boca 16" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:871 msgid "_Contributed by `{whiteside}`. 26 August 1995._" msgstr "_Предоставлено `{whiteside}`. 26 августа 1995._" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:873 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 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 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 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 msgid "" "If you do not already have a custom kernel configuration file set up, refer " -"to extref:{handbook}[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." +"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] в " -"руководстве FreeBSD для получения общих инструкций. Ниже приведены " +"обратитесь к extref:{handbook}kernelconfig[Конфигурация ядра, kernelconfig] " +"в руководстве FreeBSD для получения общих инструкций. Ниже приведены " "конкретные настройки для платы Boca 16, предполагается, что вы используете " "ядро с именем MYKERNEL и редактируете его с помощью vi." #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:887 msgid "Add the line" msgstr "Добавьте строку" #. type: delimited block . 4 #: documentation/content/en/articles/serial-uart/_index.adoc:891 #, no-wrap msgid "options COM_MULTIPORT\n" msgstr "options COM_MULTIPORT\n" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:893 msgid "to the config file." msgstr "в конфигурационный файл." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:894 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 #, 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 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 #, 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 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 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 #, 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 msgid "If the messages go by too fast to see," msgstr "Если сообщения проходят слишком быстро, чтобы их увидеть," #. type: delimited block . 4 #: documentation/content/en/articles/serial-uart/_index.adoc:961 #, no-wrap msgid "# dmesg | more\n" msgstr "# dmesg | more\n" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:963 msgid "will show you the boot messages." msgstr "покажет вам сообщения загрузки." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:964 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 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 #, 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 #, 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 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 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 #, no-wrap msgid "# echo at > ttyd*\n" msgstr "# echo at > ttyd*\n" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:986 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 #, no-wrap msgid "Support for Cheap Multi-UART Cards" msgstr "Поддержка дешёвых многоканальных UART-карт" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:991 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 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 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 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 #, 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 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 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 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 #, 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 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 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 #, 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 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`, который " +"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 #, 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 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 #, no-wrap msgid "Configuring the [.filename]#cy# driver" msgstr "Настройка драйвера [.filename]#cy#" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:1077 msgid "_Contributed by Alex Nash. 6 June 1996._" msgstr "_Предоставлено Алексом Нэшем. 6 июня 1996._" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:1080 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 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 #, 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 msgid "Rebuild and install the new kernel." msgstr "Перестройте и установите новый образ ядра." #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:1091 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 #, 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 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 #, 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 msgid "Reboot with the new kernel." msgstr "Перезагрузитесь с новым ядром." #. type: Title == #: documentation/content/en/articles/serial-uart/_index.adoc:1111 #, no-wrap msgid "Configuring the [.filename]#si# driver" msgstr "Настройка драйвера [.filename]#si#" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:1114 msgid "_Contributed by `{nsayer}`. 25 March 1998._" msgstr "_Предоставлено `{nsayer}`. 25 марта 1998._" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:1118 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 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 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 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 msgid "ISA SX host card" msgstr "ISA SX host card" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:1124 msgid "PCI SX host card" msgstr "PCI SX host card" #. type: delimited block = 4 #: documentation/content/en/articles/serial-uart/_index.adoc:1130 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 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 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 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 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 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 #, 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 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 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 #, no-wrap msgid "device si0\n" msgstr "device si0\n" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:1156 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 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 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 #, 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 msgid "(where _nn_ is the number of ports)" msgstr "(где _nn_ — количество портов)" #. type: Plain text #: documentation/content/en/articles/serial-uart/_index.adoc:1175 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 #, 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 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 b34c3c0a9e..5d180a0d30 100644 --- a/documentation/content/ru/articles/vinum/_index.adoc +++ b/documentation/content/ru/articles/vinum/_index.adoc @@ -1,601 +1,601 @@ --- 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: :sectnumlevels: 6 :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# больше не доступна в кодовой базе. +Начиная с 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, Организация методом объединения] иллюстрирует последовательность выделения блоков хранения в организации методом объединения. +Равномерность нагрузки на диски сильно зависит от способа распределения данных по накопителям. В дальнейшем обсуждении удобно представлять дисковое хранилище как большое количество секторов данных, адресуемых по номерам, подобно страницам в книге. Наиболее очевидный метод — разделить виртуальный диск на группы последовательных секторов размером с отдельные физические диски и хранить их таким образом, как если бы большую книгу разорвали на меньшие разделы. Этот метод называется _объединением_ (конкатенацией) и имеет преимущество в том, что диски не требуют каких-либо определённых соотношений размеров. Он хорошо работает, когда доступ к виртуальному диску равномерно распределён по его адресному пространству. Если доступ сосредоточен на меньшей области, улучшение менее заметно. 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# реализует как объединение, так и чередование на уровне плекс: * _Плекс с объединением_ использует адресное пространство каждого поддиска по очереди. Объединённые плексы являются наиболее гибкими, так как могут содержать любое количество поддисков, а поддиски могут быть разной длины. Плекс может быть расширен путём добавления дополнительных поддисков. Они требуют меньше процессорного времени, чем чередующиеся плексы, хотя разница в нагрузке на процессор незначительна. С другой стороны, они наиболее подвержены "горячим точкам", когда один диск очень активен, а другие простаивают. * _Плекс с чередованием_ распределяет данные по каждому поддиску. Поддиски должны быть одного размера, и их должно быть как минимум два, чтобы отличить такой плекс от объединенного. Главное преимущество чередующихся плексов в том, что они уменьшают вероятность появления "горячих точек". Выбрав оптимальный размер полосы (около 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 зеркалированием и чередованием] представляет структуру этого тома. [[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# для этого устройства. В приведенном выше примере все устройство выделено под [.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`. +Если [.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# и системный загрузчик больше не конфликтовали. +Аналогично, если описанная выше ситуация была исправлена загрузкой с "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 785c4e7350..71b7ebb866 100644 --- a/documentation/content/ru/articles/vinum/_index.po +++ b/documentation/content/ru/articles/vinum/_index.po @@ -1,2313 +1,2260 @@ # 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. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-01-24 10:22-0300\n" -"PO-Revision-Date: 2025-10-29 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-10 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 msgid "'''" msgstr "'''" #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:55 #, no-wrap msgid "Synopsis" msgstr "Обзор" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:62 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 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 " +"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 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 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]." +"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]." +"Пользователям рекомендуется перейти на 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 msgid "" "Starting with FreeBSD 5, [.filename]#vinum# has been rewritten to fit into " -"the extref:{handbook}[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." +"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], сохраняя при этом " +"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# больше не доступна в кодовой базе." #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:85 #, no-wrap msgid "Access Bottlenecks" msgstr "Узкие места доступа" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:89 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 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 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 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 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 " +"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 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 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, Организация методом объединения] иллюстрирует " +"сосредоточен на меньшей области, улучшение менее заметно. crossref:" +"vinum[vinum-concat, Организация методом объединения] иллюстрирует " "последовательность выделения блоков хранения в организации методом " "объединения." #. type: Block title #: documentation/content/en/articles/vinum/_index.adoc:118 #, no-wrap msgid "Concatenated Organization" msgstr "Организация методом объединения" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:119 #, no-wrap msgid "vinum-concat.png" msgstr "vinum-concat.png" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:125 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 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 #, no-wrap msgid "Striped Organization" msgstr "Организация методом чередования" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:132 #, no-wrap msgid "vinum-striped.png" msgstr "vinum-striped.png" #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:135 #, no-wrap msgid "Data Integrity" msgstr "Целостность данных" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:140 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 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 msgid "Mirroring has two problems:" msgstr "Зеркалирование имеет две проблемы:" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:147 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 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 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." +"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 #, no-wrap msgid "`RAID`-5 Organization" msgstr "Организация `RAID`-5" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:158 #, no-wrap msgid "vinum-raid5-org.png" msgstr "vinum-raid5-org.png" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:163 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 #, no-wrap msgid "[.filename]#vinum# Objects" msgstr "Объекты [.filename]#vinum#" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:168 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 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 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 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 " +"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 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 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 #, no-wrap msgid "Volume Size Considerations" msgstr "Учет размера томов" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:180 msgid "" -"Plexes can include multiple subdisks spread over all drives in the " -"[.filename]#vinum# configuration. As a result, the size of an individual " +"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 #, no-wrap msgid "Redundant Data Storage" msgstr "Избыточное хранение данных" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:186 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 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 #, no-wrap msgid "Which Plex Organization?" msgstr "Какую организацию плексов выбрать?" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:193 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 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 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 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 #, no-wrap msgid "[.filename]#vinum# Plex Organizations" msgstr "Организации плексов в [.filename]#vinum#" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:204 #, no-wrap msgid "Plex type" msgstr "Тип плекса" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:205 #, no-wrap msgid "Minimum subdisks" msgstr "Минимальное количество поддисков" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:206 #, no-wrap msgid "Can add subdisks" msgstr "Может добавлять поддиски" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:207 #, no-wrap msgid "Must be equal size" msgstr "Должен быть равного размера" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:209 #, no-wrap msgid "Application" msgstr "Приложение" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:210 #, no-wrap msgid "concatenated" msgstr "объединённый" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:211 #, no-wrap msgid "1" msgstr "1" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:212 #: documentation/content/en/articles/vinum/_index.adoc:219 #, no-wrap msgid "yes" msgstr "да" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:213 #: documentation/content/en/articles/vinum/_index.adoc:218 #, no-wrap msgid "no" msgstr "no" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:215 #, no-wrap msgid "Large data storage with maximum placement flexibility and moderate performance" -msgstr "" -"Крупное хранилище данных с максимальной гибкостью размещения и умеренной " -"производительностью" +msgstr "Крупное хранилище данных с максимальной гибкостью размещения и умеренной производительностью" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:216 #, no-wrap msgid "striped" msgstr "чередуемый" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:217 #, no-wrap msgid "2" msgstr "2" #. type: Table #: documentation/content/en/articles/vinum/_index.adoc:220 #, no-wrap msgid "High performance in combination with highly concurrent access" msgstr "Высокая производительность в сочетании с высокопараллельным доступом" #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:223 #, no-wrap msgid "Some Examples" msgstr "Некоторые примеры" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:229 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." +"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 #, no-wrap msgid "The Configuration File" msgstr "Файл конфигурации" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:234 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 #, 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 msgid "This file describes four [.filename]#vinum# objects:" msgstr "Этот файл описывает четыре объекта [.filename]#vinum#:" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:246 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 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 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_." +"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_." +"автоматически генерирует его из имени тома, добавляя суффикс _.px_, где _x_ " +"— номер плекса в томе. Таким образом, этот плекс будет называться _myvol.p0_." #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:249 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 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 #, 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 #, 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" +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 #, no-wrap msgid " V myvol State: up Plexes: 1 Size: 512 MB\n" -msgstr "" -" 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 #, 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" +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 #, 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" +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 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]." +"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 #, no-wrap msgid "A Simple [.filename]#vinum# Volume" msgstr "Простой том [.filename]#vinum#" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:276 #, no-wrap msgid "vinum-simple-vol.png" msgstr "vinum-simple-vol.png" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:280 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 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 #, no-wrap msgid "Increased Resilience: Mirroring" msgstr "Увеличенная отказоустойчивость: зеркалирование" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:291 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 #, 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 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 #, 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 #, 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" +"\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 #, 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" +" 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 #, 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" +" 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 #, 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" +" 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 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 #, no-wrap msgid "A Mirrored [.filename]#vinum# Volume" msgstr "Зеркальный том [.filename]#vinum#" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:332 #, no-wrap msgid "vinum-mirrored-vol.png" msgstr "vinum-mirrored-vol.png" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:336 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 #, no-wrap msgid "Optimizing Performance" msgstr "Оптимизация производительности" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:342 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 #, 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 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 #, 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 #, 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" +" 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 #, 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" +" 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 #, 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" +" 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 #, 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" +" 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 #, no-wrap msgid "A Striped [.filename]#vinum# Volume" msgstr "Том [.filename]#vinum# с чередованием" #. type: Target for macro image #: documentation/content/en/articles/vinum/_index.adoc:391 #, no-wrap msgid "vinum-striped-vol.png" msgstr "vinum-striped-vol.png" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:395 msgid "" -"This volume is represented in crossref:vinum[vinum-striped-vol, A Striped " -"[.filename]#vinum# Volume]. The darkness of the stripes indicates the " +"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 #, no-wrap msgid "Resilience and Performance" msgstr "Устойчивость и производительность" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:400 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)" -". Типичный конфигурационный файл может выглядеть так:" +"увеличенную производительность по сравнению со стандартными разделами " +"UNIX(R). Типичный конфигурационный файл может выглядеть так:" #. type: delimited block . 4 #: documentation/content/en/articles/vinum/_index.adoc:416 #, 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 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 msgid "" "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 зеркалированием и " "чередованием] представляет структуру этого тома." #. type: Block title #: documentation/content/en/articles/vinum/_index.adoc:424 #, 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 #, no-wrap msgid "vinum-raid10-vol.png" msgstr "vinum-raid10-vol.png" #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:428 #, no-wrap msgid "Object Naming" msgstr "Именование объектов" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:432 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 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 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:" +"[.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 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#." +"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 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 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 msgid "For example, consider the following configuration file:" msgstr "Например, рассмотрим следующий конфигурационный файл:" #. type: delimited block . 4 #: documentation/content/en/articles/vinum/_index.adoc:457 #, 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 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 #, 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 #, 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 #, 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 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# должны быть именованными. Это позволяет переместить диск в " -"другое место и по-прежнему автоматически его распознавать. Имена дисков " +"Хотя рекомендуется не назначать конкретные имена плексам и поддискам, диски " +"[.filename]#vinum# должны быть именованными. Это позволяет переместить диск " +"в другое место и по-прежнему автоматически его распознавать. Имена дисков " "могут быть длиной до 32 символов." #. type: Title === #: documentation/content/en/articles/vinum/_index.adoc:484 #, no-wrap msgid "Creating File Systems" msgstr "Создание файловых систем" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:492 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 " +"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]#ad#) и восьмой раздел ([.filename]#h#) на третьем (2) SCSI-диске " +"([.filename]#da#) соответственно. В отличие от этого, том [.filename]#vinum# " "может называться [.filename]#/dev/gvinum/concat#, что не имеет отношения к " "имени раздела." #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:494 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 #, no-wrap msgid "# newfs /dev/gvinum/concat\n" msgstr "# newfs /dev/gvinum/concat\n" #. type: Title == #: documentation/content/en/articles/vinum/_index.adoc:501 #, no-wrap msgid "Configuring [.filename]#vinum#" msgstr "Настройка [.filename]#vinum#" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:507 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] проверяет, загружен ли модуль, и если нет, загружает его " +"модуля ядра. Команда man:kldload[8] не требуется, так как при запуске man:" +"gvinum[8] проверяет, загружен ли модуль, и если нет, загружает его " "автоматически." #. type: Title === #: documentation/content/en/articles/vinum/_index.adoc:508 #, no-wrap msgid "Startup" msgstr "Запуск" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:513 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 #, 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" +"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 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 #, no-wrap msgid "Automatic Startup" msgstr "Автоматический запуск" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:547 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 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 #, 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 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 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 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 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 #, no-wrap msgid "Starting up [.filename]#vinum# Early Enough for the Root File System" -msgstr "" -"Запуск [.filename]#vinum# на раннем этапе для обеспечения доступа к корневой " -"файловой системе" +msgstr "Запуск [.filename]#vinum# на раннем этапе для обеспечения доступа к корневой файловой системе" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:568 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#:" +"[.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 #, no-wrap msgid "geom_vinum_load=\"YES\"\n" msgstr "geom_vinum_load=\"YES\"\n" #. type: Title === #: documentation/content/en/articles/vinum/_index.adoc:574 #, no-wrap msgid "Making a [.filename]#vinum#-based Root Volume Accessible to the Bootstrap" -msgstr "" -"Создание корневого тома на основе [.filename]#vinum#, доступного для " -"загрузчика" +msgstr "Создание корневого тома на основе [.filename]#vinum#, доступного для загрузчика" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:579 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 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 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 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 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 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 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 #, 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 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 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 #, no-wrap msgid "# bsdlabel -e devname\n" msgstr "# bsdlabel -e devname\n" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:612 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#." +"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 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 " +"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 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 msgid "" -"That way, a new `a` partition will be established that overlaps the " -"[.filename]#vinum# partition on this device. `bsdlabel` will only allow for " +"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 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 #, 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 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 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 #, 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 #, 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 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 #, 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 #, 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 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 " +"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 msgid "The bsdlabel for these devices might look like:" msgstr "Метка bsdlabel для этих устройств может выглядеть следующим образом:" #. type: delimited block . 4 #: documentation/content/en/articles/vinum/_index.adoc:678 #, 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" +" 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 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 " "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# для этого устройства." #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:686 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 #, no-wrap msgid "Troubleshooting" msgstr "Устранение неполадок" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:690 msgid "The following list contains a few known pitfalls and solutions." msgstr "" "Следующий список содержит несколько известных подводных камней и их решения." #. type: Title ==== #: documentation/content/en/articles/vinum/_index.adoc:691 #, no-wrap msgid "System Bootstrap Loads, but System Does Not Boot" msgstr "Загрузчик системы загружается, но система не запускается" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:695 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`." +"Переменную загрузчика `vinum.autostart` можно проверить, введя команду " +"`show`, и изменить с помощью `set` или `unset`." #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:697 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 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`), " -"при этом корневая файловая система монтируется в режиме только для чтения. " -"Таким образом, даже если смонтирован только один слой многокомпонентного " -"тома, не возникает риска несогласованности данных между слоями." +"Когда всё готово, процесс загрузки можно продолжить, введя `boot -as`, где `-" +"as` указывает ядру запросить корневую файловую систему для монтирования (`-" +"a`) и остановить процесс загрузки в однопользовательском режиме (`-s`), при " +"этом корневая файловая система монтируется в режиме только для чтения. Таким " +"образом, даже если смонтирован только один слой многокомпонентного тома, не " +"возникает риска несогласованности данных между слоями." #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:706 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." +"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 #, no-wrap msgid "Only Primary Bootstrap Loads" msgstr "Только первичная загрузка Bootstrap" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:712 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}[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`." +"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/[втором этапе, " +"kbd:[space]. Это остановит загрузку на extref:{handbook}boot[втором этапе, " "boot-boot1]. Здесь можно попытаться загрузиться с альтернативного раздела, " "например, с раздела, содержащего предыдущую корневую файловую систему, " "которая была перемещена из `a`." #. type: Title ==== #: documentation/content/en/articles/vinum/_index.adoc:714 #, no-wrap msgid "Nothing Boots, the Bootstrap Panics" msgstr "Ничего не загружается, паника при загрузке" #. type: Plain text #: documentation/content/en/articles/vinum/_index.adoc:720 msgid "" -"This situation will happen if the bootstrap had been destroyed by the " -"[.filename]#vinum# installation. Unfortunately, [.filename]#vinum# " +"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 " +"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 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}[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." +"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], загрузчик повредит " +"описано в extref:{handbook}boot[этапе два, boot-boot1], загрузчик повредит " "заголовок [.filename]#vinum#, и [.filename]#vinum# больше не сможет найти " "свои диски. Хотя фактические данные конфигурации [.filename]#vinum# или " "данные в томах [.filename]#vinum# не будут повреждены, и можно восстановить " "все данные, введя точно такую же конфигурацию [.filename]#vinum# снова, " "исправить ситуацию сложно. Необходимо переместить весь раздел [." "filename]#vinum# как минимум на 4 КБ, чтобы заголовок [.filename]#vinum# и " "системный загрузчик больше не конфликтовали."