git: 90fc64e2a8 - main - update translation of books/handbook/jails to Russian

From: Vladlen Popolitov <vladlen_at_FreeBSD.org>
Date: Mon, 10 Aug 2026 07:43:14 UTC
The branch main has been updated by vladlen:

URL: https://cgit.FreeBSD.org/doc/commit/?id=90fc64e2a896f70b265e1334490c4f9f7353091c

commit 90fc64e2a896f70b265e1334490c4f9f7353091c
Author:     Vladlen Popolitov <vladlen@FreeBSD.org>
AuthorDate: 2026-08-10 07:43:07 +0000
Commit:     Vladlen Popolitov <vladlen@FreeBSD.org>
CommitDate: 2026-08-10 07:43:07 +0000

    update translation of books/handbook/jails to Russian
    
    Differential Revision: https://reviews.freebsd.org/D58751
---
 .../content/ru/books/handbook/jails/_index.adoc    | 1132 +++-
 .../content/ru/books/handbook/jails/_index.po      | 5406 ++++++++++++++++----
 2 files changed, 5615 insertions(+), 923 deletions(-)

diff --git a/documentation/content/ru/books/handbook/jails/_index.adoc b/documentation/content/ru/books/handbook/jails/_index.adoc
index 2e8f13b217..bf68a9408b 100644
--- a/documentation/content/ru/books/handbook/jails/_index.adoc
+++ b/documentation/content/ru/books/handbook/jails/_index.adoc
@@ -1,11 +1,11 @@
 ---
 description: 'Клетки (jails) улучшают концепцию традиционного окружения chroot несколькими способами'
-next: books/handbook/mac
+next: books/handbook/containers
 params:
   path: /books/handbook/jails/
 part: 'Часть III. Администрирование системы'
 prev: books/handbook/security
-showBookMenu: 'true'
+showBookMenu: true
 tags: ["jails", "creating", "managing", "updating"]
 title: 'Глава 17. Клетки и контейнеры'
 weight: 21
@@ -68,9 +68,13 @@ endif::[]
 * Различные способы настройки сети для клетки.
 * Файл конфигурации клетки.
 * Как создать различные типы клетки.
+* Как настроить трансляцию сетевых адресов для клеток.
 * Как запустить, остановить и перезапустить клетку.
 * Основы администрирования клеток, как изнутри, так и снаружи клетки.
 * Как обновить различные типы клеток.
+* Как ограничить ресурсы, которые может использовать клетка.
+* Дополнительные параметры безопасности и функций на уровне клетки.
+* Как делегировать клетке наборы данных ZFS.
 * Неполный список различных менеджеров клеток FreeBSD.
 
 [[jail-types]]
@@ -78,7 +82,7 @@ endif::[]
 
 Некоторые администраторы разделяют клетки на различные типы, хотя базовые технологии остаются одинаковыми. Каждому администратору необходимо определить, какой тип клетки создавать в каждом конкретном случае, в зависимости от решаемой задачи.
 
-Ниже приведен список различных типов, их характеристики и рекомендации по использованию.
+Ниже приведён список различных типов, их характеристики и рекомендации по использованию.
 
 [[thick-jails]]
 === Толстые клетки (Thick Jails)
@@ -99,7 +103,7 @@ endif::[]
 [[thin-jails]]
 === Тонкие клетки (Thin Jails)
 
-Тонкая клетка (thin jail) использует базовую систему через снимки OpenZFS или монтирования NullFS из шаблона. Для каждой тонкой клетки дублируется лишь минимальное подмножество базовой системы, что приводит к меньшему потреблению ресурсов по сравнению с толстой клеткой. Однако это также означает, что тонкие клетки обладают меньшей изоляцией и независимостью по сравнению с толстыми. Изменения в общих компонентах могут потенциально затрагивать несколько тонких клеток одновременно.
+Тонкая клетка использует базовую систему из шаблона, используя либо снимки OpenZFS, либо монтирования NullFS. Для каждой тонкой клетки дублируется лишь минимальный поднабор базовой системы, что приводит к меньшему потреблению ресурсов по сравнению с толстой клеткой. Два механизма ведут себя по-разному после создания клеток. При методе OpenZFS каждая тонкая клетка создается как клон снимка шаблона: независимая копия с записью при копировании, которая разделяет неизмененные блоки с шаблоном, но расходится при изменении. Более поздние изменен
я шаблона не распространяются на существующие клоны, и каждый клон обслуживается и обновляется индивидуально, во многом как толстая клетка. При методе NullFS каждая тонкая клетка монтирует шаблон только для чтения во время выполнения, поэтому базовая система используется совместно в реальном времени, и обновление шаблона обновляет каждую клетку, которая его монтирует. Эта общая база, доступная только для чтения, также обеспечивает тонким клеткам NullFS меньшую изоляцию и независимость, чем толстым клеткам, поскольку изменения в общих ко
мпонентах одновременно затрагивают каждую клетку, использующую их.
 
 Вкратце, тонкая клетка в FreeBSD — это тип клетки FreeBSD, который воспроизводит значительную часть, но не всю базовую систему, в изолированной среде.
 
@@ -107,12 +111,12 @@ endif::[]
 
 * Эффективность использования ресурсов: тонкие клетки более эффективны в использовании ресурсов по сравнению с толстыми клетками. Поскольку они используют общую базовую систему, они занимают меньше места на диске и оперативной памяти. Это позволяет запускать больше клеток на том же оборудовании без чрезмерного потребления ресурсов.
 * Быстрое развёртывание: создание и запуск тонких клеток обычно происходит быстрее по сравнению с толстыми клетками. Это может быть особенно полезно при быстром развертывании множества экземпляров.
-* Унифицированное обслуживание: поскольку тонкие клетки используют большую часть базовой системы хоста, обновления и обслуживание общих компонентов базовой системы (таких как библиотеки и исполняемые файлы) необходимо выполнять только один раз на хосте. Это упрощает процесс обслуживания по сравнению с поддержкой отдельной базовой системы для каждой толстой клетки.
+* Унифицированное обслуживание: используя метод NullFS, когда тонкие клетки используют одну копию базовой системы, доступную для чтения, обновления и обслуживание общих компонентов базовой системы (таких как библиотеки и исполняемые файлы) необходимо выполнять только один раз на шаблоне. Это упрощает процесс обслуживания по сравнению с поддержкой отдельной базовой системы для каждой толстой клетки. Тонкие клетки в клоне OpenZFS не обладают таким преимуществом: так как каждый клон независим, обновление должно быть применено к каждой клет
ке индивидуально, как и в случае с толстыми клетками.
 * Общие ресурсы: тонкие клетки могут проще разделять общие ресурсы, такие как библиотеки и исполняемые файлы, с хост-системой. Это может привести к более эффективному использованию кэширования диска и повышению производительности приложений внутри клетки.
 
 Недостатки тонких клеток:
 
-* Уменьшенная изоляция: основной недостаток тонких клеток заключается в том, что они обеспечивают меньшую изоляцию по сравнению с толстыми клетками. Поскольку они используют значительную часть базовой системы шаблона, уязвимости или проблемы, затрагивающие общие компоненты, могут потенциально повлиять на несколько клеток одновременно.
+* Уменьшенная изоляция: основной недостаток тонких клеток заключается в том, что они обеспечивают меньшую изоляцию по сравнению с толстыми клетками. В частности клетки с методом NullFS пользуются копией базовой системы шаблона в реальном времени, поэтому уязвимости или проблемы, затрагивающие эти общие компоненты, могут потенциально повлиять на несколько клеток одновременно.
 * Проблемы безопасности: уменьшенная изоляция в тонких клетках может представлять угрозу безопасности, так как компрометация одной клетки может с большей вероятностью повлиять на другие клетки или на хост-систему.
 * Конфликты зависимостей: если нескольким тонким клеткам требуются разные версии одних и тех же библиотек или программного обеспечения, управление зависимостями может усложниться. В некоторых случаях это может потребовать дополнительных усилий для обеспечения совместимости.
 * Проблемы совместимости: приложения в тонкой клетке могут столкнуться с проблемами совместимости, если они рассчитаны на определённое окружение базовой системы, отличающееся от общих компонентов, предоставляемых шаблоном.
@@ -120,7 +124,7 @@ endif::[]
 [[service-jails]]
 === Сервисные клетки (Service Jails)
 
-Сервисная клетка (service jail) напрямую разделяет всё дерево файловой системы с хостом (корневой путь клетки — [.filename]#/#) и, таким образом, может получать доступ и изменять любые файлы на хосте, а также использует те же учётные записи пользователей, что и хост. По умолчанию у неё нет доступа к сети или другим ресурсам, ограниченным в клетках, но её можно настроить для повторного использования сети хоста и снятия некоторых ограничений клетки. Основное применение сервисных клеток — автоматическое ограничение служб/демонов внутри клетки с мин
мальной настройкой и без необходимости знания файлов, требуемых такой службой/демоном. Сервисные клетки появились в FreeBSD 15.
+Сервисная клетка (service jail) напрямую разделяет всё дерево файловой системы с хостом (корневой путь клетки — [.filename]#/#) и, таким образом, может получать доступ и изменять любые файлы на хосте, а также использует те же учётные записи пользователей, что и хост. По умолчанию у неё нет доступа к сети или другим ресурсам, ограниченным в клетках, но её можно настроить для повторного использования сети хоста и снятия некоторых ограничений клетки. Основное применение сервисных клеток — автоматическое ограничение служб/демонов внутри клетки с мин
мальной настройкой и без необходимости знания файлов, требуемых такой службой/демоном. Сервисные клетки доступны с версии FreeBSD 15.0.
 
 Преимущества сервисных клеток:
 
@@ -179,13 +183,34 @@ endif::[]
 С `jail_parallel_start` все настроенные клетки будут запущены в фоновом режиме.
 ====
 
+По умолчанию каждая клетка, которая имеет запись в конфигурационных файлах, запускается при загрузке. Чтобы запустить только выбранные клетки, перечислите их имена в `jail_list`:
+
+[source, shell]
+....
+# sysrc jail_list="www db"
+....
+
+Имена в `jail_list` разделяются пробелами и должны соответствовать именам клеток, определённым в [.filename]#/etc/jail.conf# или [.filename]#/etc/jail.conf.d/#. При загрузке запускаются только перечисленные клетки, и они запускаются в указанном порядке, поэтому любую клетку, пропущенную в `jail_list`, необходимо запускать вручную. Когда `jail_list` остаётся пустым, запускаются все клетки, определённые в файлах конфигурации.
+
+Чтобы остановить клетки в обратном порядке их `jail_list` при завершении работы, установите `jail_reverse_stop`:
+
+[source, shell]
+....
+# sysrc jail_reverse_stop="YES"
+....
+
+[NOTE]
+====
+С включённым `jail_parallel_start` клетки запускаются в фоновом режиме, и порядок `jail_list` больше не гарантируется. Когда одна клетка должна работать до запуска другой, выразите эту зависимость с помощью параметра `depend` в [.filename]#/etc/jail.conf# вместо того, чтобы полагаться на порядок списка. Зависимости клетки создаются автоматически до её запуска и останавливаются в обратном порядке, независимо от `jail_list`. Параметр `depend` описан в разделе crossref:jails[jail-configuration-files,Файлы конфигурации клеток].
+====
+
 [[jails-networking]]
 === Сетевое взаимодействие
 
 Сеть для клеток FreeBSD может быть настроена несколькими различными способами:
 
 Режим сетевого взаимодействия хоста (разделение IP)::
-В режиме сетевого взаимодействия хоста (host networking) клетка использует тот же сетевой стек, что и хост-система. При создании клетки в этом режиме она использует тот же сетевой интерфейс и IP-адрес. Это означает, что клетка не имеет отдельного IP-адреса, и его сетевой трафик ассоциируется с IP-адресом хоста.
+В режиме сетевого доступа хоста клетка использует сетевой стек хост-системы, а не получает собственный. Совместное использование стека не означает совместное использование адреса: распространённая настройка предоставляет клетке собственный выделенный `ip4.addr` (и `ip6.addr`), который man:jail[8] добавляет как псевдоним на интерфейсе хост-системы, поэтому клетка и хост-система отвечают на разных адресах через один и тот же стек. Только клетка, настроенная с `ip4 = inherit`, полностью видит и может пользоваться адресами хост-системы и отвечает на собств
енном адресе хост-системы, получая неограниченный доступ ко всем адресам, которыми владеет хост-система.
 
 Виртуальные сети (VNET)::
 Виртуальные сети (VNET) — это функция клеток FreeBSD, предоставляющая более продвинутые и гибкие сетевые решения по сравнению с базовыми режимами, такими как режим сетевого взаимодействия хоста (host networking). VNET позволяет создавать изолированные сетевые стеки для каждой клетки, предоставляя им отдельные IP-адреса, таблицы маршрутизации и сетевые интерфейсы. Это обеспечивает более высокий уровень сетевой изоляции и позволяет клеткам функционировать так, как если бы они работали на отдельных виртуальных машинах.
@@ -193,6 +218,65 @@ endif::[]
 Система netgraph::
 man:netgraph[4] — это универсальная инфраструктура ядра для создания пользовательских сетевых конфигураций. Она может использоваться для определения того, как сетевой трафик передаётся между клеткой и хост-системой, а также между различными клетками.
 
+[[jail-ip-comes-from]]
+==== Откуда берется IP-адрес клетки
+
+Клетка с общим стеком получает доступ к сети через адрес на интерфейсе хоста. В параметре `interface` указывается имя этого интерфейса, и для каждого адреса в `ip4.addr` и `ip6.addr` man:jail[8] сам управляет псевдонимом: как выражается jail(8), «псевдоним для каждого адреса будет добавлен к интерфейсу до создания клетки и будет удалён из интерфейса после удаления клетки». Ничто на хост-системе не обязано предварительно настраивать адрес.
+
+Интерфейс также может быть указан для каждого адреса, так что одна строка связывает адрес с интерфейсом, который должен этот адрес использовать:
+
+[.programlisting]
+....
+ip4.addr = "em0|192.168.1.151/24";
+....
+
+Когда адрес должен сохраняться независимо от клетки — потому что другая служба на хост-системе полагается на него, или потому что параметр `interface` не используется — назначьте его на хост-системе как псевдоним rc.conf и исключите его из управления jail(8):
+
+[source, shell]
+....
+# sysrc ifconfig_em0_aliases="inet 192.168.1.151/32"
+....
+
+Более старая, нумерованная форма `ifconfig_em0_alias0="inet 192.168.1.151/32"` по-прежнему работает, но форма `_aliases` предпочтительнее для новых конфигураций, поскольку она позволяет избежать хрупкого требования, чтобы нумерованные псевдонимы образовывали непрерывную последовательность `alias0`, `alias1`, `alias2`.
+
+[[loopback-addresses-shared-ip-Jails]]
+==== Адреса loopback в клетках с общей IP-адресацией
+
+Клетка с общим стеком не имеет собственного интерфейса loopback. Ядро FreeBSD компенсирует это: в клетке без VNET, когда `127.0.0.1` или `::1` сами по себе не являются адресами клетки, ядро молча переписывает как `bind()`, так и `connect()` на адрес loopback на первый `ip4.addr` или `ip6.addr` клетки. Это поведение не документировано в man:jail[8], но оно важно, поскольку несет последствия для безопасности.
+
+[WARNING]
+====
+Не предполагайте, что привязка службы к `localhost` ограничивает её клеткой. В клетке с общим IP-адресом демон, которому указано прослушивать `127.0.0.1`, на самом деле привязывается к первому адресу клетки, который часто обращён к локальной сети, и поэтому становится доступным из сети.
+====
+
+Стандартным средством смягчения является предоставление клетке частного адреса loopback и указание его первым. Клонируйте выделенный интерфейс loopback на хосте и назначьте ему адрес из диапазона `127.0.0.0/8` (или частный адрес RFC 1918):
+
+[source, shell]
+....
+# sysrc cloned_interfaces="lo1"
+# sysrc ifconfig_lo1="inet 127.0.1.1/32"
+....
+
+Затем укажите этот адрес первым в `ip4.addr` клетки, перед любым маршрутизируемым адресом, чтобы переопределение loopback попадало на частный адрес, а не на адрес, обращённый к локальной сети.
+
+[[preparing-host-services]]
+==== Подготовка сервисов хост-системы
+
+Каждый псевдоним адреса клетки разделяет порты хост-системы. Демон хост-системы, привязанный к адресу с подстановочным знаком — показанному как `*:port` в списках прослушивателей — поэтому также прослушивает каждый псевдоним клетки, и он занимает этот порт прежде, чем собственная служба клетки сможет его заявить. Перед запуском любых клеток проверьте, что хост-система уже прослушивает:
+
+[source, shell]
+....
+# sockstat -4 -6 -l
+....
+
+Ограничьте каждый демон, который привязывается к адресу-шаблону, чтобы он использовал только собственный адрес хост-системы и оставлял адреса клеток свободными:
+
+* man:syslogd[8]: задайте `syslogd_flags="-ss"` в [.filename]#/etc/rc.conf#. Одинарный `-s` уже запускает syslogd в безопасном режиме, чтобы он не прослушивал соединения с удаленных хостов для отправки сообщений журнала; согласно syslogd(8), если `-s` "указан дважды, сетевой сокет вообще не будет открыт", что также предотвращает отправку syslogd на удаленные хосты.
+* man:sshd[8]: закрепите `ListenAddress` на адресе хост-системы в файле [.filename]#/etc/ssh/sshd_config# вместо того, чтобы оставлять его с подстановочным знаком(wildcard) по умолчанию.
+* man:ntpd[8] и man:sendmail[8]: привяжите их к адресу хост-системы также через их собственную конфигурацию.
+
+Для контроля на уровне межсетевого экрана за тем, какие адреса может использовать клетка, см. crossref:firewalls[firewalls,Межсетевые экраны].
+
 [[host-configuration-directories]]
 === Настройка дерева каталогов клетки
 
@@ -221,6 +305,8 @@ man:netgraph[4] — это универсальная инфраструктур
 В данном случае для родительского набора данных использовался `zroot`, но могли быть использованы и другие наборы данных.
 ====
 
+Создание отдельного дочернего набора данных для каждой клетки в дальнейшем позволяет делать снимки, клоны, квоты и делегирование наборов данных для каждой клетки. Поскольку каталог каждой клетки затем становится собственным набором данных, OpenZFS может как ограничивать, так и гарантировать использование ею дискового пространства с помощью свойств `quota` и `reservation`; см. crossref:jails[jail-resource-limits,Ограничения ресурсов клетки].
+
 При использовании UFS выполните следующие команды для создания каталогов:
 
 [source, shell]
@@ -268,7 +354,7 @@ jailname { <.>
 
   # NETWORK
   ip4.addr = 192.168.1.151; <.>
-  ip6.addr = ::ffff:c0a8:197 <.>
+  ip6.addr = "2001:db8::151"; <.>
   interface = em0; <.>
 }
 ....
@@ -279,13 +365,116 @@ jailname { <.>
 <.> `exec.consolelog` — файл для вывода результатов выполнения команды (stdout и stderr).
 <.> `allow.raw_sockets` — разрешает создание raw-сокетов внутри клетки. Установка этого параметра позволяет использовать такие утилиты, как man:ping[8] и man:traceroute[8], внутри клетки.
 <.> `exec.clean` — выполнение команд в чистом окружении.
-<.> `mount.devfs` — подключает файловую систему man:devfs[5] в каталоге [.filename]#/dev# внутри chroot и применяет набор правил из параметра devfs_ruleset, чтобы ограничить видимость устройств внутри клетки.
+<.> `mount.devfs` - монтирование файловой системы man:devfs[5] в каталог [.filename]#/dev# внутри chroot, чтобы ограничить видимые в клетке устройства. Применяется набор правил, заданный параметром `devfs_ruleset`, или, когда этот параметр оставлен по умолчанию равным `0`, используется запасной вариант `mount.devfs` с набором правил 4, `devfsrules_jail`, который скрывает все устройства хоста, кроме минимального набора, безопасного для клетки (см. crossref:jails[jail-conf-devfs, Devfs Rulesets]).
 <.> `host.hostname` — имя хоста для клетки.
 <.> `path` — каталог, который будет корневым для клетки. Любые команды, выполняемые внутри клетки, либо с помощью `jail`, либо через man:jexec[8], запускаются из этого каталога.
-<.> `ip4.addr` — IPv4-адрес. Существует два варианта настройки IPv4. Первый — указать IP-адрес или список IP-адресов, как показано в примере. Второй — использовать параметр `ip4` со значением `inherit`, чтобы унаследовать IP-адрес хоста.
-<.> `ip6.addr` — IPv6-адрес. Существует два варианта настройки для IPv6. Первый — указать IP или список IP, как это сделано в примере. Второй — использовать `ip6` и установить значение `inherit` для наследования IP-адреса хоста.
+<.> `ip4.addr` - Один IPv4-адрес или разделённый запятыми список адресов, назначенных клетке. Установка `ip4.addr` подразумевает `ip4 = new`; сам параметр `ip4` не имеет значения по умолчанию (если он не указан, то его значение зависит от значений других параметров). Параметр `ip4` принимает три значения: `new` ограничивает клетку адресами, перечисленными в `ip4.addr`, `inherit` предоставляет клетке неограниченный доступ ко всем IPv4-адресам хоста, а `disable` полностью отключает IPv4 в клетке. Клетка, в которой не заданы ни `ip4`, ни `ip4.addr`, ведёт себя как при `inherit`, и параметры `interface
` и `ip4.addr` не действуют при `inherit`. В клетке с несколькими адресами `ip4.saddrsel` позволяет ядру выбирать исходный адрес для исходящих соединений на несвязанных сокетах, тогда как `ip4.nosaddrsel` принудительно использует первый адрес из списка.
+<.> `ip6.addr` - Один IPv6-адрес или разделенный запятыми список адресов, назначенных клетке. Параметр `ip6` принимает те же значения `new`, `inherit` и `disable`, что и `ip4`, при этом `ip6.saddrsel` и `ip6.nosaddrsel` управляют выбором адреса источника. Используйте `ip6 = disable` для клетки только с IPv4 или `ip4 = disable` для клетки только с IPv6.
 <.> `interface` — Сетевой интерфейс для добавления IP-адресов клетки. Обычно это интерфейс хоста.
 
+[NOTE]
+====
+Клетка не имеет виртуальной консоли: man:init[8] и man:getty[8] не запускаются внутри неё, поэтому не к чему подключиться в интерактивном режиме. Файл `exec.consolelog` захватывает только стандартный вывод и стандартный поток ошибок команд `exec.*`, то есть вывод сценариев [.filename]#/etc/rc# запуска и [.filename]#/etc/rc.shutdown# завершения работы. Это не интерактивная консоль; для этого используйте man:jexec[8] (см. crossref:jails[access-jail, Доступ к клетке]) или запустите man:sshd[8] внутри клетки. Собственные демоны клетки отправляют свой последующий вывод в syslog клетки.
+====
+
+[TIP]
+====
+Файлы `exec.consolelog` растут без ограничений. Выполняйте их ротацию с помощью man:newsyslog[8], добавив одну запись с подстановочным знаком (glob), например, в [.filename]#/etc/newsyslog.conf.d/jail#:
+
+[.programlisting]
+....
+/var/log/jail_console_*.log            640  7     100  *     J
+....
+====
+
+[[global-settings-wildcards-variables]]
+==== Глобальные параметры, подстановочные знаки и переменные
+
+Параметры, заданные вне любого блока клетки, являются подстановочными значениями по умолчанию: man:jail.conf[5] применяет их к каждой клетке, точно так же, как если бы они были записаны в разделе подстановочного знака `*`. Установка общих параметров один раз делает каждый блок клетки коротким.
+
+Имя, перед которым стоит знак доллара и которое, при необходимости, заключено в фигурные скобки, заменяется значением этого параметра или переменной. Встроенное выражение `${name}` разворачивается в собственное имя клетки, а пользовательская переменная определяется точно так же, как параметр, но с ведущим знаком доллара.
+
+Следующий [.filename]#/etc/jail.conf# определяет общий заголовок один раз и переопределяет только то, что отличается для каждой клетки:
+
+[.programlisting]
+....
+# Shared defaults applied to every jail
+exec.start = "/bin/sh /etc/rc";
+exec.stop = "/bin/sh /etc/rc.shutdown";
+exec.consolelog = "/var/log/jail_console_${name}.log";
+exec.clean;
+mount.devfs;
+host.hostname = "${name}";
+path = "/usr/local/jails/containers/${name}";
+interface = em0;
+
+www {
+    ip4.addr = 192.168.1.151;
+}
+
+db {
+    host.hostname = "database.example.com";
+    ip4.addr = 192.168.1.152;
+}
+....
+
+Здесь `www` наследует всё из заголовка и задаёт только свой адрес, тогда как `db` также переопределяет `host.hostname`.
+
+[[jail-conf-hooks]]
+==== Командные хуки
+
+man:jail[8] запускает клетку через последовательность перехватчиков жизненного цикла (хуков), и важно, выполняется ли каждый из хуков в среде хост-системы или внутри клетки. В порядке создания:
+
+`exec.prestart`:: Выполняется в среде хост-системы до создания клетки.
+`exec.created`:: Выполняется в среде хост-системы после создания клетки, но до запуска любого процесса внутри неё.
+`exec.start`:: Выполняется внутри клетки, обычно `/bin/sh /etc/rc` для запуска её служб.
+`exec.poststart`:: Выполняется в среде хост-системы после запуска клетки.
+
+При завершении работы хуки выполняется зеркально в обратном порядке:
+
+`exec.prestop`:: Выполняется в среде хост-системы до остановки клетки.
+`exec.stop`:: Выполняется внутри клетки, обычно `/bin/sh /etc/rc.shutdown`.
+`exec.poststop`:: Выполняется в среде хост-системы после остановки клетки, чтобы разобрать всё, что было настроено с помощью `exec.prestart`.
+
+Хуку может быть назначено более одной команды путём добавления с помощью `+=`:
+
+[.programlisting]
+....
+exec.poststart += "logger jail ${name} started";
+....
+
+`exec.timeout` ограничивает время, в течение которого man:jail[8] ожидает завершения команды, а `exec.consolelog` захватывает вывод этих команд. В разделе VNET (crossref:jails[creating-vnet-jail, VNET Jails]) используются `exec.prestart` и `exec.poststop` для настройки и демонтажа сетевой инфраструктуры каждой клетки на хосте.
+
+Тогда как хуки упорядочивают команды внутри одной клетки, параметр `depend` упорядочивает запуск целых клеток. Запись `depend = otherjail;` сообщает man:jail[8], что эта клетка требует `otherjail`: зависимость создаётся первой, до завершения её последней команды `exec.poststart`, прежде чем будет создана эта клетка, и клетки уничтожаются в обратном порядке.
+
+[[jail-conf-devfs]]
+==== Наборы правил Devfs
+
+Каждая клетка, которая устанавливает `mount.devfs`, получает набор правил devfs, определяющий, какие узлы устройств появляются в её [.filename]#/dev#: либо тот, который задан параметром `devfs_ruleset`, либо, когда этот параметр не установлен, значение по умолчанию для `mount.devfs` — набор правил 4. man:devfs.rules[5] определяет именованные наборы правил в [.filename]#/etc/defaults/devfs.rules#. Два из них предназначены для клеток: `devfsrules_jail`, набор правил 4, является стандартным минимальным набором устройств для клетки, а `devfsrules_jail_vnet`, набор правил 5, добавляет [.filename]#/dev/pf#, чтобы клетка VNET могл
а запускать собственный межсетевой экран. Примеры клеток VNET устанавливают `devfs_ruleset = 5`, а пример клетки Linux устанавливает `devfs_ruleset = 4`; примеры классической и тонкой клеток устанавливают только `mount.devfs` и поэтому используют его значение по умолчанию — набор правил 4.
+
+Чтобы открыть доступ к дополнительному устройству, напишите пользовательский набор правил в [.filename]#/etc/devfs.rules#, который включает один из стандартных наборов правил и показывает то, что ему необходимо. Следующий набор правил начинается с `devfsrules_jail` и дополнительно показывает устройства man:bpf[4]:
+
+[.programlisting]
+....
+[devfsrules_jail_bpf=100]
+add include $devfsrules_jail
+add path 'bpf*' unhide
+....
+
+Перезагрузите правила, затем укажите новый набор правил по его номеру в конфигурации клетки:
+
+[source, shell]
+....
+# service devfs restart
+....
+
+[.programlisting]
+....
+devfs_ruleset = 100;
+....
+
+Правила в [.filename]#/etc/devfs.rules# переопределяют правила с теми же номерами в [.filename]#/etc/defaults/devfs.rules#; в остальных случаях эффект двух файлов фактически объединяется.
+
 Дополнительную информацию о переменных конфигурации можно найти в man:jail[8] и man:jail.conf[5].
 
 [[classic-jail]]
@@ -304,7 +493,7 @@ jailname { <.>
 
 [source, shell, subs=attributes]
 ....
-# fetch https://download.freebsd.org/ftp/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
+# fetch https://download.freebsd.org/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
 ....
 
 После завершения загрузки необходимо извлечь содержимое в каталог клетки.
@@ -368,6 +557,101 @@ classic {
 
 Дополнительная информация об управлении клетками приведена в разделе crossref:jails[jail-management,Управление клетками].
 
+[[creating-jail-userland]]
+=== Получение пользовательского окружения клетки
+
+Процедура fetch-and-extract, показанная выше, является традиционным способом заполнения корневого каталога клетки, но это не единственный способ. Та же самая пользовательская среда может быть установлена с помощью man:bsdinstall[8], из базовых системных пакетов или из локально собранного дерева исходных кодов.
+
+man:bsdinstall[8] предоставляет выделенную цель `jail`, которая настраивает новое пользовательское окружение в заданном каталоге для использования с man:jail[8]. Она загружает и распаковывает наборы дистрибутивов без установки ядра, пропуская шаги разбиения диска и настройки сети обычной установки, что делает её однокомандным скриптом — альтернативой ручной последовательности загрузки и man:tar[1] следующим образом:
+
+[source, shell]
+....
+# bsdinstall jail /usr/local/jails/containers/classic
+....
+
+Цель `jail` по умолчанию устанавливает базовый дистрибутив ([.filename]#base.txz#). Начиная с FreeBSD 15.0 и более поздних версий, man:bsdinstall[8] также может заполнять корневой каталог пакетами базовой системы с помощью своей цели `pkgbase`; метод на основе пакетов описан далее.
+
+Начиная с FreeBSD 15.0, базовая система также публикуется в виде пакетов, поэтому пользовательское окружение клетки можно установить полностью с помощью man:pkg[8] из репозитория `FreeBSD-base`. Укажите man:pkg[8] на корневой каталог клетки с помощью глобальной опции `--rootdir` и установите вариант клетки для базового набора:
+
+[source, shell]
+....
+# pkg --rootdir /usr/local/jails/containers/classic install -r FreeBSD-base FreeBSD-set-base-jail
+....
+
+Используйте `FreeBSD-set-minimal-jail` вместо `FreeBSD-set-base-jail` для минимального пользовательского окружения. Клетка, установленная таким образом, впоследствии обновляется и получает исправления с помощью man:pkg[8], а не man:freebsd-update[8]; см. crossref:jails[jail-upgrade-pkgbase, Обновление клеток pkgbase].
+
+[NOTE]
+====
+Пакеты базовой системы — это технологическая предварительная версия в FreeBSD 15.0. Репозиторий `FreeBSD-base` определён в [.filename]#/etc/pkg/FreeBSD.conf#, но по умолчанию отключён, поэтому выбирайте его явно с помощью `install -r FreeBSD-base`. Целевой корневой каталог и его подкаталоги [.filename]#var/cache/pkg# и [.filename]#var/db/pkg# возможно, потребуется создать заранее. Традиционное распространение [.filename]#base.txz# по-прежнему публикуется для FreeBSD 15.0, поэтому метод fetch-and-extract продолжает работать и там.
+====
+
+Пользовательское окружение, собранное из дерева исходных кодов, может быть установлено в корневой каталог клетки с помощью переменной `DESTDIR`, что является способом запуска пользовательского окружения `-STABLE` или собранного вручную в клетке. После сборки мира установите его и остальные дистрибутивные файлы в каталог клетки:
+
+[source, shell]
+....
+# cd /usr/src
+# make buildworld
+# make installworld DESTDIR=/usr/local/jails/containers/classic
+# make distribution DESTDIR=/usr/local/jails/containers/classic
+....
+
+`make distribution` устанавливает файлы конфигурации по умолчанию в [.filename]#/etc# клетки и выполняется только один раз, при заполнении клетки; повторение этого действия во время обновления перезапишет конфигурацию внутри клетки. Чтобы обновить такую клетку из исходников, следуйте той же последовательности, что и для хост-системы: запустите `installworld` с тем же `DESTDIR`, объедините файлы конфигурации с помощью `etcupdate -D`, указав корневой каталог клетки, и удалите устаревшие файлы и библиотеки с помощью `make delete-old delete-old-libs`, снова с тем же `DESTDIR`, вместо исполь
ования man:freebsd-update[8]. Полную процедуру обновления из исходного кода см. в crossref:cutting-edge[makeworld, Обновление FreeBSD из исходного кода].
+
+[[classic-jail-clone]]
+=== Клонирование клетки как шаблона
+
+После того как толстая клетка полностью настроена, с установленными пакетами, включёнными службами и локальной конфигурацией, она может служить шаблонным образом: шаблоном, из которого почти мгновенно развёртываются множество идентичных клеток.
+
+В OpenZFS это делается путем создания снимка настроенного набора данных клетки и его клонирования. Это требует, чтобы исходная клетка располагалась в собственном наборе данных, поэтому создайте её с помощью `zfs create`, а не `mkdir`, как в классической процедуре клетки выше:
+
+[source, shell]
+....
+# zfs create -p zroot/jails/containers/classic
+....
+
+Остановите клетку перед созданием снимка, чтобы образ был консистентным, затем создайте снимок и клонируйте набор данных один раз для каждой новой клетки:
+
+[source, shell]
+....
+# service jail stop classic
+# zfs snapshot zroot/jails/containers/classic@template
+# zfs clone zroot/jails/containers/classic@template zroot/jails/containers/web1
+....
+
+На хосте UFS скопируйте дерево каталогов настроенной клетки вместо этого:
+
+[source, shell]
+....
+# cp -a /usr/local/jails/containers/classic /usr/local/jails/containers/web1
+....
+
+Каждый клон требует своей собственной записи в [.filename]#/etc/jail.conf#, или в [.filename]#jail.conf.d#, с уникальным именем, путем и IP-адресом. Поскольку параметры `path` и `host.hostname` в приведенном выше примере выводятся из имени блока с помощью `${name}`, отличаются только имя блока и адрес:
+
+[.programlisting]
+....
+web1 {
+  # STARTUP/LOGGING
+  exec.start = "/bin/sh /etc/rc";
+  exec.stop = "/bin/sh /etc/rc.shutdown";
+  exec.consolelog = "/var/log/jail_console_${name}.log";
+
+  # PERMISSIONS
+  allow.raw_sockets;
+  exec.clean;
+  mount.devfs;
+
+  # HOSTNAME/PATH
+  host.hostname = "${name}";
+  path = "/usr/local/jails/containers/${name}";
+
+  # NETWORK
+  ip4.addr = 192.168.1.152;
+  interface = em0;
+}
+....
+
+Клон шаблонного образа отличается от тонкой клетки (crossref:jails[thin-jail, Тонкие клетки]). Тонкая клетка продолжает использовать общую базу только для чтения и обслуживается один раз в шаблоне, тогда как каждый клон шаблонного образа представляет собой полную, независимо записываемую копию, которая обновляется и модернизируется отдельно, как описано в crossref:jails[jail-upgrading, Обновление клетки]. Клон OpenZFS изначально является эффективной по пространству копией при записи (copy-on-write), которая разделяет блоки со снимком, и сохраняет зависимость от этог
 исходного снимка, пока `zfs promote` не разорвёт её. Для полностью независимой копии или для репликации клетки на другой пул или хост используйте `zfs send`, переданный через конвейер в `zfs receive`, вместо `zfs clone`.
+
 [[thin-jail]]
 == Тонкие клетки (Thin Jails)
 
@@ -393,7 +677,7 @@ classic {
 
 [source, shell, subs=attributes]
 ....
-# fetch https://download.freebsd.org/ftp/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
+# fetch https://download.freebsd.org/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
 ....
 
 После завершения загрузки необходимо извлечь содержимое в каталог шаблона, выполнив следующую команду:
@@ -495,7 +779,7 @@ thinjail {
 
 [source, shell, subs=attributes]
 ....
-# fetch https://download.freebsd.org/ftp/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
+# fetch https://download.freebsd.org/releases/amd64/amd64/{rel-latest}-RELEASE/base.txz -o /usr/local/jails/media/{rel-latest}-RELEASE-base.txz
 ....
 
 После завершения загрузки необходимо извлечь содержимое в каталог шаблона, выполнив следующую команду:
@@ -625,6 +909,8 @@ thinjail {
 /usr/local/jails/containers/thinjail     /usr/local/jails/thinjail-nullfs-base/skeleton nullfs  rw  0 0
 ....
 
+Файл [.filename]#fstab# управляет тем, как man:mount_nullfs[8] представляет базовый шаблон и скелет внутри клетки. Базовый шаблон монтируется только для чтения (`ro`), чтобы каждая клетка NullFS использовала одну неизменяемую копию базовой системы. Скелет каждой клетки монтируется с возможностью чтения и записи (`rw`), и именно здесь каждая клетка хранит свои собственные доступные для записи каталоги [.filename]#/etc#, [.filename]#/var#, [.filename]#/usr/local# и другие локальные каталоги. Поскольку все клетки используют один и тот же базовый шаблон только для чтения, обновление одног
о шаблона сразу обновляет все клетки NullFS, в отличие от независимых клонов OpenZFS, каждый из которых необходимо обновлять отдельно.
+
 Выполните следующую команду для запуска клетки:
 
 [source, shell]
@@ -633,7 +919,7 @@ thinjail {
 ....
 
 [[creating-vnet-jail]]
-=== Создание клетки VNET
+== Клетки VNET
 
 В клетках FreeBSD VNET используется отдельный сетевой стек, включающий интерфейсы, IP-адреса, таблицы маршрутизации и правила межсетевого экрана.
 
@@ -651,6 +937,11 @@ thinjail {
 bridge0
 ....
 
+[WARNING]
+====
+Назначение IP-адреса интерфейсу, который является членом моста, устарело. Назначайте адрес хоста самому `bridge0`, а не `em0`, точно так же, как это делает приведённый ниже блок [.filename]#/etc/rc.conf#. Такие конфигурации пока продолжают работать: FreeBSD 15.0 записывает предупреждение ядра, когда интерфейс с адресом добавляется в мост, и отказывает ему с `EINVAL` только тогда, когда sysctl `net.link.bridge.member_ifaddrs` изменён с его значения по умолчанию `1` на `0`. man:bridge[4] объявляет об удалении этого sysctl в FreeBSD 16.0, после чего адреса на членах моста больше не будут разрешены.
+====
+
 Создав `bridge`, необходимо подключить его к интерфейсу `em0` и включить оба, выполнив следующие команды:
 
 [source, shell]
@@ -712,20 +1003,72 @@ vnet {
   exec.prestart += "/sbin/ifconfig ${bridge} addm ${epair}a up";
   exec.start    += "/sbin/ifconfig ${epair}b ${ip} up";
   exec.start    += "/sbin/route add default ${gateway}";
-  exec.start	+= "/bin/sh /etc/rc";
-  exec.stop	= "/bin/sh /etc/rc.shutdown";
+  exec.start    += "/bin/sh /etc/rc";
+  exec.stop      = "/bin/sh /etc/rc.shutdown";
   exec.poststop = "/sbin/ifconfig ${bridge} deletem ${epair}a";
   exec.poststop += "/sbin/ifconfig ${epair}a destroy";
 }
 ....
 
-<.> Представляет IP-адрес клетки, он должен быть *уникальным*.
+<.> Номер, *уникальный* для каждой клетки, используемый для получения как имени устройства epair (`epair${id}`), так и последнего октета адреса клетки (`192.168.1.${id}`); присвойте каждой клетке на мосту различное значение.
 <.> Относится к ранее созданному мосту.
 
+Параметр `vnet.interface` задает имя интерфейса, который man:jail[8] перемещает в сетевой стек клетки после ее создания, здесь это сторона epair, относящаяся к клетке, `${epair}b`. Этот интерфейс исчезает с хоста, пока клетка работает, и автоматически возвращается хосту при остановке клетки. Физическая сетевая карта или виртуальная функция SR-IOV могут быть переданы клетке таким же образом, обеспечивая ей выделенную сеть без моста или epair.
+
+Строка `devfs_ruleset = 5` применяет набор правил `devfsrules_jail_vnet` из [.filename]#/etc/defaults/devfs.rules#, который расширяет стандартный набор правил для клеток, открывая доступ к [.filename]#/dev/pf#. Таким образом, клетка VNET может запускать собственный межсетевой экран man:pf[4] с `pf_enable="YES"` и приватным [.filename]#pf.conf#, независимым от хоста. Смотрите crossref:jails[jail-conf-devfs, Devfs Rulesets] для описания определений наборов правил и crossref:firewalls[firewalls, Firewalls] для информации о самом pf.
+
+[[jail-vnet-jib]]
+=== Автоматизация сети VNET с помощью jib
+
+Настройка epair и подключение его к мосту вручную в `exec.prestart` и `exec.poststop`, как показано выше, становится утомительной при большом количестве клеток. В базовой системе есть вспомогательный скрипт, [.filename]#/usr/share/examples/jails/jib#, который выполняет ту же самую настройку автоматически.
+
+Ссылайтесь на него из хуков клетки вместо пяти самодельных строк man:ifconfig[8]:
+
+[.programlisting]
+....
+  exec.prestart += "jib addm ${name} em0";
+  exec.poststop += "jib destroy ${name}";
+
+  vnet.interface = "e0b_${name}";
+....
+
+`jib addm` создает epair, чья сторона хоста называется `e0a_<name>`, а сторона клетки — `e0b_<name>`, затем присоединяет сторону хоста к мосту, который он создает автоматически, названному в честь интерфейса-члена (для `em0` мост называется `em0bridge`). Укажите эту сторону клетки в `vnet.interface`. Когда клетка останавливается, `jib destroy` удаляет epair. Скрипт также предоставляет подкоманду `jib show` для вывода списка интерфейсов, которыми он управляет.
+
+[[jail-vnet-jng]]
+=== Сетевые взаимодействия Netgraph VNET с помощью jng
+
+Третий режим работы сети, упомянутый в обзоре crossref:jails[jails-networking, Сеть], использует man:netgraph[4] вместо man:bridge[4] и epair. В базовой системе поставляется второй вспомогательный скрипт, [.filename]#/usr/share/examples/jails/jng#, который создает `ng_bridge`, подключенный к `ng_eiface` для каждой клетки:
+
+[.programlisting]
+....
+  exec.prestart += "jng bridge ${name} em0";
+  exec.poststop += "jng shutdown ${name}";
+
+  vnet.interface = "ng0_${name}";
+....
+
+`jng bridge` создает узлы netgraph и интерфейс на стороне клетки с именем `ng0_<name>`, который указывается в `vnet.interface`; `jng shutdown` разрушает топологию при остановке клетки. Результат функционально эквивалентен настройке с epair и bridge, но построен на узлах netgraph, а не на man:bridge[4].
+
+[[jail-vnet-firewall]]
+=== Запуск межсетевого экрана и DHCP внутри клетки VNET
+
+Поскольку `devfs_ruleset = 5` открывает доступ к [.filename]#/dev/pf#, клетка VNET может запускать собственный межсетевой экран. Включите его внутри клетки точно так же, как на любом хосте, с помощью `pf_enable="YES"` в [.filename]#/etc/rc.conf# клетки и её собственном [.filename]#/etc/pf.conf#.
+
+Однако правила набора 5 не открывают доступ к [.filename]#/dev/bpf#. Клетка VNET, которая получает свой адрес через DHCP, например, с помощью `ifconfig_e0b_myjail="SYNCDHCP"` в её [.filename]#/etc/rc.conf#, запускает man:dhclient[8], которому требуется bpf, и поэтому он терпит неудачу при использовании набора правил 5. Следуя рецепту из crossref:jails[jail-conf-devfs,Devfs Rulesets], определите собственный набор правил в [.filename]#/etc/devfs.rules#, который начинается с `devfsrules_jail_vnet` и дополнительно открывает устройства bpf:
+
+[.programlisting]
+....
+[devfsrules_jail_vnet_dhcp=101]
+add include $devfsrules_jail_vnet
+add path 'bpf*' unhide
+....
+
+После выполнения `service devfs restart` на хосте, укажите клетке на новый набор правил с помощью `devfs_ruleset = 101;`.
+
 [[creating-linux-jail]]
-=== Создание клетки Linux
+== Клетки Linux
 
-FreeBSD может запускать Linux внутри клетки, используя crossref:linuxemu[linuxemu, Двоичную совместимость с Linux] и man:debootstrap[8]. Клетки не имеют собственного ядра. Они работают на ядре хоста. Поэтому необходимо включить Двоичную совместимость с Linux в хост-системе.
+FreeBSD может запускать пользовательские программы Linux внутри клетки, используя crossref:linuxemu[linuxemu, Двоичную совместимость с Linux] и package:sysutils/debootstrap[]. Клетки не имеют собственного ядра. Они работают на ядре хоста. Поэтому необходимо включить Двоичную совместимость с Linux в хост-системе.
 
 Чтобы включить ABI Linux при загрузке, выполните следующую команду:
 
@@ -743,16 +1086,25 @@ FreeBSD может запускать Linux внутри клетки, испо
 
 Следующим шагом будет создание клетки, как указано выше, например, в разделе crossref:jails[creating-thin-jail-openzfs-snapshots, Создание тонкой клетки с использованием снимков OpenZFS], но *без* выполнения настройки. Клетки FreeBSD Linux требуют особой конфигурации, которая будет подробно описана ниже.
 
-После создания клетки, как описано выше, выполните следующую команду для выполнения необходимой конфигурации и запуска клетки:
+Если на хосте ещё нет файла [.filename]#/etc/jail.conf# — например, в системе, где клетки до сих пор создавались только из командной строки, — создайте пустой файл, чтобы man:service[8] затем мог остановить клетку:
+
+[source, shell]
+....
+# touch /etc/jail.conf
+....
+
+Скрипт man:service[8] jail читает [.filename]#/etc/jail.conf# при остановке клетки, поэтому команда остановки завершается ошибкой, если файл не существует. Если [.filename]#/etc/jail.conf# уже присутствует из предыдущего раздела, этот шаг не требуется.
+
+Следующая команда man:jail[8] выполняет необходимую настройку для клетки и запускает её напрямую, без записи в [.filename]#/etc/jail.conf#. Флаг `-c` создаёт новую клетку, а `-m` изменяет существующую; в сочетании как `-cm`, man:jail[8] создаёт клетку, если она ещё не существует, и обновляет её, если она существует:
 
 [source, shell]
 ....
 # jail -cm \
     name=ubuntu \
     host.hostname="ubuntu.example.com" \
-    path="/usr/local/jails/ubuntu" \
+    path="/usr/local/jails/containers/ubuntu" \
     interface="em0" \
-    ip4.addr="192.168.1.150" \
+    ip4.addr="192.168.1.155" \
     exec.start="/bin/sh /etc/rc" \
     exec.stop="/bin/sh /etc/rc.shutdown" \
     mount.devfs \
@@ -767,16 +1119,14 @@ FreeBSD может запускать Linux внутри клетки, испо
     enforce_statfs=1
 ....
 
-Для доступа к клетке необходимо установить пакет package:sysutils/debootstrap[].
-
-Выполните следующую команду для доступа к клетке FreeBSD Linux:
+Получите доступ к вновь созданной клетке как `root` с помощью man:jexec[8]:
 
 [source, shell]
 ....
-# jexec -u root ubuntu
+# jexec -u root ubuntu sh
 ....
 
-Внутри клетки выполните следующие команды для установки пакета package:sysutils/debootstrap[] и подготовки окружения Ubuntu:
+Внутри клетки установите package:sysutils/debootstrap[] и используйте его для сборки пользовательского окружения Ubuntu в [.filename]#/compat/ubuntu#. package:sysutils/debootstrap[] — это инструмент, который собирает пользовательское окружение Linux; после этого он не требуется для входа в клетку. Первый запуск man:pkg[7] автоматически выполняет его начальную настройку:
 
 [source, shell]
 ....
@@ -784,13 +1134,17 @@ FreeBSD может запускать Linux внутри клетки, испо
 # debootstrap jammy /compat/ubuntu
 ....
 
-Когда процесс завершится и на консоли появится сообщение `Base system installed successfully`, необходимо из хост-системы остановить клетки, выполнив следующую команду:
+`jammy` выбирает Ubuntu 22.04 LTS. Можно выбрать более новую LTS, например `noble` (Ubuntu 24.04), при условии, что она работает в linuxulator.
+
+Когда процесс завершится и на консоли появится сообщение `Base system installed successfully`, из хост-системы остановите клетку. Так как эта клетка не активирована в [.filename]#/etc/rc.conf# и еще не перечислена в [.filename]#/etc/jail.conf#, используйте действие man:service[8] с префиксом `one`, которое запускает клетки, которые не активированы:
 
 [source, shell]
 ....
 # service jail onestop ubuntu
 ....
 
+Действия `onestart` и `onestop` являются аналогами `start` и `stop` для клеток, которые не включены через `jail_enable` или не перечислены в `jail_list`.
+
 Затем добавьте запись в [.filename]#/etc/jail.conf# для Linux-контейнера:
 
 [.programlisting]
@@ -826,6 +1180,11 @@ ubuntu {
 }
 ....
 
+[TIP]
+====
+Клетка также может представлять конкретную идентичность ядра Linux программам, работающим внутри неё. Параметр `linux` выбирает, наследует ли клетка среду эмуляции Linux хост-системы (`inherit`) или получает собственную (`new`), а `linux.osname`, `linux.osrelease` и `linux.oss_version` задают имя ОС, релиз и версию OSS, которые видят бинарные файлы Linux. Например, `linux.osrelease=6.1.0` заставляет man:uname[1] и проверяющие версию программы Linux внутри клетки сообщать указанный релиз ядра вместо значения `compat.linux.osrelease` для всей хоста-системы.
+====
+
 Затем клетку можно запустить как обычно с помощью следующей команды:
 
 [source, shell]
@@ -842,8 +1201,53 @@ ubuntu {
 
 Дополнительную информацию можно найти в главе crossref:linuxemu[linuxemu, Двоичная совместимость с Linux].
 
+[[jail-nat]]
+== NAT и перенаправление портов для клеток
+
+Клетка, которой присвоен частный адрес — на клонированном интерфейсе man:lo[4], таком как `lo1`, на частном мосту или на VNET epair во внутренней сети, — не имеет собственного маршрута в интернет. Хост должен транслировать трафик клетки в маршрутизируемый адрес, а для доступа к службе, работающей внутри такой клетки, извне — перенаправлять входящие соединения на клетку.
+
+Сначала разрешите хосту пересылать пакеты между его интерфейсами. Включите это при загрузке и немедленно с помощью следующих команд:
+
+[source, shell]
+....
+# sysrc gateway_enable="YES"
+# sysctl net.inet.ip.forwarding=1
+....
+
+Для IPv6 используйте `ipv6_gateway_enable="YES"` и `net.inet6.ip6.forwarding=1`.
+
+Затем настройте трансляцию сетевых адресов на хосте с помощью man:pf[4]. Следующий [.filename]#/etc/pf.conf# предоставляет каждой клетке в частной сети `192.168.0.0/24` исходящий доступ через внешний интерфейс хоста `em0` и публикует веб-сервер внутри клетки на порту 80 хоста:
+
+[.programlisting]
+....
+ext_if = "em0"
+
+# Translate outbound jail traffic to the host address
+nat on $ext_if from 192.168.0.0/24 to any -> ($ext_if)
+
+# Forward inbound web traffic to the jailed server
+rdr on $ext_if proto tcp to port 80 -> 192.168.0.151
+....
+
+Цель `rdr` должна быть собственным адресом клетки.
+
+Активируйте и запустите man:pf[4] с помощью следующей команды:
+
+[source, shell]
+....
+# sysrc pf_enable="YES"
+# service pf start
+....
+
+[NOTE]
+====
+FreeBSD 15.0 добавляет синтаксис в стиле OpenBSD для встроенных `nat-to` и `rdr-to`, который привязывает трансляцию к правилу `pass` или `match`, например `match out on $ext_if from 192.168.0.0/24 to any nat-to ($ext_if)`. Классические правила `nat on` и `rdr on`, показанные выше, работают как на FreeBSD 14.x, так и на 15.x.
+====
+
+Для полного рассмотрения man:pf[4] и man:ipfw[8], включая полные наборы правил и NAT на основе man:ipfw[8], см. crossref:firewalls[firewalls,Межсетевые экраны].
+
 [[service-jails-config]]
-=== Настройка сервисных клеток
+== Сервисные клетки (Service Jails)
 
 Сервисная клетка полностью настраивается через [.filename]#/etc/rc.conf# или man:sysrc[8]. Базовые системные сервисы готовы для работы в сервисных клетках. Они содержат строку конфигурации, которая включает сеть или снимает другие ограничения клеток. Базовые системные сервисы, которые не имеет смысла запускать внутри клеток, настроены так, чтобы не запускаться как сервисные клетки, даже если они включены в [.filename]#/etc/rc.conf#. Некоторые примеры таких сервисов — это сервисы, которые хотят монтировать или размонтировать что-то в методе start или stop, или тольк
о настраивают что-то, например маршрут, межсетевой экран или подобное.
 
@@ -897,7 +1301,7 @@ ubuntu {
 
 ....
    JID  IP Address      Hostname                      Path
-     1  192.168.250.70  classic                       /usr/local/jails/containers/classic
+     1  192.168.1.151  classic                       /usr/local/jails/containers/classic
 ....
 
 man:jls[8] поддерживает аргумент `--libxo`, который через библиотеку man:libxo[3] позволяет отображать данные в других форматах, таких как `JSON`, `HTML` и т.д.
@@ -912,52 +1316,103 @@ man:jls[8] поддерживает аргумент `--libxo`, который 
 Вывод должен быть похож на следующий:
 
 ....
-{"__version": "2", "jail-information": {"jail": [{"jid":1,"ipv4":"192.168.250.70","hostname":"classic","path":"/usr/local/jails/containers/classic"}]}}
+{"__version": "2", "jail-information": {"jail": [{"jid":1,"ipv4":"192.168.1.151","hostname":"classic","path":"/usr/local/jails/containers/classic"}]}}
 ....
 
-[[start-jail]]
-=== Запуск, перезапуск и остановка клетки
-
-man:service[8] используется для запуска, перезагрузки или остановки клетки на хосте.
-
-Например, чтобы запустить клетку, выполните следующую команду:
+Стандартный вывод является лишь малой частью того, что может сообщить man:jls[8]. Добавьте флаг `-v` для подробной многострочной сводки по каждой клетке, включающей её состояние и назначенный идентификатор набора процессоров (cpuset ID):
 
 [source, shell]
 ....
-# service jail start jailname
+# jls -v
 ....
 
-Измените аргумент `start` на `restart` или `stop`, чтобы выполнить другие действия с клеткой.
-
-[[destroy-jail]]
-=== Удаление клетки
-
-Удаление клетки, это не просто остановка клетки с помощью man:service[8] и удаление каталога клетки и записи в [.filename]#/etc/jail.conf#.
-
-FreeBSD очень серьезно относится к безопасности системы. По этой причине существуют определённые файлы, которые не может удалить даже пользователь root. Эта функциональность называется Флаги Файлов.
-
-Первым шагом является остановка нужной клетки с помощью выполнения следующей команды:
+Используйте `-h` для вывода строки заголовка с названиями полей над значениями запрашиваемых параметров:
 
 [source, shell]
 ....
-# service jail stop jailname
+# jls -h jid name path
 ....
 
-Второй шаг — удалить эти флаги с помощью man:chflags[1], выполнив следующую команду, где `classic` — имя удаляемой клетки:
+Чтобы запросить конкретные параметры одной клетки, укажите её с помощью `-j` и перечислите параметры для вывода:
 
 [source, shell]
 ....
-# chflags -R 0 /usr/local/jails/containers/classic
+# jls -j classic path host.hostname ip4.addr
 ....
 
-Третий шаг — удалить каталог, в котором находилась клетка:
+Вывод должен быть похож на следующий:
+
+....
+/usr/local/jails/containers/classic classic 192.168.1.151
+....
+
+Добавьте `-d`, чтобы включить клетки, которые завершают работу и в противном случае скрыты, пока находятся в состоянии завершения:
+
+[source, shell]
+....
+# jls -d
+....
+
+[[start-jail]]
+=== Запуск, перезапуск и остановка клетки
+
+man:service[8] используется для запуска, перезагрузки или остановки клетки на хосте.
+
+Например, чтобы запустить клетку, выполните следующую команду:
+
+[source, shell]
+....
+# service jail start jailname
+....
+
+Измените аргумент `start` на `restart` или `stop`, чтобы выполнить другие действия с клеткой.
+
+Остановка клетки — это не просто завершение процессов внутри неё. Когда клетка останавливается, man:jail[8] сначала выполняет команды из её параметра `exec.stop` — обычно `/bin/sh /etc/rc.shutdown` — внутри клетки, чтобы её службы корректно завершились. Затем он отправляет `SIGTERM` всем процессам, всё ещё работающим в клетке, и ждёт до `stop.timeout` секунд (по умолчанию 10) их завершения. По истечении этого времени клетка удаляется, что завершает оставшиеся процессы сигналом `SIGKILL`. Если `stop.timeout` установлен в ноль, `SIGTERM` не отправляется, и клетка удаляется немедленно. 
менно поэтому клетка с медленно останавливающимся демоном может казаться зависшей на десять секунд при остановке; увеличьте `stop.timeout` в [.filename]#/etc/jail.conf# для клетки, в которой работает база данных или другая служба, требующая больше времени для корректного завершения.
+
+[[destroy-jail]]
+=== Удаление клетки
+
+Удаление клетки, это не просто остановка клетки с помощью man:service[8] и удаление каталога клетки и записи в [.filename]#/etc/jail.conf#.
+
+FreeBSD очень серьезно относится к безопасности системы. По этой причине существуют определённые файлы, которые не может удалить даже пользователь root. Эта функциональность называется Флаги Файлов. В клетках, чьи файлы находятся на файловой системе UFS, эти флаги должны быть очищены до удаление каталога клетки.
+
+Первым шагом является остановка нужной клетки с помощью выполнения следующей команды:
+
+[source, shell]
+....
+# service jail stop classic
+....
+
+Второй шаг — удалить эти флаги с помощью man:chflags[1], выполнив следующую команду, где `classic` — имя удаляемой клетки:
+
+[source, shell]
+....
+# chflags -R 0 /usr/local/jails/containers/classic
+....
+
+Третий шаг — удалить каталог, в котором находилась клетка:
 
 [source, shell]
 ....
 # rm -rf /usr/local/jails/containers/classic
 ....
 
-Наконец, необходимо удалить запись о клетке в [.filename]#/etc/jail.conf# или в [.filename]#jail.conf.d#.
+Два шага выше относятся к клетке, хранящейся в файловой системе UFS. Клетка, поддерживаемая собственным набором данных ZFS — как созданная в crossref:jails[host-configuration-directories,Настройка дерева каталогов клетки] — удаляется вместо этого путем уничтожения набора данных. Уничтожение набора данных не блокируется файловыми флагами, поэтому шаг с man:chflags[1] в этом случае не требуется:
+
+[source, shell]
+....
+# service jail stop classic
+# zfs destroy zroot/jails/containers/classic
+....
+
+Добавьте `-r`, чтобы также уничтожить любые снимки, которые хранит набор данных.
+
+[NOTE]
+====
+Тонкая клетка на ZFS, созданная клонированием снимка шаблона (см. crossref:jails[thin-jail,Тонкие клетки]), зависит от этого снимка. Пока существует любой клон, man:zfs[8] отказывается уничтожать снимок шаблона и выводит список зависимых клонов. Чтобы удалить шаблон, сначала уничтожьте каждую клетку, клонированную из него, или выполните `zfs promote` на клоне, чтобы он больше не зависел от шаблона.
+====
+
+Наконец, в любом случае удалите запись клетки в [.filename]#/etc/jail.conf# или в [.filename]#/etc/jail.conf.d#. Для тонкой клетки NullFS также удалите её файл [.filename]#.fstab# и её теперь пустой каталог точки монтирования.
 
 [[handle-packages-jail]]
 === Работа с пакетами в клетке
@@ -973,6 +1428,21 @@ FreeBSD очень серьезно относится к безопасност
 
 Для получения дополнительной информации о работе с пакетами в FreeBSD см. crossref:ports[ports,"Установка приложений: Пакеты и порты"].
 
+[[jail-services-host]]
+=== Управление службами в клетке с хост-системы
+
+Службы внутри клетки можно включать и контролировать с хост-системы, не заходя сначала в клетку через man:jexec[8]. Как man:service[8], так и man:sysrc[8] принимают аргумент `-j`, который указывает целевую клетку по ID или имени и работает с конфигурацией man:rc[8] этой клетки.
+
+Продолжая пример с пакетами выше, включите и запустите nginx в клетке `classic` непосредственно с хост-системы:
+
+[source, shell]
+....
+# sysrc -j classic nginx_enable=YES
+# service -j classic nginx start
+....
+
+Эти команды имеют тот же эффект, что и запуск man:sysrc[8] и man:service[8] через man:jexec[8], но они сохраняют единообразие администрирования и написания сценариев на стороне хост-системы с системой без клеток.
+
 [[access-jail]]
 === Доступ к клетке
 
@@ -985,6 +1455,8 @@ FreeBSD очень серьезно относится к безопасност
 # jexec -u root jailname
 ....
 
+Флаг `-u` выбирает пользователя, от имени которого выполняется команда, разрешая имя через базу данных паролей *хост-системы*. Чтобы разрешить пользователя через *собственную* базу данных паролей клетки, используйте `-U`. Если команда не задана, как в данном случае, man:jexec[8] запускает оболочку входа этого пользователя внутри клетки. Добавьте `-l`, чтобы запустить её в чистой среде входа, сохраняющей только `HOME`, `SHELL`, `TERM` и `USER`, сбрасывающей `PATH` на [.filename]#/bin:/usr/bin# и ведущей себя как новый вход; `-d` задаёт рабочую директорию, по умолчанию это корень 
клетки.
+
 При входе в клетку будет отображено сообщение, настроенное в man:motd[5].
 
 [[execute-commands-jail]]
@@ -999,11 +1471,168 @@ FreeBSD очень серьезно относится к безопасност
 # jexec -l jailname service nginx stop
 ....
 
+[[jail-view-processes]]
+=== Просмотр процессов и сокетов в клетках с хост-системы
+
+С хост-системы процессы и сокеты каждой клетки видны и могут фильтроваться по клетке.
+
+man:ps[1] принимает `-J` для ограничения своего вывода одной клеткой, заданной по JID или имени:
+
+[source, shell]
+....
+# ps -J classic
+....
+
+Вывод должен быть похож на следующий, где `J` в столбце `STAT` отмечает процесс, запущенный в клетке:
+
+....
+ PID TT  STAT    TIME COMMAND
+2841  -  IsJ  0:00.02 /usr/sbin/syslogd -ss
+2903  -  IsJ  0:00.00 nginx: master process /usr/local/sbin/nginx
+....
+
+Используйте `ps -J 0`, чтобы показать только процессы самой хост-системы. Ключевые слова `jail` и `jid` также можно добавить в формат вывода `-o`, чтобы показать, к какой клетке относится каждый процесс. Например, чтобы вывести список всех процессов на хост-системе вместе с их клеткой:
+
+[source, shell]
+....
+# ps ax -o pid,jail,command
+....
+
+man:top[1] принимает `-J` для фильтрации своего живого отображения по одной клетке, что подразумевает `-j` и добавляет столбец `JID`:
+
+[source, shell]
+....
+# top -J classic
+....
+
+man:sockstat[1] выводит список сокетов, принадлежащих клетке, с помощью `-j`, что является естественным способом проверить, какие порты демоны клетки фактически привязали после запуска в ней службы:
+
+[source, shell]
+....
+# sockstat -4 -6 -l -j classic
+....
+
+Изнутри клетки картина обратная: процесс, заключенный в клетку, видит только процессы и сокеты своей собственной клетки и никогда не видит процессы или сокеты хоста или других клеток.
+
+[[jail-manage-cli]]
+=== Управление клетками напрямую с помощью утилиты jail
+
+Представленная выше обёртка man:service[8] — это обычный способ запуска клеток при загрузке, но man:jail[8] также может создавать, изменять и удалять клетки напрямую, что полезно для написания скриптов и тестирования конфигурации без фреймворка rc.
+
+Создайте настроенную клетку по имени:
+
+[source, shell]
+....
+# jail -c classic
+....
+
+Удалите работающую клетку; это также удалит все дочерние клетки, которые она создала, и завершит процессы внутри неё:
+
+[source, shell]
+....
+# jail -r classic
+....
+
+Флаг `-m` изменяет параметры уже запущенной клетки без её перезапуска. Например, чтобы добавить второй IPv4-адрес к запущенной клетке:
+
+[source, shell]
+....
+# jail -m name=classic ip4.addr+=192.168.250.71
+....
+
+man:jail[8] отмечает, что «некоторые параметры нельзя изменить в работающей клетке»; на практике это включает `path` и `vnet`, для изменения которых требуется перезапуск клетки.
+
+Наконец, `-e` отображает все настроенные не-шаблонные клетки и их параметры без создания, изменения или удаления чего-либо, что удобно для проверки файла конфигурации. В качестве аргумента она принимает строку, используемую для разделения параметров:
+
+[source, shell]
+....
+# jail -e ,
+....
+
+[[jail-backup]]
+=== Резервное копирование и перенос клетки
+
+Клетка в значительной степени самодостаточна, поэтому её резервное копирование или перенос на другой хост в основном сводится к копированию её файлов и её конфигурации.
+
+Остановите клетку сначала для получения консистентной копии; клетку на основе ZFS можно вместо этого сделать снимок во время её работы. Для клетки на собственном наборе данных ZFS выполните рекурсивный снимок и передайте его на целевой хост:
+
+[source, shell]
+....
+# service jail stop classic
+# zfs snapshot -r zroot/jails/containers/classic@migrate
+# zfs send -R zroot/jails/containers/classic@migrate | ssh newhost zfs receive zroot/jails/containers/classic
+....
+
+Полная механика man:zfs-send[8] и man:zfs-receive[8], включая инкрементальные передачи, описана в crossref:zfs[zfs-zfs-send,Репликация].
+
+Для клетки на файловой системе UFS используйте man:tar[1] с опцией `-p`, чтобы сохранить владельца, права доступа и флаги файлов:
+
+[source, shell]
+....
+# tar -cpf classic.tar -C /usr/local/jails/containers classic
+....
+
+Извлеките архив как `root` на целевой системе с помощью `tar -xpf`, чтобы сохранились флаги. man:dump[8] и man:restore[8] являются альтернативой, когда клетка занимает выделенную файловую систему UFS; они работают с целыми файловыми системами, поэтому не применимы к структуре, используемой в этой главе, где все клетки являются каталогами в одной общей файловой системе.
+
+Наконец, скопируйте блок строк, относящихся к клетке, из [.filename]#/etc/jail.conf# — или его файл в [.filename]#/etc/jail.conf.d# — на новый хост, настройте любые параметры, специфичные для хоста, такие как `interface`, `ip4.addr` или мост, используемый клеткой VNET, и запустите клетку там.
+
+[CAUTION]
+====
+Целевая хост-система не должна запускать более старую версию FreeBSD, чем пользовательское окружение клетки, следуя тому же правилу, что клетка никогда не может запускать более новую версию, чем её хост-система. Тонкая клетка на NullFS не является автономной: её шаблон и скелет также должны существовать на целевой хост-системе, поэтому перенесите и их, или сначала преобразуйте клетку в толстую копию. Любые правила man:rctl[8], хранящиеся в [.filename]#/etc/rctl.conf#, должны быть перенесены отдельно.
+====
+
+[[jail-inside]]
+== Администрирование изнутри клетки
*** 7839 LINES SKIPPED ***