View | Details | Raw Unified | Return to bug 207344
Collapse All | Expand All

(-)chapter.xml (-1611 / +1611 lines)
Lines 1-1611 Link Here
1
<?xml version="1.0" encoding="iso-8859-1"?>
1
<?xml version="1.0" encoding="iso-8859-1"?>
2
<!--
2
<!--
3
    The FreeBSD Documentation Project
3
    The FreeBSD Documentation Project
4
4
5
    $FreeBSD$
5
    $FreeBSD$
6
-->
6
-->
7
<chapter xmlns="http://docbook.org/ns/docbook"
7
<chapter xmlns="http://docbook.org/ns/docbook"
8
  xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
8
  xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
9
  xml:id="jails">
9
  xml:id="jails">
10
  <info>
10
  <info>
11
    <title>Jails</title>
11
    <title>Jails</title>
12
12
13
    <authorgroup>
13
    <authorgroup>
14
      <author><personname><firstname>Matteo</firstname><surname>Riondato</surname></personname><contrib>Contributed
14
      <author><personname><firstname>Matteo</firstname><surname>Riondato</surname></personname><contrib>Contributed
15
	by </contrib></author>
15
	by </contrib></author>
16
    </authorgroup>
16
    </authorgroup>
17
  </info>
17
  </info>
18
18
19
  <indexterm><primary>jails</primary></indexterm>
19
  <indexterm><primary>jails</primary></indexterm>
20
20
21
  <sect1 xml:id="jails-synopsis">
21
  <sect1 xml:id="jails-synopsis">
22
    <title>Synopsis</title>
22
    <title>Synopsis</title>
23
23
24
    <para>Since system administration is a difficult task, many tools
24
    <para>Since system administration is a difficult task, many tools
25
      have been developed to make life easier for the administrator.
25
      have been developed to make life easier for the administrator.
26
      These tools often enhance the way systems are installed,
26
      These tools often enhance the way systems are installed,
27
      configured, and maintained.  One of the tools which can be used
27
      configured, and maintained.  One of the tools which can be used
28
      to enhance the security of a &os; system is
28
      to enhance the security of a &os; system is
29
      <firstterm>jails</firstterm>.  Jails have been available since
29
      <firstterm>jails</firstterm>.  Jails have been available since
30
      &os;&nbsp;4.X and continue to be enhanced in their usefulness,
30
      &os;&nbsp;4.X and continue to be enhanced in their usefulness,
31
      performance, reliability, and security.</para>
31
      performance, reliability, and security.</para>
32
32
33
    <para>Jails build upon the &man.chroot.2; concept, which is used
33
    <para>Jails build upon the &man.chroot.2; concept (which is used
34
      to change the root directory of a set of processes, creating a
34
      to change the root directory of a set of processes) to create a
35
      safe environment, separate from the rest of the system.
35
      safe environment, separate from the rest of the system.
36
      Processes created in the chrooted environment can not access
36
      Processes created in the chrooted environment can not access
37
      files or resources outside of it.  For that reason, compromising
37
      files or resources outside of it.  For that reason, compromising
38
      a service running in a chrooted environment should not allow the
38
      a service running in a "chroot-ed" environment should not allow the
39
      attacker to compromise the entire system.  However, a chroot has
39
      attacker to compromise the entire system.  However, a chroot has
40
      several limitations.  It is suited to easy tasks which do not
40
      several limitations.  It is suited to easy tasks which do not
41
      require much flexibility or complex, advanced features.  Over
41
      require much flexibility or complex, advanced features.  Over
42
      time many ways have been found to escape from a chrooted
42
      time many ways have been found to escape from a chrooted
43
      environment, making it a less than ideal solution for securing
43
      environment, making it a less than ideal solution for securing
44
      services.</para>
44
      services.</para>
45
45
46
    <para>Jails improve on the concept of the traditional chroot
46
    <para>Jails improve on the concept of the traditional chroot
47
      environment in several ways.  In a traditional chroot
47
      environment in several ways.  In a traditional chroot
48
      environment, processes are only limited in the part of the file
48
      environment, processes are only limited in the part of the file
49
      system they can access.  The rest of the system resources,
49
      system they can access.  The rest of the system resources,
50
      system users, running processes, and the networking subsystem
50
      system users, running processes, and the networking subsystem
51
      are shared by the chrooted processes and the processes of the
51
      are shared by the chrooted processes and the processes of the
52
      host system.  Jails expand this model by virtualizing access to
52
      host system.  Jails expand this model by virtualizing access to
53
      the file system, the set of users, and the networking subsystem.
53
      the file system, the set of users, and the networking subsystem.
54
      More fine-grained controls are available for tuning the access
54
      More fine-grained controls are available for tuning the access
55
      of a jailed environment.  Jails can be considered as a type of
55
      of a jailed environment.  Jails can be considered as a type of
56
      operating system-level virtualization.</para>
56
      operating system-level virtualization.</para>
57
57
58
    <para>A jail is characterized by four elements:</para>
58
    <para>A jail is characterized by four elements:</para>
59
59
60
    <itemizedlist>
60
    <itemizedlist>
61
      <listitem>
61
      <listitem>
62
	<para>A directory subtree: the starting point from which a
62
	<para>A directory subtree: the starting point from which a
63
	  jail is entered.  Once inside the jail, a process is not
63
	  jail is entered.  Once inside the jail, a process is not
64
	  permitted to escape outside of this subtree.</para>
64
	  permitted to escape outside of this subtree.</para>
65
      </listitem>
65
      </listitem>
66
66
67
      <listitem>
67
      <listitem>
68
	<para>A hostname: which will be used by the jail.</para>
68
	<para>A hostname: which will be used by the jail.</para>
69
      </listitem>
69
      </listitem>
70
70
71
      <listitem>
71
      <listitem>
72
	<para>An <acronym>IP</acronym> address: which is assigned to
72
	<para>An <acronym>IP</acronym> address: which is assigned to
73
	  the jail.  The <acronym>IP</acronym> address of a jail is
73
	  the jail.  The <acronym>IP</acronym> address of a jail is
74
	  often an alias address for an existing network
74
	  often an alias address for an existing network
75
	  interface.</para>
75
	  interface.</para>
76
      </listitem>
76
      </listitem>
77
77
78
      <listitem>
78
      <listitem>
79
	<para>A command: the path name of an executable to run inside
79
	<para>A command: the path name of an executable to run inside
80
	  the jail.  The path is relative to the root directory of the
80
	  the jail.  The path is relative to the root directory of the
81
	  jail environment.</para>
81
	  jail environment.</para>
82
      </listitem>
82
      </listitem>
83
    </itemizedlist>
83
    </itemizedlist>
84
84
85
    <para>Jails have their own set of users and their own <systemitem
85
    <para>Jails have their own set of users and their own <systemitem
86
	class="username">root</systemitem> account which are limited
86
	class="username">root</systemitem> account which are limited
87
      to the jail environment.  The <systemitem
87
      to the jail environment.  The <systemitem
88
	class="username">root</systemitem> account of a jail is not
88
	class="username">root</systemitem> account of a jail is not
89
      allowed to perform operations to the system outside of the
89
      allowed to perform operations to the system outside of the
90
      associated jail environment.</para>
90
      associated jail environment.</para>
91
91
92
    <para>This chapter provides an overview of the terminology and
92
    <para>This chapter provides an overview of the terminology and
93
      commands for managing &os; jails.  Jails are a powerful tool for
93
      commands for managing &os; jails.  Jails are a powerful tool for
94
      both system administrators, and advanced users.</para>
94
      both system administrators, and advanced users.</para>
95
95
96
    <para>After reading this chapter, you will know:</para>
96
    <para>After reading this chapter, you will know:</para>
97
97
98
    <itemizedlist>
98
    <itemizedlist>
99
      <listitem>
99
      <listitem>
100
	<para>What a jail is and what purpose it may serve in &os;
100
	<para>What a jail is and what purpose it may serve in &os;
101
	  installations.</para>
101
	  installations.</para>
102
      </listitem>
102
      </listitem>
103
103
104
      <listitem>
104
      <listitem>
105
	<para>How to build, start, and stop a jail.</para>
105
	<para>How to build, start, and stop a jail.</para>
106
      </listitem>
106
      </listitem>
107
107
108
      <listitem>
108
      <listitem>
109
	<para>The basics of jail administration, both from inside and
109
	<para>The basics of jail administration, both from inside and
110
	  outside the jail.</para>
110
	  outside the jail.</para>
111
      </listitem>
111
      </listitem>
112
    </itemizedlist>
112
    </itemizedlist>
113
113
114
    <important>
114
    <important>
115
      <para>Jails are a powerful tool, but they are not a security
115
      <para>Jails are a powerful tool, but they are not a security
116
	panacea.  While it is not possible for a jailed process to
116
	panacea.  While it is not possible for a jailed process to
117
	break out on its own, there are several ways in which an
117
	break out on its own, there are several ways in which an
118
	unprivileged user outside the jail can cooperate with a
118
	unprivileged user outside the jail can cooperate with a
119
	privileged user inside the jail to obtain elevated privileges
119
	privileged user inside the jail to obtain elevated privileges
120
	in the host environment.</para>
120
	in the host environment.</para>
121
121
122
      <para>Most of these attacks can be mitigated by ensuring that
122
      <para>Most of these attacks can be mitigated by ensuring that
123
	the jail root is not accessible to unprivileged users in the
123
	the jail root is not accessible to unprivileged users in the
124
	host environment.  As a general rule, untrusted users with
124
	host environment.  As a general rule, untrusted users with
125
	privileged access to a jail should not be given access to the
125
	privileged access to a jail should not be given access to the
126
	host environment.</para>
126
	host environment.</para>
127
    </important>
127
    </important>
128
  </sect1>
128
  </sect1>
129
129
130
  <sect1 xml:id="jails-terms">
130
  <sect1 xml:id="jails-terms">
131
    <title>Terms Related to Jails</title>
131
    <title>Terms Related to Jails</title>
132
132
133
    <para>To facilitate better understanding of parts of the &os;
133
    <para>To facilitate better understanding of parts of the &os;
134
      system related to jails, their internals and the way they
134
      system related to jails, their internals and the way they
135
      interact with the rest of &os;, the following terms are used
135
      interact with the rest of &os;, the following terms are used
136
      further in this chapter:</para>
136
      further in this chapter:</para>
137
137
138
    <variablelist>
138
    <variablelist>
139
      <varlistentry>
139
      <varlistentry>
140
	<term>&man.chroot.8; (command)</term>
140
	<term>&man.chroot.8; (command)</term>
141
	<listitem>
141
	<listitem>
142
	  <para>Utility, which uses &man.chroot.2; &os; system call to
142
	  <para>Utility, which uses &man.chroot.2; &os; system call to
143
	    change the root directory of a process and all its
143
	    change the root directory of a process and all its
144
	    descendants.</para>
144
	    descendants.</para>
145
	</listitem>
145
	</listitem>
146
      </varlistentry>
146
      </varlistentry>
147
147
148
      <varlistentry>
148
      <varlistentry>
149
	<term>&man.chroot.2; (environment)</term>
149
	<term>&man.chroot.2; (environment)</term>
150
	<listitem>
150
	<listitem>
151
	  <para>The environment of processes running in a
151
	  <para>The environment of processes running in a
152
	    <quote>chroot</quote>.  This includes resources such as
152
	    <quote>chroot</quote>.  This includes resources such as
153
	    the part of the file system which is visible, user and
153
	    the part of the file system which is visible, user and
154
	    group IDs which are available, network interfaces and
154
	    group IDs which are available, network interfaces and
155
	    other IPC mechanisms, etc.</para>
155
	    other IPC mechanisms, etc.</para>
156
	</listitem>
156
	</listitem>
157
      </varlistentry>
157
      </varlistentry>
158
158
159
      <varlistentry>
159
      <varlistentry>
160
	<term>&man.jail.8; (command)</term>
160
	<term>&man.jail.8; (command)</term>
161
	<listitem>
161
	<listitem>
162
	  <para>The system administration utility which allows
162
	  <para>The system administration utility which allows
163
	    launching of processes within a jail environment.</para>
163
	    launching of processes within a jail environment.</para>
164
	</listitem>
164
	</listitem>
165
      </varlistentry>
165
      </varlistentry>
166
166
167
      <varlistentry>
167
      <varlistentry>
168
	<term>host (system, process, user, etc.)</term>
168
	<term>host (system, process, user, etc.)</term>
169
	<listitem>
169
	<listitem>
170
	  <para>The controlling system of a jail environment.  The
170
	  <para>The controlling system of a jail environment.  The
171
	    host system has access to all the hardware resources
171
	    host system has access to all the hardware resources
172
	    available, and can control processes both outside of and
172
	    available, and can control processes both outside of and
173
	    inside a jail environment.  One of the important
173
	    inside a jail environment.  One of the important
174
	    differences of the host system from a jail is that the
174
	    differences of the host system from a jail is that the
175
	    limitations which apply to superuser processes inside a
175
	    limitations which apply to superuser processes inside a
176
	    jail are not enforced for processes of the host
176
	    jail are not enforced for processes of the host
177
	    system.</para>
177
	    system.</para>
178
	</listitem>
178
	</listitem>
179
      </varlistentry>
179
      </varlistentry>
180
180
181
      <varlistentry>
181
      <varlistentry>
182
	<term>hosted (system, process, user, etc.)</term>
182
	<term>hosted (system, process, user, etc.)</term>
183
	<listitem>
183
	<listitem>
184
	  <para>A process, user or other entity, whose access to
184
	  <para>A process, user or other entity, whose access to
185
	    resources is restricted by a &os; jail.</para>
185
	    resources is restricted by a &os; jail.</para>
186
	</listitem>
186
	</listitem>
187
      </varlistentry>
187
      </varlistentry>
188
    </variablelist>
188
    </variablelist>
189
  </sect1>
189
  </sect1>
190
190
191
  <sect1 xml:id="jails-build">
191
  <sect1 xml:id="jails-build">
192
    <title>Creating and Controlling Jails</title>
192
    <title>Creating and Controlling Jails</title>
193
193
194
    <para>Some administrators divide jails into the following two
194
    <para>Some administrators divide jails into the following two
195
      types: <quote>complete</quote> jails, which resemble a real &os;
195
      types: <quote>complete</quote> jails, which resemble a real &os;
196
      system, and <quote>service</quote> jails, dedicated to one
196
      system, and <quote>service</quote> jails, dedicated to one
197
      application or service, possibly running with privileges.  This
197
      application or service, possibly running with privileges.  This
198
      is only a conceptual division and the process of building a jail
198
      is only a conceptual division and the process of building a jail
199
      is not affected by it.  When creating a <quote>complete</quote>
199
      is not affected by it.  When creating a <quote>complete</quote>
200
      jail there are two options for the source of the userland: use
200
      jail there are two options for the source of the userland: use
201
      prebuilt binaries (such as those supplied on an install media)
201
      prebuilt binaries (such as those supplied on an install media)
202
      or build from source.</para>
202
      or build from source.</para>
203
203
204
    <para>To install the userland from installation media, first
204
    <para>To install the userland from installation media, first
205
      create the root directory for the jail.  This can be done by
205
      create the root directory for the jail.  This can be done by
206
      setting the <varname>DESTDIR</varname> variable to the proper
206
      setting the <varname>DESTDIR</varname> variable to the proper
207
      location.</para>
207
      location.</para>
208
208
209
    <para>Start a shell and define <varname>DESTDIR</varname>:</para>
209
    <para>Start a shell and define <varname>DESTDIR</varname>:</para>
210
210
211
    <screen>&prompt.root; <userinput>sh</userinput>
211
    <screen>&prompt.root; <userinput>sh</userinput>
212
&prompt.root; <userinput>export DESTDIR=<replaceable>/here/is/the/jail</replaceable></userinput></screen>
212
&prompt.root; <userinput>export DESTDIR=<replaceable>/here/is/the/jail</replaceable></userinput></screen>
213
213
214
    <para>Mount the install media as covered in &man.mdconfig.8;
214
    <para>Mount the install media as covered in &man.mdconfig.8;
215
      when using the install ISO:</para>
215
      when using the install ISO:</para>
216
216
217
    <screen>&prompt.root; <userinput>mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt</userinput></screen>
217
    <screen>&prompt.root; <userinput>mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt</userinput></screen>
218
218
219
    <para>Extract the binaries from the tarballs on the install media
219
    <para>Extract the binaries from the tarballs on the install media
220
      into the declared destination.  Minimally, only the base set
220
      into the declared destination.  Minimally, only the base set
221
      needs to be extracted, but a complete install can be performed
221
      needs to be extracted, but a complete install can be performed
222
      when preferred.</para>
222
      when preferred.</para>
223
223
224
    <para>To install just the base system:</para>
224
    <para>To install just the base system:</para>
225
225
226
    <screen>&prompt.root; <userinput>tar -xf /mnt/usr/freebsd-dist/base.txz -C $DESTDIR</userinput></screen>
226
    <screen>&prompt.root; <userinput>tar -xf /mnt/usr/freebsd-dist/base.txz -C $DESTDIR</userinput></screen>
227
227
228
    <para>To install everything except the kernel:</para>
228
    <para>To install everything except the kernel:</para>
229
229
230
    <screen>&prompt.root; <userinput>for <replaceable>sets</replaceable> in BASE PORTS; do tar -xf /mnt/FREEBSD_INSTALL/USR/FREEBSD_DIST/$<replaceable>sets</replaceable>.TXZ -C $DESTDIR ; done</userinput></screen>
230
    <screen>&prompt.root; <userinput>for <replaceable>sets</replaceable> in BASE PORTS; do tar -xf /mnt/FREEBSD_INSTALL/USR/FREEBSD_DIST/$<replaceable>sets</replaceable>.TXZ -C $DESTDIR ; done</userinput></screen>
231
231
232
    <para>The &man.jail.8; manual page explains the procedure for
232
    <para>The &man.jail.8; manual page explains the procedure for
233
      building a jail:</para>
233
      building a jail:</para>
234
234
235
    <screen>&prompt.root; <userinput>setenv D <replaceable>/here/is/the/jail</replaceable></userinput>
235
    <screen>&prompt.root; <userinput>setenv D <replaceable>/here/is/the/jail</replaceable></userinput>
236
&prompt.root; <userinput>mkdir -p $D</userinput>      <co xml:id="jailpath"/>
236
&prompt.root; <userinput>mkdir -p $D</userinput>      <co xml:id="jailpath"/>
237
&prompt.root; <userinput>cd /usr/src</userinput>
237
&prompt.root; <userinput>cd /usr/src</userinput>
238
&prompt.root; <userinput>make buildworld</userinput>  <co xml:id="jailbuildworld"/>
238
&prompt.root; <userinput>make buildworld</userinput>  <co xml:id="jailbuildworld"/>
239
&prompt.root; <userinput>make installworld DESTDIR=$D</userinput>  <co xml:id="jailinstallworld"/>
239
&prompt.root; <userinput>make installworld DESTDIR=$D</userinput>  <co xml:id="jailinstallworld"/>
240
&prompt.root; <userinput>make distribution DESTDIR=$D</userinput>  <co xml:id="jaildistrib"/>
240
&prompt.root; <userinput>make distribution DESTDIR=$D</userinput>  <co xml:id="jaildistrib"/>
241
&prompt.root; <userinput>mount -t devfs devfs $D/dev</userinput>   <co xml:id="jaildevfs"/></screen>
241
&prompt.root; <userinput>mount -t devfs devfs $D/dev</userinput>   <co xml:id="jaildevfs"/></screen>
242
242
243
    <calloutlist>
243
    <calloutlist>
244
      <callout arearefs="jailpath">
244
      <callout arearefs="jailpath">
245
	<para>Selecting a location for a jail is the best starting
245
	<para>Selecting a location for a jail is the best starting
246
	  point.  This is where the jail will physically reside within
246
	  point.  This is where the jail will physically reside within
247
	  the file system of the jail's host.  A good choice can be
247
	  the file system of the jail's host.  A good choice can be
248
	  <filename
248
	  <filename
249
	    >/usr/jail/<replaceable>jailname</replaceable></filename>,
249
	    >/usr/jail/<replaceable>jailname</replaceable></filename>,
250
	  where <replaceable>jailname</replaceable> is the hostname
250
	  where <replaceable>jailname</replaceable> is the hostname
251
	  identifying the jail.  Usually, <filename>/usr/</filename>
251
	  identifying the jail.  Usually, <filename>/usr/</filename>
252
	  has enough space for the jail file system, which for
252
	  has enough space for the jail file system, which for
253
	  <quote>complete</quote> jails is, essentially, a replication
253
	  <quote>complete</quote> jails is, essentially, a replication
254
	  of every file present in a default installation of the &os;
254
	  of every file present in a default installation of the &os;
255
	  base system.</para>
255
	  base system.</para>
256
      </callout>
256
      </callout>
257
257
258
      <callout arearefs="jailbuildworld">
258
      <callout arearefs="jailbuildworld">
259
	<para>If you have already rebuilt your userland using
259
	<para>If you have already rebuilt your userland using
260
	  <command>make world</command> or
260
	  <command>make world</command> or
261
	  <command>make buildworld</command>, you can skip this step
261
	  <command>make buildworld</command>, you can skip this step
262
	  and install your existing userland into the new jail.</para>
262
	  and install your existing userland into the new jail.</para>
263
      </callout>
263
      </callout>
264
264
265
      <callout arearefs="jailinstallworld">
265
      <callout arearefs="jailinstallworld">
266
	<para>This command will populate the directory subtree chosen
266
	<para>This command will populate the directory subtree chosen
267
	  as jail's physical location on the file system with the
267
	  as jail's physical location on the file system with the
268
	  necessary binaries, libraries, manual pages and so
268
	  necessary binaries, libraries, manual pages and so
269
	  on.</para>
269
	  on.</para>
270
      </callout>
270
      </callout>
271
271
272
      <callout arearefs="jaildistrib">
272
      <callout arearefs="jaildistrib">
273
	<para>The <buildtarget>distribution</buildtarget> target for
273
	<para>The <buildtarget>distribution</buildtarget> target for
274
	  <application>make</application> installs every needed
274
	  <application>make</application> installs every needed
275
	  configuration file.  In simple words, it installs every
275
	  configuration file.  In simple words, it installs every
276
	  installable file of
276
	  installable file of
277
	  <filename>/usr/src/etc/</filename> to the
277
	  <filename>/usr/src/etc/</filename> to the
278
	  <filename>/etc</filename> directory of the
278
	  <filename>/etc</filename> directory of the
279
	  jail environment:
279
	  jail environment:
280
	  <filename>$D/etc/</filename>.</para>
280
	  <filename>$D/etc/</filename>.</para>
281
      </callout>
281
      </callout>
282
282
283
      <callout arearefs="jaildevfs">
283
      <callout arearefs="jaildevfs">
284
	<para>Mounting the &man.devfs.8; file system inside a jail is
284
	<para>Mounting the &man.devfs.8; file system inside a jail is
285
	  not required.  On the other hand, any, or almost any
285
	  not required.  On the other hand, any, or almost any
286
	  application requires access to at least one device,
286
	  application requires access to at least one device,
287
	  depending on the purpose of the given application.  It is
287
	  depending on the purpose of the given application.  It is
288
	  very important to control access to devices from inside a
288
	  very important to control access to devices from inside a
289
	  jail, as improper settings could permit an attacker to do
289
	  jail, as improper settings could permit an attacker to do
290
	  nasty things in the jail.  Control over &man.devfs.8; is
290
	  nasty things in the jail.  Control over &man.devfs.8; is
291
	  managed through rulesets which are described in the
291
	  managed through rulesets which are described in the
292
	  &man.devfs.8; and &man.devfs.conf.5; manual pages.</para>
292
	  &man.devfs.8; and &man.devfs.conf.5; manual pages.</para>
293
      </callout>
293
      </callout>
294
    </calloutlist>
294
    </calloutlist>
295
295
296
    <para>Once a jail is installed, it can be started by using the
296
    <para>Once a jail is installed, it can be started by using the
297
      &man.jail.8; utility.  The &man.jail.8; utility takes four
297
      &man.jail.8; utility.  The &man.jail.8; utility takes four
298
      mandatory arguments which are described in the <xref
298
      mandatory arguments which are described in the <xref
299
	linkend="jails-synopsis"/>.  Other arguments may be specified
299
	linkend="jails-synopsis"/>.  Other arguments may be specified
300
      too, e.g., to run the jailed process with the credentials of a
300
      too, e.g., to run the jailed process with the credentials of a
301
      specific user.  The
301
      specific user.  The
302
      <option><replaceable>command</replaceable></option> argument
302
      <option><replaceable>command</replaceable></option> argument
303
      depends on the type of the jail; for a
303
      depends on the type of the jail; for a
304
      <emphasis>virtual system</emphasis>,
304
      <emphasis>virtual system</emphasis>,
305
      <filename>/etc/rc</filename> is a good choice, since it will
305
      <filename>/etc/rc</filename> is a good choice, since it will
306
      replicate the startup sequence of a real &os; system.  For a
306
      replicate the startup sequence of a real &os; system.  For a
307
      <emphasis>service</emphasis> jail, it depends on the service or
307
      <emphasis>service</emphasis> jail, it depends on the service or
308
      application that will run within the jail.</para>
308
      application that will run within the jail.</para>
309
309
310
    <para>Jails are often started at boot time and the &os;
310
    <para>Jails are often started at boot time and the &os;
311
      <filename>rc</filename> mechanism provides an easy way to do
311
      <filename>rc</filename> mechanism provides an easy way to do
312
      this.</para>
312
      this.</para>
313
313
314
    <procedure>
314
    <procedure>
315
      <step>
315
      <step>
316
	<para>A list of the jails which are enabled to start at boot
316
	<para>A list of the jails which are enabled to start at boot
317
	  time should be added to the &man.rc.conf.5; file:</para>
317
	  time should be added to the &man.rc.conf.5; file:</para>
318
318
319
	<programlisting>jail_enable="YES"   # Set to NO to disable starting of any jails
319
	<programlisting>jail_enable="YES"   # Set to NO to disable starting of any jails
320
jail_list="<replaceable>www</replaceable>"     # Space separated list of names of jails</programlisting>
320
jail_list="<replaceable>www</replaceable>"     # Space separated list of names of jails</programlisting>
321
321
322
	<note>
322
	<note>
323
	  <para>Jail names in <varname>jail_list</varname> should
323
	  <para>Jail names in <varname>jail_list</varname> should
324
	    contain alphanumeric characters only.</para>
324
	    contain alphanumeric characters only.</para>
325
	</note>
325
	</note>
326
      </step>
326
      </step>
327
327
328
      <step>
328
      <step>
329
	<para>For each jail listed in <varname>jail_list</varname>, a
329
	<para>For each jail listed in <varname>jail_list</varname>, a
330
	  group of &man.rc.conf.5; settings, which describe the
330
	  group of &man.rc.conf.5; settings, which describe the
331
	  particular jail, should be added:</para>
331
	  particular jail, should be added:</para>
332
332
333
	<programlisting>jail_<replaceable>www</replaceable>_rootdir="/usr/jail/www"     # jail's root directory
333
	<programlisting>jail_<replaceable>www</replaceable>_rootdir="/usr/jail/www"     # jail's root directory
334
jail_<replaceable>www</replaceable>_hostname="<replaceable>www</replaceable>.example.org"  # jail's hostname
334
jail_<replaceable>www</replaceable>_hostname="<replaceable>www</replaceable>.example.org"  # jail's hostname
335
jail_<replaceable>www</replaceable>_ip="192.168.0.10"           # jail's IP address
335
jail_<replaceable>www</replaceable>_ip="192.168.0.10"           # jail's IP address
336
jail_<replaceable>www</replaceable>_devfs_enable="YES"          # mount devfs in the jail</programlisting>
336
jail_<replaceable>www</replaceable>_devfs_enable="YES"          # mount devfs in the jail</programlisting>
337
337
338
	<para>The default startup of jails configured in
338
	<para>The default startup of jails configured in
339
	  &man.rc.conf.5;, will run the <filename>/etc/rc</filename>
339
	  &man.rc.conf.5;, will run the <filename>/etc/rc</filename>
340
	  script of the jail, which assumes the jail is a complete
340
	  script of the jail, which assumes the jail is a complete
341
	  virtual system.  For service jails, the default startup
341
	  virtual system.  For service jails, the default startup
342
	  command of the jail should be changed, by setting the
342
	  command of the jail should be changed, by setting the
343
	  <varname>jail_<replaceable>jailname</replaceable>_exec_start</varname>
343
	  <varname>jail_<replaceable>jailname</replaceable>_exec_start</varname>
344
	  option appropriately.</para>
344
	  option appropriately.</para>
345
345
346
	<note>
346
	<note>
347
	  <para>For a full list of available options, please see the
347
	  <para>For a full list of available options, please see the
348
	    &man.rc.conf.5; manual page.</para>
348
	    &man.rc.conf.5; manual page.</para>
349
	</note>
349
	</note>
350
      </step>
350
      </step>
351
    </procedure>
351
    </procedure>
352
352
353
    <para>&man.service.8; can be used to start or stop a jail by hand,
353
    <para>&man.service.8; can be used to start or stop a jail by hand,
354
      if an entry for it exists in
354
      if an entry for it exists in
355
      <filename>rc.conf</filename>:</para>
355
      <filename>rc.conf</filename>:</para>
356
356
357
    <screen>&prompt.root; <userinput>service jail start <replaceable>www</replaceable></userinput>
357
    <screen>&prompt.root; <userinput>service jail start <replaceable>www</replaceable></userinput>
358
&prompt.root; <userinput>service jail stop <replaceable>www</replaceable></userinput></screen>
358
&prompt.root; <userinput>service jail stop <replaceable>www</replaceable></userinput></screen>
359
359
360
    <para>Jails can be shut down with &man.jexec.8;.  Use &man.jls.8;
360
    <para>Jails can be shut down with &man.jexec.8;.  Use &man.jls.8;
361
      to identify the jail's <varname>JID</varname>, then use
361
      to identify the jail's <varname>JID</varname>, then use
362
      &man.jexec.8; to run the shutdown script in that jail.</para>
362
      &man.jexec.8; to run the shutdown script in that jail.</para>
363
363
364
    <screen>&prompt.root; <userinput>jls</userinput>
364
    <screen>&prompt.root; <userinput>jls</userinput>
365
   JID  IP Address      Hostname                      Path
365
   JID  IP Address      Hostname                      Path
366
     3  192.168.0.10    www                           /usr/jail/www
366
     3  192.168.0.10    www                           /usr/jail/www
367
&prompt.root; <userinput>jexec <replaceable>3</replaceable> /etc/rc.shutdown</userinput></screen>
367
&prompt.root; <userinput>jexec <replaceable>3</replaceable> /etc/rc.shutdown</userinput></screen>
368
368
369
    <para>More information about this can be found in the &man.jail.8;
369
    <para>More information about this can be found in the &man.jail.8;
370
      manual page.</para>
370
      manual page.</para>
371
  </sect1>
371
  </sect1>
372
372
373
  <sect1 xml:id="jails-tuning">
373
  <sect1 xml:id="jails-tuning">
374
    <title>Fine Tuning and Administration</title>
374
    <title>Fine Tuning and Administration</title>
375
375
376
    <para>There are several options which can be set for any jail, and
376
    <para>There are several options which can be set for any jail, and
377
      various ways of combining a host &os; system with jails, to
377
      various ways of combining a host &os; system with jails, to
378
      produce higher level applications.  This section
378
      produce higher level applications.  This section
379
      presents:</para>
379
      presents:</para>
380
380
381
    <itemizedlist>
381
    <itemizedlist>
382
      <listitem>
382
      <listitem>
383
	<para>Some of the options available for tuning the behavior
383
	<para>Some of the options available for tuning the behavior
384
	  and security restrictions implemented by a jail
384
	  and security restrictions implemented by a jail
385
	  installation.</para>
385
	  installation.</para>
386
      </listitem>
386
      </listitem>
387
387
388
      <listitem>
388
      <listitem>
389
	<para>Some of the high-level applications for jail management,
389
	<para>Some of the high-level applications for jail management,
390
	  which are available through the &os; Ports Collection, and
390
	  which are available through the &os; Ports Collection, and
391
	  can be used to implement overall jail-based
391
	  can be used to implement overall jail-based
392
	  solutions.</para>
392
	  solutions.</para>
393
      </listitem>
393
      </listitem>
394
    </itemizedlist>
394
    </itemizedlist>
395
395
396
    <sect2 xml:id="jails-tuning-utilities">
396
    <sect2 xml:id="jails-tuning-utilities">
397
      <title>System Tools for Jail Tuning in &os;</title>
397
      <title>System Tools for Jail Tuning in &os;</title>
398
398
399
      <para>Fine tuning of a jail's configuration is mostly done by
399
      <para>Fine tuning of a jail's configuration is mostly done by
400
	setting &man.sysctl.8; variables.  A special subtree of sysctl
400
	setting &man.sysctl.8; variables.  A special subtree of sysctl
401
	exists as a basis for organizing all the relevant options: the
401
	exists as a basis for organizing all the relevant options: the
402
	<varname>security.jail.*</varname> hierarchy of &os; kernel
402
	<varname>security.jail.*</varname> hierarchy of &os; kernel
403
	options.  Here is a list of the main jail-related sysctls,
403
	options.  Here is a list of the main jail-related sysctls,
404
	complete with their default value.  Names should be
404
	complete with their default value.  Names should be
405
	self-explanatory, but for more information about them, please
405
	self-explanatory, but for more information about them, please
406
	refer to the &man.jail.8; and &man.sysctl.8; manual
406
	refer to the &man.jail.8; and &man.sysctl.8; manual
407
	pages.</para>
407
	pages.</para>
408
408
409
      <itemizedlist>
409
      <itemizedlist>
410
	<listitem>
410
	<listitem>
411
	  <para><varname>security.jail.set_hostname_allowed:
411
	  <para><varname>security.jail.set_hostname_allowed:
412
	      1</varname></para>
412
	      1</varname></para>
413
	</listitem>
413
	</listitem>
414
414
415
	<listitem>
415
	<listitem>
416
	  <para><varname>security.jail.socket_unixiproute_only:
416
	  <para><varname>security.jail.socket_unixiproute_only:
417
	      1</varname></para>
417
	      1</varname></para>
418
	</listitem>
418
	</listitem>
419
419
420
	<listitem>
420
	<listitem>
421
	  <para><varname>security.jail.sysvipc_allowed:
421
	  <para><varname>security.jail.sysvipc_allowed:
422
	      0</varname></para>
422
	      0</varname></para>
423
	</listitem>
423
	</listitem>
424
424
425
	<listitem>
425
	<listitem>
426
	  <para><varname>security.jail.enforce_statfs:
426
	  <para><varname>security.jail.enforce_statfs:
427
	      2</varname></para>
427
	      2</varname></para>
428
	</listitem>
428
	</listitem>
429
429
430
	<listitem>
430
	<listitem>
431
	  <para><varname>security.jail.allow_raw_sockets:
431
	  <para><varname>security.jail.allow_raw_sockets:
432
	      0</varname></para>
432
	      0</varname></para>
433
	</listitem>
433
	</listitem>
434
434
435
	<listitem>
435
	<listitem>
436
	  <para><varname>security.jail.chflags_allowed:
436
	  <para><varname>security.jail.chflags_allowed:
437
	      0</varname></para>
437
	      0</varname></para>
438
	</listitem>
438
	</listitem>
439
439
440
	<listitem>
440
	<listitem>
441
	  <para><varname>security.jail.jailed: 0</varname></para>
441
	  <para><varname>security.jail.jailed: 0</varname></para>
442
	</listitem>
442
	</listitem>
443
      </itemizedlist>
443
      </itemizedlist>
444
444
445
      <para>These variables can be used by the system administrator of
445
      <para>These variables can be used by the system administrator of
446
	the <emphasis>host system</emphasis> to add or remove some of
446
	the <emphasis>host system</emphasis> to add or remove some of
447
	the limitations imposed by default on the <systemitem
447
	the limitations imposed by default on the <systemitem
448
	  class="username">root</systemitem> user.  Note that there
448
	  class="username">root</systemitem> user.  Note that there
449
	are some limitations which cannot be removed.  The
449
	are some limitations which cannot be removed.  The
450
	<systemitem class="username">root</systemitem> user is not
450
	<systemitem class="username">root</systemitem> user is not
451
	allowed to mount or unmount file systems from within a
451
	allowed to mount or unmount file systems from within a
452
	&man.jail.8;.  The <systemitem
452
	&man.jail.8;.  The <systemitem
453
	  class="username">root</systemitem> inside a jail may not
453
	  class="username">root</systemitem> inside a jail may not
454
	load or unload &man.devfs.8; rulesets, set firewall rules, or
454
	load or unload &man.devfs.8; rulesets, set firewall rules, or
455
	do many other administrative tasks which require modifications
455
	do many other administrative tasks which require modifications
456
	of in-kernel data, such as setting the
456
	of in-kernel data, such as setting the
457
	<varname>securelevel</varname> of the kernel.</para>
457
	<varname>securelevel</varname> of the kernel.</para>
458
458
459
      <para>The base system of &os; contains a basic set of tools for
459
      <para>The base system of &os; contains a basic set of tools for
460
	viewing information about the active jails, and attaching to a
460
	viewing information about the active jails, and attaching to a
461
	jail to run administrative commands.  The &man.jls.8; and
461
	jail to run administrative commands.  The &man.jls.8; and
462
	&man.jexec.8; commands are part of the base &os; system, and
462
	&man.jexec.8; commands are part of the base &os; system, and
463
	can be used to perform the following simple tasks:</para>
463
	can be used to perform the following simple tasks:</para>
464
464
465
      <itemizedlist>
465
      <itemizedlist>
466
	<listitem>
466
	<listitem>
467
	  <para>Print a list of active jails and their corresponding
467
	  <para>Print a list of active jails and their corresponding
468
	    jail identifier (<acronym>JID</acronym>),
468
	    jail identifier (<acronym>JID</acronym>),
469
	    <acronym>IP</acronym> address, hostname and path.</para>
469
	    <acronym>IP</acronym> address, hostname and path.</para>
470
	</listitem>
470
	</listitem>
471
471
472
	<listitem>
472
	<listitem>
473
	  <para>Attach to a running jail, from its host system, and
473
	  <para>Attach to a running jail, from its host system, and
474
	    run a command inside the jail or perform administrative
474
	    run a command inside the jail or perform administrative
475
	    tasks inside the jail itself.  This is especially useful
475
	    tasks inside the jail itself.  This is especially useful
476
	    when the <systemitem class="username">root</systemitem>
476
	    when the <systemitem class="username">root</systemitem>
477
	    user wants to cleanly shut down a jail.  The &man.jexec.8;
477
	    user wants to cleanly shut down a jail.  The &man.jexec.8;
478
	    utility can also be used to start a shell in a jail to do
478
	    utility can also be used to start a shell in a jail to do
479
	    administration in it; for example:</para>
479
	    administration in it; for example:</para>
480
480
481
	  <screen>&prompt.root; <userinput>jexec <replaceable>1</replaceable> tcsh</userinput></screen>
481
	  <screen>&prompt.root; <userinput>jexec <replaceable>1</replaceable> tcsh</userinput></screen>
482
	</listitem>
482
	</listitem>
483
      </itemizedlist>
483
      </itemizedlist>
484
    </sect2>
484
    </sect2>
485
485
486
    <sect2 xml:id="jails-tuning-admintools">
486
    <sect2 xml:id="jails-tuning-admintools">
487
      <title>High-Level Administrative Tools in the &os; Ports
487
      <title>High-Level Administrative Tools in the &os; Ports
488
	Collection</title>
488
	Collection</title>
489
489
490
      <para>Among the many third-party utilities for jail
490
      <para>Among the many third-party utilities for jail
491
	administration, one of the most complete and useful is
491
	administration, one of the most complete and useful is
492
	<package>sysutils/ezjail</package>.  It is a set of scripts
492
	<package>sysutils/ezjail</package>.  It is a set of scripts
493
	that contribute to &man.jail.8; management.  Please refer to
493
	that contribute to &man.jail.8; management.  Please refer to
494
	<link xlink:href="&url.books.handbook;/jails-ezjail.html">the
494
	<link xlink:href="&url.books.handbook;/jails-ezjail.html">the
495
	  handbook section on <application>ezjail</application></link>
495
	  handbook section on <application>ezjail</application></link>
496
	for more information.</para>
496
	for more information.</para>
497
    </sect2>
497
    </sect2>
498
498
499
    <sect2 xml:id="jails-updating">
499
    <sect2 xml:id="jails-updating">
500
      <title>Keeping Jails Patched and up to Date</title>
500
      <title>Keeping Jails Patched and up to Date</title>
501
501
502
      <para>Jails should be kept up to date from the host operating
502
      <para>Jails should be kept up to date from the host operating
503
	system as attempting to patch userland from within the jail
503
	system as attempting to patch userland from within the jail
504
	may likely fail as the default behaviour in FreeBSD is to
504
	may likely fail as the default behaviour in FreeBSD is to
505
	disallow the use of &man.chflags.1; in a jail which prevents
505
	disallow the use of &man.chflags.1; in a jail which prevents
506
	the replacement of some files.  It is possible to change this
506
	the replacement of some files.  It is possible to change this
507
	behavior but it is recommended to use &man.freebsd-update.8;
507
	behavior but it is recommended to use &man.freebsd-update.8;
508
	to maintain jails instead.  Use <option>-b</option> to specify
508
	to maintain jails instead.  Use <option>-b</option> to specify
509
	the path of the jail to be updated.</para>
509
	the path of the jail to be updated.</para>
510
510
511
      <screen>&prompt.root; <userinput>freebsd-update -b <replaceable>/here/is/the/jail</replaceable> fetch</userinput>
511
      <screen>&prompt.root; <userinput>freebsd-update -b <replaceable>/here/is/the/jail</replaceable> fetch</userinput>
512
&prompt.root; <userinput>freebsd-update -b <replaceable>/here/is/the/jail</replaceable> install</userinput></screen>
512
&prompt.root; <userinput>freebsd-update -b <replaceable>/here/is/the/jail</replaceable> install</userinput></screen>
513
    </sect2>
513
    </sect2>
514
  </sect1>
514
  </sect1>
515
515
516
  <sect1 xml:id="jails-application">
516
  <sect1 xml:id="jails-application">
517
    <info>
517
    <info>
518
      <title>Updating Multiple Jails</title>
518
      <title>Updating Multiple Jails</title>
519
519
520
      <authorgroup>
520
      <authorgroup>
521
	<author>
521
	<author>
522
	  <personname>
522
	  <personname>
523
	    <firstname>Daniel</firstname>
523
	    <firstname>Daniel</firstname>
524
	    <surname>Gerzo</surname>
524
	    <surname>Gerzo</surname>
525
	  </personname>
525
	  </personname>
526
	  <contrib>Contributed by </contrib>
526
	  <contrib>Contributed by </contrib>
527
	</author>
527
	</author>
528
      </authorgroup>
528
      </authorgroup>
529
      <authorgroup>
529
      <authorgroup>
530
	<author>
530
	<author>
531
	  <personname>
531
	  <personname>
532
	    <firstname>Simon</firstname>
532
	    <firstname>Simon</firstname>
533
	    <surname>L. B. Nielsen</surname>
533
	    <surname>L. B. Nielsen</surname>
534
	  </personname>
534
	  </personname>
535
	  <contrib>Based upon an idea presented by </contrib>
535
	  <contrib>Based upon an idea presented by </contrib>
536
	</author>
536
	</author>
537
      </authorgroup>
537
      </authorgroup>
538
      <authorgroup>
538
      <authorgroup>
539
	<author>
539
	<author>
540
	  <personname>
540
	  <personname>
541
	    <firstname>Ken</firstname>
541
	    <firstname>Ken</firstname>
542
	    <surname>Tom</surname>
542
	    <surname>Tom</surname>
543
	  </personname>
543
	  </personname>
544
	  <contrib>And an article written by </contrib>
544
	  <contrib>And an article written by </contrib>
545
	</author>
545
	</author>
546
      </authorgroup>
546
      </authorgroup>
547
    </info>
547
    </info>
548
548
549
    <para>The management of multiple jails can become problematic
549
    <para>The management of multiple jails can become problematic
550
      because every jail has to be rebuilt from scratch whenever it is
550
      because every jail has to be rebuilt from scratch whenever it is
551
      upgraded.  This can be time consuming and tedious if a lot of
551
      upgraded.  This can be time consuming and tedious if a lot of
552
      jails are created and manually updated.</para>
552
      jails are created and manually updated.</para>
553
553
554
    <para>This section demonstrates one method to resolve this issue
554
    <para>This section demonstrates one method to resolve this issue
555
      by safely sharing as much as is possible between jails using
555
      by safely sharing as much as is possible between jails using
556
      read-only &man.mount.nullfs.8; mounts, so that updating is
556
      read-only &man.mount.nullfs.8; mounts, so that updating is
557
      simpler.  This makes it more attractive to put single services,
557
      simpler.  This makes it more attractive to put single services,
558
      such as <acronym>HTTP</acronym>, <acronym>DNS</acronym>, and
558
      such as <acronym>HTTP</acronym>, <acronym>DNS</acronym>, and
559
      <acronym>SMTP</acronym>, into individual jails.  Additionally,
559
      <acronym>SMTP</acronym>, into individual jails.  Additionally,
560
      it provides a simple way to add, remove, and upgrade
560
      it provides a simple way to add, remove, and upgrade
561
      jails.</para>
561
      jails.</para>
562
562
563
    <note>
563
    <note>
564
      <para>Simpler solutions exist, such as
564
      <para>Simpler solutions exist, such as
565
	<application>ezjail</application>, which provides an easier
565
	<application>ezjail</application>, which provides an easier
566
	method of administering &os; jails but is less versatile than
566
	method of administering &os; jails but is less versatile than
567
	this setup.  <application>ezjail</application> is covered in
567
	this setup.  <application>ezjail</application> is covered in
568
	more detail in <xref linkend="jails-ezjail"/>.</para>
568
	more detail in <xref linkend="jails-ezjail"/>.</para>
569
    </note>
569
    </note>
570
570
571
    <para>The goals of the setup described in this section are:</para>
571
    <para>The goals of the setup described in this section are:</para>
572
572
573
    <itemizedlist>
573
    <itemizedlist>
574
      <listitem>
574
      <listitem>
575
	<para>Create a simple and easy to understand jail structure
575
	<para>Create a simple and easy to understand jail structure
576
	  that does not require running a full installworld on each
576
	  that does not require running a full installworld on each
577
	  and every jail.</para>
577
	  and every jail.</para>
578
      </listitem>
578
      </listitem>
579
579
580
      <listitem>
580
      <listitem>
581
	<para>Make it easy to add new jails or remove existing
581
	<para>Make it easy to add new jails or remove existing
582
	  ones.</para>
582
	  ones.</para>
583
      </listitem>
583
      </listitem>
584
584
585
      <listitem>
585
      <listitem>
586
	<para>Make it easy to update or upgrade existing jails.</para>
586
	<para>Make it easy to update or upgrade existing jails.</para>
587
      </listitem>
587
      </listitem>
588
588
589
      <listitem>
589
      <listitem>
590
	<para>Make it possible to run a customized &os; branch.</para>
590
	<para>Make it possible to run a customized &os; branch.</para>
591
      </listitem>
591
      </listitem>
592
592
593
      <listitem>
593
      <listitem>
594
	<para>Be paranoid about security, reducing as much as
594
	<para>Be paranoid about security, reducing as much as
595
	  possible the possibility of compromise.</para>
595
	  possible the possibility of compromise.</para>
596
      </listitem>
596
      </listitem>
597
597
598
      <listitem>
598
      <listitem>
599
	<para>Save space and inodes, as much as possible.</para>
599
	<para>Save space and inodes, as much as possible.</para>
600
      </listitem>
600
      </listitem>
601
    </itemizedlist>
601
    </itemizedlist>
602
602
603
    <para>This design relies on a single, read-only master template
603
    <para>This design relies on a single, read-only master template
604
      which is mounted into each jail and one read-write device per
604
      which is mounted into each jail and one read-write device per
605
      jail.  A device can be a separate physical disc, a partition, or
605
      jail.  A device can be a separate physical disc, a partition, or
606
      a vnode backed memory device.  This example uses read-write
606
      a vnode backed memory device.  This example uses read-write
607
      <application>nullfs</application> mounts.</para>
607
      <application>nullfs</application> mounts.</para>
608
608
609
    <para>The file system layout is as follows:</para>
609
    <para>The file system layout is as follows:</para>
610
610
611
    <itemizedlist>
611
    <itemizedlist>
612
      <listitem>
612
      <listitem>
613
	<para>The jails are based under the
613
	<para>The jails are based under the
614
	  <filename>/home</filename> partition.</para>
614
	  <filename>/home</filename> partition.</para>
615
      </listitem>
615
      </listitem>
616
616
617
      <listitem>
617
      <listitem>
618
	<para>Each jail will be mounted under the
618
	<para>Each jail will be mounted under the
619
	  <filename>/home/j</filename> directory.</para>
619
	  <filename>/home/j</filename> directory.</para>
620
      </listitem>
620
      </listitem>
621
621
622
      <listitem>
622
      <listitem>
623
	<para>The template for each jail and the read-only partition
623
	<para>The template for each jail and the read-only partition
624
	  for  all of the jails is
624
	  for  all of the jails is
625
	  <filename>/home/j/mroot</filename>.</para>
625
	  <filename>/home/j/mroot</filename>.</para>
626
      </listitem>
626
      </listitem>
627
627
628
      <listitem>
628
      <listitem>
629
	<para>A blank directory will be created for each jail under
629
	<para>A blank directory will be created for each jail under
630
	  the <filename>/home/j</filename> directory.</para>
630
	  the <filename>/home/j</filename> directory.</para>
631
      </listitem>
631
      </listitem>
632
632
633
      <listitem>
633
      <listitem>
634
	<para>Each jail will have a <filename>/s</filename> directory
634
	<para>Each jail will have a <filename>/s</filename> directory
635
	  that will be linked to the read-write portion of the
635
	  that will be linked to the read-write portion of the
636
	  system.</para>
636
	  system.</para>
637
      </listitem>
637
      </listitem>
638
638
639
      <listitem>
639
      <listitem>
640
	<para>Each jail will have its own read-write system that is
640
	<para>Each jail will have its own read-write system that is
641
	  based upon <filename>/home/j/skel</filename>.</para>
641
	  based upon <filename>/home/j/skel</filename>.</para>
642
      </listitem>
642
      </listitem>
643
643
644
      <listitem>
644
      <listitem>
645
	<para>The read-write portion of each jail will be created in
645
	<para>The read-write portion of each jail will be created in
646
	  <filename>/home/js</filename>.</para>
646
	  <filename>/home/js</filename>.</para>
647
      </listitem>
647
      </listitem>
648
    </itemizedlist>
648
    </itemizedlist>
649
649
650
	<!-- Insert an image or drawing here to illustrate the example. -->
650
	<!-- Insert an image or drawing here to illustrate the example. -->
651
651
652
    <sect2 xml:id="jails-service-jails-template">
652
    <sect2 xml:id="jails-service-jails-template">
653
      <title>Creating the Template</title>
653
      <title>Creating the Template</title>
654
654
655
      <para>This section describes the steps needed to create the
655
      <para>This section describes the steps needed to create the
656
	master template.</para>
656
	master template.</para>
657
657
658
      <para>It is recommended to first update the host &os; system to
658
      <para>It is recommended to first update the host &os; system to
659
	the latest -RELEASE branch using the instructions in <xref
659
	the latest -RELEASE branch using the instructions in <xref
660
	  linkend="makeworld"/>.  Additionally, this template uses the
660
	  linkend="makeworld"/>.  Additionally, this template uses the
661
	<package>sysutils/cpdup</package> package or port and
661
	<package>sysutils/cpdup</package> package or port and
662
	<application>portsnap</application> will be used to download
662
	<application>portsnap</application> will be used to download
663
	the &os; Ports Collection.</para>
663
	the &os; Ports Collection.</para>
664
664
665
      <procedure>
665
      <procedure>
666
	<step>
666
	<step>
667
	  <para>First, create a directory structure for the read-only
667
	  <para>First, create a directory structure for the read-only
668
	    file system which will contain the &os; binaries for the
668
	    file system which will contain the &os; binaries for the
669
	    jails.  Then, change directory to the &os; source tree and
669
	    jails.  Then, change directory to the &os; source tree and
670
	    install the read-only file system to the jail
670
	    install the read-only file system to the jail
671
	    template:</para>
671
	    template:</para>
672
672
673
	  <screen>&prompt.root; <userinput>mkdir /home/j /home/j/mroot</userinput>
673
	  <screen>&prompt.root; <userinput>mkdir /home/j /home/j/mroot</userinput>
674
&prompt.root; <userinput>cd /usr/src</userinput>
674
&prompt.root; <userinput>cd /usr/src</userinput>
675
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot</userinput></screen>
675
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot</userinput></screen>
676
	</step>
676
	</step>
677
677
678
	<step>
678
	<step>
679
	  <para>Next, prepare a &os; Ports Collection for the jails as
679
	  <para>Next, prepare a &os; Ports Collection for the jails as
680
	    well as a &os; source tree, which is required for
680
	    well as a &os; source tree, which is required for
681
	    <application>mergemaster</application>:</para>
681
	    <application>mergemaster</application>:</para>
682
682
683
	  <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
683
	  <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
684
&prompt.root; <userinput>mkdir usr/ports</userinput>
684
&prompt.root; <userinput>mkdir usr/ports</userinput>
685
&prompt.root; <userinput>portsnap -p /home/j/mroot/usr/ports fetch extract</userinput>
685
&prompt.root; <userinput>portsnap -p /home/j/mroot/usr/ports fetch extract</userinput>
686
&prompt.root; <userinput>cpdup /usr/src /home/j/mroot/usr/src</userinput></screen>
686
&prompt.root; <userinput>cpdup /usr/src /home/j/mroot/usr/src</userinput></screen>
687
	</step>
687
	</step>
688
688
689
	<step>
689
	<step>
690
	  <para>Create a skeleton for the read-write portion of the
690
	  <para>Create a skeleton for the read-write portion of the
691
	    system:</para>
691
	    system:</para>
692
692
693
	  <screen>&prompt.root; <userinput>mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles</userinput>
693
	  <screen>&prompt.root; <userinput>mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles</userinput>
694
&prompt.root; <userinput>mv etc /home/j/skel</userinput>
694
&prompt.root; <userinput>mv etc /home/j/skel</userinput>
695
&prompt.root; <userinput>mv usr/local /home/j/skel/usr-local</userinput>
695
&prompt.root; <userinput>mv usr/local /home/j/skel/usr-local</userinput>
696
&prompt.root; <userinput>mv tmp /home/j/skel</userinput>
696
&prompt.root; <userinput>mv tmp /home/j/skel</userinput>
697
&prompt.root; <userinput>mv var /home/j/skel</userinput>
697
&prompt.root; <userinput>mv var /home/j/skel</userinput>
698
&prompt.root; <userinput>mv root /home/j/skel</userinput></screen>
698
&prompt.root; <userinput>mv root /home/j/skel</userinput></screen>
699
	</step>
699
	</step>
700
700
701
	<step>
701
	<step>
702
	  <para>Use <application>mergemaster</application> to install
702
	  <para>Use <application>mergemaster</application> to install
703
	    missing configuration files.  Then, remove the extra
703
	    missing configuration files.  Then, remove the extra
704
	    directories that <application>mergemaster</application>
704
	    directories that <application>mergemaster</application>
705
	    creates:</para>
705
	    creates:</para>
706
706
707
	  <screen>&prompt.root; <userinput>mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i</userinput>
707
	  <screen>&prompt.root; <userinput>mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i</userinput>
708
&prompt.root; <userinput>cd /home/j/skel</userinput>
708
&prompt.root; <userinput>cd /home/j/skel</userinput>
709
&prompt.root; <userinput>rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev</userinput></screen>
709
&prompt.root; <userinput>rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev</userinput></screen>
710
	</step>
710
	</step>
711
711
712
	<step>
712
	<step>
713
	  <para>Now, symlink the read-write file system to the
713
	  <para>Now, symlink the read-write file system to the
714
	    read-only file system.  Ensure that the symlinks are
714
	    read-only file system.  Ensure that the symlinks are
715
	    created in the correct <filename>s/</filename> locations
715
	    created in the correct <filename>s/</filename> locations
716
	    as the creation of directories in the wrong locations will
716
	    as the creation of directories in the wrong locations will
717
	    cause the installation to fail.</para>
717
	    cause the installation to fail.</para>
718
718
719
	  <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
719
	  <screen>&prompt.root; <userinput>cd /home/j/mroot</userinput>
720
&prompt.root; <userinput>mkdir s</userinput>
720
&prompt.root; <userinput>mkdir s</userinput>
721
&prompt.root; <userinput>ln -s s/etc etc</userinput>
721
&prompt.root; <userinput>ln -s s/etc etc</userinput>
722
&prompt.root; <userinput>ln -s s/home home</userinput>
722
&prompt.root; <userinput>ln -s s/home home</userinput>
723
&prompt.root; <userinput>ln -s s/root root</userinput>
723
&prompt.root; <userinput>ln -s s/root root</userinput>
724
&prompt.root; <userinput>ln -s s/usr-local usr/local</userinput>
724
&prompt.root; <userinput>ln -s s/usr-local usr/local</userinput>
725
&prompt.root; <userinput>ln -s s/usr-X11R6 usr/X11R6</userinput>
725
&prompt.root; <userinput>ln -s s/usr-X11R6 usr/X11R6</userinput>
726
&prompt.root; <userinput>ln -s s/distfiles usr/ports/distfiles</userinput>
726
&prompt.root; <userinput>ln -s s/distfiles usr/ports/distfiles</userinput>
727
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
727
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
728
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
728
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
729
	</step>
729
	</step>
730
730
731
	<step>
731
	<step>
732
	  <para>As a last step, create a generic
732
	  <para>As a last step, create a generic
733
	    <filename>/home/j/skel/etc/make.conf</filename> containing
733
	    <filename>/home/j/skel/etc/make.conf</filename> containing
734
	    this line:</para>
734
	    this line:</para>
735
735
736
	  <programlisting>WRKDIRPREFIX?=  /s/portbuild</programlisting>
736
	  <programlisting>WRKDIRPREFIX?=  /s/portbuild</programlisting>
737
737
738
	  <para>This makes it possible to compile &os; ports inside
738
	  <para>This makes it possible to compile &os; ports inside
739
	    each jail.  Remember that the ports directory is part of
739
	    each jail.  Remember that the ports directory is part of
740
	    the read-only system.  The custom path for
740
	    the read-only system.  The custom path for
741
	    <literal>WRKDIRPREFIX</literal> allows builds to be done
741
	    <literal>WRKDIRPREFIX</literal> allows builds to be done
742
	    in the read-write portion of every jail.</para>
742
	    in the read-write portion of every jail.</para>
743
	</step>
743
	</step>
744
      </procedure>
744
      </procedure>
745
    </sect2>
745
    </sect2>
746
746
747
    <sect2 xml:id="jails-service-jails-creating">
747
    <sect2 xml:id="jails-service-jails-creating">
748
      <title>Creating Jails</title>
748
      <title>Creating Jails</title>
749
749
750
      <para>The jail template can now be used to setup and configure
750
      <para>The jail template can now be used to setup and configure
751
	the jails in <filename>/etc/rc.conf</filename>.  This example
751
	the jails in <filename>/etc/rc.conf</filename>.  This example
752
	demonstrates the creation of 3 jails: <literal>NS</literal>,
752
	demonstrates the creation of 3 jails: <literal>NS</literal>,
753
	<literal>MAIL</literal> and <literal>WWW</literal>.</para>
753
	<literal>MAIL</literal> and <literal>WWW</literal>.</para>
754
754
755
      <procedure>
755
      <procedure>
756
	<step>
756
	<step>
757
	  <para>Add the following lines to
757
	  <para>Add the following lines to
758
	    <filename>/etc/fstab</filename>, so that the read-only
758
	    <filename>/etc/fstab</filename>, so that the read-only
759
	    template for the jails and the read-write space will be
759
	    template for the jails and the read-write space will be
760
	    available in the respective jails:</para>
760
	    available in the respective jails:</para>
761
761
762
	  <programlisting>/home/j/mroot   /home/j/ns     nullfs  ro  0   0
762
	  <programlisting>/home/j/mroot   /home/j/ns     nullfs  ro  0   0
763
/home/j/mroot   /home/j/mail   nullfs  ro  0   0
763
/home/j/mroot   /home/j/mail   nullfs  ro  0   0
764
/home/j/mroot   /home/j/www    nullfs  ro  0   0
764
/home/j/mroot   /home/j/www    nullfs  ro  0   0
765
/home/js/ns     /home/j/ns/s   nullfs  rw  0   0
765
/home/js/ns     /home/j/ns/s   nullfs  rw  0   0
766
/home/js/mail   /home/j/mail/s nullfs  rw  0   0
766
/home/js/mail   /home/j/mail/s nullfs  rw  0   0
767
/home/js/www    /home/j/www/s  nullfs  rw  0   0</programlisting>
767
/home/js/www    /home/j/www/s  nullfs  rw  0   0</programlisting>
768
768
769
	  <para>To prevent
769
	  <para>To prevent
770
	    <application>fsck</application> from checking
770
	    <application>fsck</application> from checking
771
	    <application>nullfs</application> mounts during boot and
771
	    <application>nullfs</application> mounts during boot and
772
	    <application>dump</application> from backing up the
772
	    <application>dump</application> from backing up the
773
	    read-only nullfs mounts of the jails, the last two
773
	    read-only nullfs mounts of the jails, the last two
774
	    columns are both set to <literal>0</literal>.</para>
774
	    columns are both set to <literal>0</literal>.</para>
775
	</step>
775
	</step>
776
776
777
	<step>
777
	<step>
778
	  <para>Configure the jails in
778
	  <para>Configure the jails in
779
	    <filename>/etc/rc.conf</filename>:</para>
779
	    <filename>/etc/rc.conf</filename>:</para>
780
780
781
	  <programlisting>jail_enable="YES"
781
	  <programlisting>jail_enable="YES"
782
jail_set_hostname_allow="NO"
782
jail_set_hostname_allow="NO"
783
jail_list="ns mail www"
783
jail_list="ns mail www"
784
jail_ns_hostname="ns.example.org"
784
jail_ns_hostname="ns.example.org"
785
jail_ns_ip="192.168.3.17"
785
jail_ns_ip="192.168.3.17"
786
jail_ns_rootdir="/usr/home/j/ns"
786
jail_ns_rootdir="/usr/home/j/ns"
787
jail_ns_devfs_enable="YES"
787
jail_ns_devfs_enable="YES"
788
jail_mail_hostname="mail.example.org"
788
jail_mail_hostname="mail.example.org"
789
jail_mail_ip="192.168.3.18"
789
jail_mail_ip="192.168.3.18"
790
jail_mail_rootdir="/usr/home/j/mail"
790
jail_mail_rootdir="/usr/home/j/mail"
791
jail_mail_devfs_enable="YES"
791
jail_mail_devfs_enable="YES"
792
jail_www_hostname="www.example.org"
792
jail_www_hostname="www.example.org"
793
jail_www_ip="62.123.43.14"
793
jail_www_ip="62.123.43.14"
794
jail_www_rootdir="/usr/home/j/www"
794
jail_www_rootdir="/usr/home/j/www"
795
jail_www_devfs_enable="YES"</programlisting>
795
jail_www_devfs_enable="YES"</programlisting>
796
796
797
	  <para>The
797
	  <para>The
798
	    <varname>jail_<replaceable>name</replaceable>_rootdir</varname>
798
	    <varname>jail_<replaceable>name</replaceable>_rootdir</varname>
799
	    variable is set to
799
	    variable is set to
800
	    <filename>/usr/home</filename> instead
800
	    <filename>/usr/home</filename> instead
801
	    of <filename>/home</filename> because
801
	    of <filename>/home</filename> because
802
	    the physical path of <filename
802
	    the physical path of <filename
803
	      >/home</filename> on a default &os;
803
	      >/home</filename> on a default &os;
804
	    installation is <filename
804
	    installation is <filename
805
	      >/usr/home</filename>.  The
805
	      >/usr/home</filename>.  The
806
	    <varname>jail_<replaceable>name</replaceable>_rootdir</varname>
806
	    <varname>jail_<replaceable>name</replaceable>_rootdir</varname>
807
	    variable must <emphasis>not</emphasis> be set to a path
807
	    variable must <emphasis>not</emphasis> be set to a path
808
	    which includes a symbolic link, otherwise the jails will
808
	    which includes a symbolic link, otherwise the jails will
809
	    refuse to start.</para>
809
	    refuse to start.</para>
810
	</step>
810
	</step>
811
811
812
	<step>
812
	<step>
813
	  <para>Create the required mount points for the read-only
813
	  <para>Create the required mount points for the read-only
814
	    file system of each jail:</para>
814
	    file system of each jail:</para>
815
815
816
	  <screen>&prompt.root; <userinput>mkdir /home/j/ns /home/j/mail /home/j/www</userinput></screen>
816
	  <screen>&prompt.root; <userinput>mkdir /home/j/ns /home/j/mail /home/j/www</userinput></screen>
817
	</step>
817
	</step>
818
818
819
	<step>
819
	<step>
820
	  <para>Install the read-write template into each jail using
820
	  <para>Install the read-write template into each jail using
821
	    <package>sysutils/cpdup</package>:</para>
821
	    <package>sysutils/cpdup</package>:</para>
822
	    <!-- keramida: Why is cpdup required here?  Doesn't cpio(1)
822
	    <!-- keramida: Why is cpdup required here?  Doesn't cpio(1)
823
	     already include adequate functionality for performing this
823
	     already include adequate functionality for performing this
824
	     job *and* have the advantage of being part of the base
824
	     job *and* have the advantage of being part of the base
825
	     system of FreeBSD? -->
825
	     system of FreeBSD? -->
826
826
827
	  <screen>&prompt.root; <userinput>mkdir /home/js</userinput>
827
	  <screen>&prompt.root; <userinput>mkdir /home/js</userinput>
828
&prompt.root; <userinput>cpdup /home/j/skel /home/js/ns</userinput>
828
&prompt.root; <userinput>cpdup /home/j/skel /home/js/ns</userinput>
829
&prompt.root; <userinput>cpdup /home/j/skel /home/js/mail</userinput>
829
&prompt.root; <userinput>cpdup /home/j/skel /home/js/mail</userinput>
830
&prompt.root; <userinput>cpdup /home/j/skel /home/js/www</userinput></screen>
830
&prompt.root; <userinput>cpdup /home/j/skel /home/js/www</userinput></screen>
831
	</step>
831
	</step>
832
832
833
	<step>
833
	<step>
834
	  <para>In this phase, the jails are built and prepared to
834
	  <para>In this phase, the jails are built and prepared to
835
	    run.  First, mount the required file systems for each
835
	    run.  First, mount the required file systems for each
836
	    jail, and then start them:</para>
836
	    jail, and then start them:</para>
837
837
838
	  <screen>&prompt.root; <userinput>mount -a</userinput>
838
	  <screen>&prompt.root; <userinput>mount -a</userinput>
839
&prompt.root; <userinput>service jail start</userinput></screen>
839
&prompt.root; <userinput>service jail start</userinput></screen>
840
	</step>
840
	</step>
841
      </procedure>
841
      </procedure>
842
842
843
      <para>The jails should be running now.  To check if they have
843
      <para>The jails should be running now.  To check if they have
844
	started correctly, use <command>jls</command>.  Its output
844
	started correctly, use <command>jls</command>.  Its output
845
	should be similar to the following:</para>
845
	should be similar to the following:</para>
846
846
847
      <screen>&prompt.root; <userinput>jls</userinput>
847
      <screen>&prompt.root; <userinput>jls</userinput>
848
   JID  IP Address      Hostname                      Path
848
   JID  IP Address      Hostname                      Path
849
     3  192.168.3.17    ns.example.org                /home/j/ns
849
     3  192.168.3.17    ns.example.org                /home/j/ns
850
     2  192.168.3.18    mail.example.org              /home/j/mail
850
     2  192.168.3.18    mail.example.org              /home/j/mail
851
     1  62.123.43.14    www.example.org               /home/j/www</screen>
851
     1  62.123.43.14    www.example.org               /home/j/www</screen>
852
852
853
      <para>At this point, it should be possible to log onto each
853
      <para>At this point, it should be possible to log onto each
854
	jail, add new users, or configure daemons.  The
854
	jail, add new users, or configure daemons.  The
855
	<literal>JID</literal> column indicates the jail
855
	<literal>JID</literal> column indicates the jail
856
	identification number of each running jail.  Use the following
856
	identification number of each running jail.  Use the following
857
	command to perform administrative tasks in the jail whose
857
	command to perform administrative tasks in the jail whose
858
	<acronym>JID</acronym> is <literal>3</literal>:</para>
858
	<acronym>JID</acronym> is <literal>3</literal>:</para>
859
859
860
      <screen>&prompt.root; <userinput>jexec 3 tcsh</userinput></screen>
860
      <screen>&prompt.root; <userinput>jexec 3 tcsh</userinput></screen>
861
    </sect2>
861
    </sect2>
862
862
863
    <sect2 xml:id="jails-service-jails-upgrading">
863
    <sect2 xml:id="jails-service-jails-upgrading">
864
      <title>Upgrading</title>
864
      <title>Upgrading</title>
865
865
866
      <para>The design of this setup provides an easy way to upgrade
866
      <para>The design of this setup provides an easy way to upgrade
867
	existing jails while minimizing their downtime.  Also, it
867
	existing jails while minimizing their downtime.  Also, it
868
	provides a way to roll back to the older version should a
868
	provides a way to roll back to the older version should a
869
	problem occur.</para>
869
	problem occur.</para>
870
870
871
      <procedure>
871
      <procedure>
872
	<step>
872
	<step>
873
	  <para>The first step is to upgrade the host system.  Then,
873
	  <para>The first step is to upgrade the host system.  Then,
874
	    create a new temporary read-only template in
874
	    create a new temporary read-only template in
875
	    <filename>/home/j/mroot2</filename>.</para>
875
	    <filename>/home/j/mroot2</filename>.</para>
876
876
877
	  <screen>&prompt.root; <userinput>mkdir /home/j/mroot2</userinput>
877
	  <screen>&prompt.root; <userinput>mkdir /home/j/mroot2</userinput>
878
&prompt.root; <userinput>cd /usr/src</userinput>
878
&prompt.root; <userinput>cd /usr/src</userinput>
879
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot2</userinput>
879
&prompt.root; <userinput>make installworld DESTDIR=/home/j/mroot2</userinput>
880
&prompt.root; <userinput>cd /home/j/mroot2</userinput>
880
&prompt.root; <userinput>cd /home/j/mroot2</userinput>
881
&prompt.root; <userinput>cpdup /usr/src usr/src</userinput>
881
&prompt.root; <userinput>cpdup /usr/src usr/src</userinput>
882
&prompt.root; <userinput>mkdir s</userinput></screen>
882
&prompt.root; <userinput>mkdir s</userinput></screen>
883
883
884
	  <para>The <buildtarget>installworld</buildtarget> creates a
884
	  <para>The <buildtarget>installworld</buildtarget> creates a
885
	    few unnecessary directories, which should be
885
	    few unnecessary directories, which should be
886
	    removed:</para>
886
	    removed:</para>
887
887
888
	  <screen>&prompt.root; <userinput>chflags -R 0 var</userinput>
888
	  <screen>&prompt.root; <userinput>chflags -R 0 var</userinput>
889
&prompt.root; <userinput>rm -R etc var root usr/local tmp</userinput></screen>
889
&prompt.root; <userinput>rm -R etc var root usr/local tmp</userinput></screen>
890
	</step>
890
	</step>
891
891
892
	<step>
892
	<step>
893
	  <para>Recreate the read-write symlinks for the master file
893
	  <para>Recreate the read-write symlinks for the master file
894
	    system:</para>
894
	    system:</para>
895
895
896
	  <screen>&prompt.root; <userinput>ln -s s/etc etc</userinput>
896
	  <screen>&prompt.root; <userinput>ln -s s/etc etc</userinput>
897
&prompt.root; <userinput>ln -s s/root root</userinput>
897
&prompt.root; <userinput>ln -s s/root root</userinput>
898
&prompt.root; <userinput>ln -s s/home home</userinput>
898
&prompt.root; <userinput>ln -s s/home home</userinput>
899
&prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput>
899
&prompt.root; <userinput>ln -s ../s/usr-local usr/local</userinput>
900
&prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput>
900
&prompt.root; <userinput>ln -s ../s/usr-X11R6 usr/X11R6</userinput>
901
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
901
&prompt.root; <userinput>ln -s s/tmp tmp</userinput>
902
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
902
&prompt.root; <userinput>ln -s s/var var</userinput></screen>
903
	</step>
903
	</step>
904
904
905
	<step>
905
	<step>
906
	  <para>Next, stop the jails:</para>
906
	  <para>Next, stop the jails:</para>
907
907
908
	  <screen>&prompt.root; <userinput>service jail stop</userinput></screen>
908
	  <screen>&prompt.root; <userinput>service jail stop</userinput></screen>
909
	</step>
909
	</step>
910
910
911
	<step>
911
	<step>
912
	  <para>Unmount the original file systems as the read-write
912
	  <para>Unmount the original file systems as the read-write
913
	    systems are attached to the read-only system
913
	    systems are attached to the read-only system
914
	    (<filename>/s</filename>):</para>
914
	    (<filename>/s</filename>):</para>
915
	    <!-- keramida: Shouldn't we suggest a short script-based
915
	    <!-- keramida: Shouldn't we suggest a short script-based
916
	     loop here, instead of tediously copying the same commands
916
	     loop here, instead of tediously copying the same commands
917
	     multiple times? -->
917
	     multiple times? -->
918
918
919
	  <screen>&prompt.root; <userinput>umount /home/j/ns/s</userinput>
919
	  <screen>&prompt.root; <userinput>umount /home/j/ns/s</userinput>
920
&prompt.root; <userinput>umount /home/j/ns</userinput>
920
&prompt.root; <userinput>umount /home/j/ns</userinput>
921
&prompt.root; <userinput>umount /home/j/mail/s</userinput>
921
&prompt.root; <userinput>umount /home/j/mail/s</userinput>
922
&prompt.root; <userinput>umount /home/j/mail</userinput>
922
&prompt.root; <userinput>umount /home/j/mail</userinput>
923
&prompt.root; <userinput>umount /home/j/www/s</userinput>
923
&prompt.root; <userinput>umount /home/j/www/s</userinput>
924
&prompt.root; <userinput>umount /home/j/www</userinput></screen>
924
&prompt.root; <userinput>umount /home/j/www</userinput></screen>
925
	</step>
925
	</step>
926
926
927
	<step>
927
	<step>
928
	  <para>Move the old read-only file system and replace it with
928
	  <para>Move the old read-only file system and replace it with
929
	    the new one.  This will serve as a backup and archive of
929
	    the new one.  This will serve as a backup and archive of
930
	    the old read-only file system should something go wrong.
930
	    the old read-only file system should something go wrong.
931
	    The naming convention used here corresponds to when a new
931
	    The naming convention used here corresponds to when a new
932
	    read-only file system has been created.  Move the original
932
	    read-only file system has been created.  Move the original
933
	    &os; Ports Collection over to the new file system to save
933
	    &os; Ports Collection over to the new file system to save
934
	    some space and inodes:</para>
934
	    some space and inodes:</para>
935
935
936
	  <screen>&prompt.root; <userinput>cd /home/j</userinput>
936
	  <screen>&prompt.root; <userinput>cd /home/j</userinput>
937
&prompt.root; <userinput>mv mroot mroot.20060601</userinput>
937
&prompt.root; <userinput>mv mroot mroot.20060601</userinput>
938
&prompt.root; <userinput>mv mroot2 mroot</userinput>
938
&prompt.root; <userinput>mv mroot2 mroot</userinput>
939
&prompt.root; <userinput>mv mroot.20060601/usr/ports mroot/usr</userinput></screen>
939
&prompt.root; <userinput>mv mroot.20060601/usr/ports mroot/usr</userinput></screen>
940
	</step>
940
	</step>
941
941
942
	<step>
942
	<step>
943
	  <para>At this point the new read-only template is ready, so
943
	  <para>At this point the new read-only template is ready, so
944
	    the only remaining task is to remount the file systems and
944
	    the only remaining task is to remount the file systems and
945
	    start the jails:</para>
945
	    start the jails:</para>
946
946
947
	  <screen>&prompt.root; <userinput>mount -a</userinput>
947
	  <screen>&prompt.root; <userinput>mount -a</userinput>
948
&prompt.root; <userinput>service jail start</userinput></screen>
948
&prompt.root; <userinput>service jail start</userinput></screen>
949
	</step>
949
	</step>
950
      </procedure>
950
      </procedure>
951
951
952
      <para>Use <command>jls</command> to check if the jails started
952
      <para>Use <command>jls</command> to check if the jails started
953
	correctly.  Run <command>mergemaster</command> in each jail to
953
	correctly.  Run <command>mergemaster</command> in each jail to
954
	update the configuration files.</para>
954
	update the configuration files.</para>
955
    </sect2>
955
    </sect2>
956
  </sect1>
956
  </sect1>
957
957
958
  <sect1 xml:id="jails-ezjail">
958
  <sect1 xml:id="jails-ezjail">
959
    <info>
959
    <info>
960
      <title>Managing Jails with
960
      <title>Managing Jails with
961
	<application>ezjail</application></title>
961
	<application>ezjail</application></title>
962
962
963
      <authorgroup>
963
      <authorgroup>
964
	<author>
964
	<author>
965
	  <personname>
965
	  <personname>
966
	    <firstname>Warren</firstname>
966
	    <firstname>Warren</firstname>
967
	    <surname>Block</surname>
967
	    <surname>Block</surname>
968
	  </personname><contrib>Originally contributed by </contrib>
968
	  </personname><contrib>Originally contributed by </contrib>
969
	</author>
969
	</author>
970
      </authorgroup>
970
      </authorgroup>
971
    </info>
971
    </info>
972
972
973
    <para>Creating and managing multiple jails can quickly become
973
    <para>Creating and managing multiple jails can quickly become
974
      tedious and error-prone.  Dirk Engling's
974
      tedious and error-prone.  Dirk Engling's
975
      <application>ezjail</application> automates and greatly
975
      <application>ezjail</application> automates and greatly
976
      simplifies many jail tasks.  A <emphasis>basejail</emphasis> is
976
      simplifies many jail tasks.  A <emphasis>basejail</emphasis> is
977
      created as a template.  Additional jails use
977
      created as a template.  Additional jails use
978
      &man.mount.nullfs.8; to share many of the basejail directories
978
      &man.mount.nullfs.8; to share many of the basejail directories
979
      without using additional disk space.  Each additional jail takes
979
      without using additional disk space.  Each additional jail takes
980
      only a few megabytes of disk space before applications are
980
      only a few megabytes of disk space before applications are
981
      installed.  Upgrading the copy of the userland in the basejail
981
      installed.  Upgrading the copy of the userland in the basejail
982
      automatically upgrades all of the other jails.</para>
982
      automatically upgrades all of the other jails.</para>
983
983
984
    <para>Additional benefits and features are described in detail on
984
    <para>Additional benefits and features are described in detail on
985
      the <application>ezjail</application> web site, <link
985
      the <application>ezjail</application> web site, <link
986
	xlink:href="https://erdgeist.org/arts/software/ezjail/"></link>.</para>
986
	xlink:href="https://erdgeist.org/arts/software/ezjail/"></link>.</para>
987
987
988
    <sect2 xml:id="jails-ezjail-install">
988
    <sect2 xml:id="jails-ezjail-install">
989
      <title>Installing <application>ezjail</application></title>
989
      <title>Installing <application>ezjail</application></title>
990
990
991
      <para>Installing <application>ezjail</application> consists of
991
      <para>Installing <application>ezjail</application> consists of
992
	adding a loopback interface for use in jails, installing the
992
	adding a loopback interface for use in jails, installing the
993
	port or package, and enabling the service.</para>
993
	port or package, and enabling the service.</para>
994
994
995
      <procedure xml:id="jails-ezjail-install-procedure">
995
      <procedure xml:id="jails-ezjail-install-procedure">
996
	<step>
996
	<step>
997
	  <para>To keep jail loopback traffic off the host's loopback
997
	  <para>To keep jail loopback traffic off the host's loopback
998
	    network interface <literal>lo0</literal>, a second
998
	    network interface <literal>lo0</literal>, a second
999
	    loopback interface is created by adding an entry to
999
	    loopback interface is created by adding an entry to
1000
	    <filename>/etc/rc.conf</filename>:</para>
1000
	    <filename>/etc/rc.conf</filename>:</para>
1001
1001
1002
	  <programlisting>cloned_interfaces="lo1"</programlisting>
1002
	  <programlisting>cloned_interfaces="lo1"</programlisting>
1003
1003
1004
	  <para>The second loopback interface <literal>lo1</literal>
1004
	  <para>The second loopback interface <literal>lo1</literal>
1005
	    will be created when the system starts.  It can also be
1005
	    will be created when the system starts.  It can also be
1006
	    created manually without a restart:</para>
1006
	    created manually without a restart:</para>
1007
1007
1008
	  <screen>&prompt.root; <userinput>service netif cloneup</userinput>
1008
	  <screen>&prompt.root; <userinput>service netif cloneup</userinput>
1009
Created clone interfaces: lo1.</screen>
1009
Created clone interfaces: lo1.</screen>
1010
1010
1011
	  <para>Jails can be allowed to use aliases of this secondary
1011
	  <para>Jails can be allowed to use aliases of this secondary
1012
	    loopback interface without interfering with the
1012
	    loopback interface without interfering with the
1013
	    host.</para>
1013
	    host.</para>
1014
1014
1015
	  <para>Inside a jail, access to the loopback address
1015
	  <para>Inside a jail, access to the loopback address
1016
	    <systemitem class="ipaddress">127.0.0.1</systemitem> is
1016
	    <systemitem class="ipaddress">127.0.0.1</systemitem> is
1017
	    redirected to the first <acronym>IP</acronym> address
1017
	    redirected to the first <acronym>IP</acronym> address
1018
	    assigned to the jail.  To make the jail loopback
1018
	    assigned to the jail.  To make the jail loopback
1019
	    correspond with the new <literal>lo1</literal> interface,
1019
	    correspond with the new <literal>lo1</literal> interface,
1020
	    that interface must be specified first in the list of
1020
	    that interface must be specified first in the list of
1021
	    interfaces and <acronym>IP</acronym> addresses given when
1021
	    interfaces and <acronym>IP</acronym> addresses given when
1022
	    creating a new jail.</para>
1022
	    creating a new jail.</para>
1023
1023
1024
	  <para>Give each jail a unique loopback address in the
1024
	  <para>Give each jail a unique loopback address in the
1025
	    <systemitem
1025
	    <systemitem
1026
	      class="ipaddress">127.0.0.0</systemitem><systemitem
1026
	      class="ipaddress">127.0.0.0</systemitem><systemitem
1027
	      class="netmask">/8</systemitem> netblock.</para>
1027
	      class="netmask">/8</systemitem> netblock.</para>
1028
	</step>
1028
	</step>
1029
1029
1030
	<step>
1030
	<step>
1031
	  <para>Install
1031
	  <para>Install
1032
	    <package role="port">sysutils/ezjail</package>:</para>
1032
	    <package role="port">sysutils/ezjail</package>:</para>
1033
1033
1034
	  <screen>&prompt.root; <userinput>cd /usr/ports/sysutils/ezjail</userinput>
1034
	  <screen>&prompt.root; <userinput>cd /usr/ports/sysutils/ezjail</userinput>
1035
&prompt.root; <userinput>make install clean</userinput></screen>
1035
&prompt.root; <userinput>make install clean</userinput></screen>
1036
	</step>
1036
	</step>
1037
1037
1038
	<step>
1038
	<step>
1039
	  <para>Enable <application>ezjail</application> by adding
1039
	  <para>Enable <application>ezjail</application> by adding
1040
	    this line to <filename>/etc/rc.conf</filename>:</para>
1040
	    this line to <filename>/etc/rc.conf</filename>:</para>
1041
1041
1042
	  <programlisting>ezjail_enable="YES"</programlisting>
1042
	  <programlisting>ezjail_enable="YES"</programlisting>
1043
	</step>
1043
	</step>
1044
1044
1045
	<step>
1045
	<step>
1046
	  <para>The service will automatically start on system boot.
1046
	  <para>The service will automatically start on system boot.
1047
	    It can be started immediately for the current
1047
	    It can be started immediately for the current
1048
	    session:</para>
1048
	    session:</para>
1049
1049
1050
	  <screen>&prompt.root; <userinput>service ezjail start</userinput></screen>
1050
	  <screen>&prompt.root; <userinput>service ezjail start</userinput></screen>
1051
	</step>
1051
	</step>
1052
      </procedure>
1052
      </procedure>
1053
    </sect2>
1053
    </sect2>
1054
1054
1055
    <sect2 xml:id="jails-ezjail-initialsetup">
1055
    <sect2 xml:id="jails-ezjail-initialsetup">
1056
      <title>Initial Setup</title>
1056
      <title>Initial Setup</title>
1057
1057
1058
      <para>With <application>ezjail</application> installed, the
1058
      <para>With <application>ezjail</application> installed, the
1059
	basejail directory structure can be created and populated.
1059
	basejail directory structure can be created and populated.
1060
	This step is only needed once on the jail host
1060
	This step is only needed once on the jail host
1061
	computer.</para>
1061
	computer.</para>
1062
1062
1063
      <para>In both of these examples, <option>-p</option> causes the
1063
      <para>In both of these examples, <option>-p</option> causes the
1064
	ports tree to be retrieved with &man.portsnap.8; into the
1064
	ports tree to be retrieved with &man.portsnap.8; into the
1065
	basejail.  That single copy of the ports directory will be
1065
	basejail.  That single copy of the ports directory will be
1066
	shared by all the jails.  Using a separate copy of the ports
1066
	shared by all the jails.  Using a separate copy of the ports
1067
	directory for jails isolates them from the host.  The
1067
	directory for jails isolates them from the host.  The
1068
	<application>ezjail</application> <acronym>FAQ</acronym>
1068
	<application>ezjail</application> <acronym>FAQ</acronym>
1069
	explains in more detail: <link
1069
	explains in more detail: <link
1070
	  xlink:href="http://erdgeist.org/arts/software/ezjail/#FAQ"></link>.</para>
1070
	  xlink:href="http://erdgeist.org/arts/software/ezjail/#FAQ"></link>.</para>
1071
1071
1072
      <procedure xml:id="jails-ezjail-initialsetup-procedure">
1072
      <procedure xml:id="jails-ezjail-initialsetup-procedure">
1073
	<step>
1073
	<step>
1074
	  <stepalternatives>
1074
	  <stepalternatives>
1075
	    <step>
1075
	    <step>
1076
	      <title>To Populate the Jail with &os;-RELEASE</title>
1076
	      <title>To Populate the Jail with &os;-RELEASE</title>
1077
1077
1078
	      <para>For a basejail based on the &os; RELEASE matching
1078
	      <para>For a basejail based on the &os; RELEASE matching
1079
		that of the host computer, use
1079
		that of the host computer, use
1080
		<command>install</command>.  For example, on a host
1080
		<command>install</command>.  For example, on a host
1081
		computer running &os;&nbsp;10-STABLE, the latest
1081
		computer running &os;&nbsp;10-STABLE, the latest
1082
		RELEASE version of &os;&nbsp;-10 will be installed in
1082
		RELEASE version of &os;&nbsp;-10 will be installed in
1083
		the jail):</para>
1083
		the jail):</para>
1084
1084
1085
	      <screen>&prompt.root; <userinput>ezjail-admin install -p</userinput></screen>
1085
	      <screen>&prompt.root; <userinput>ezjail-admin install -p</userinput></screen>
1086
	    </step>
1086
	    </step>
1087
1087
1088
	    <step>
1088
	    <step>
1089
	      <title>To Populate the Jail with
1089
	      <title>To Populate the Jail with
1090
		<command>installworld</command></title>
1090
		<command>installworld</command></title>
1091
1091
1092
	      <para>The basejail can be installed from binaries
1092
	      <para>The basejail can be installed from binaries
1093
		created by <buildtarget>buildworld</buildtarget> on
1093
		created by <buildtarget>buildworld</buildtarget> on
1094
		the host with
1094
		the host with
1095
		<command>ezjail-admin update</command>.</para>
1095
		<command>ezjail-admin update</command>.</para>
1096
1096
1097
	      <para>In this example, &os;&nbsp;10-STABLE has been
1097
	      <para>In this example, &os;&nbsp;10-STABLE has been
1098
		built from source.  The jail directories are created.
1098
		built from source.  The jail directories are created.
1099
		Then <buildtarget>installworld</buildtarget> is
1099
		Then <buildtarget>installworld</buildtarget> is
1100
		executed, installing the host's
1100
		executed, installing the host's
1101
		<filename>/usr/obj</filename> into the
1101
		<filename>/usr/obj</filename> into the
1102
		basejail.</para>
1102
		basejail.</para>
1103
1103
1104
	      <screen>&prompt.root; <userinput>ezjail-admin update -i -p</userinput></screen>
1104
	      <screen>&prompt.root; <userinput>ezjail-admin update -i -p</userinput></screen>
1105
1105
1106
	      <para>The host's <filename>/usr/src</filename> is used
1106
	      <para>The host's <filename>/usr/src</filename> is used
1107
		by default.  A different source directory on the host
1107
		by default.  A different source directory on the host
1108
		can be specified with <option>-s</option> and a path,
1108
		can be specified with <option>-s</option> and a path,
1109
		or set with <varname>ezjail_sourcetree</varname> in
1109
		or set with <varname>ezjail_sourcetree</varname> in
1110
		<filename>/usr/local/etc/ezjail.conf</filename>.</para>
1110
		<filename>/usr/local/etc/ezjail.conf</filename>.</para>
1111
	    </step>
1111
	    </step>
1112
	  </stepalternatives>
1112
	  </stepalternatives>
1113
	</step>
1113
	</step>
1114
      </procedure>
1114
      </procedure>
1115
1115
1116
      <tip>
1116
      <tip>
1117
	<para>The basejail's ports tree is shared by other jails.
1117
	<para>The basejail's ports tree is shared by other jails.
1118
	  However, downloaded distfiles are stored in the jail that
1118
	  However, downloaded distfiles are stored in the jail that
1119
	  downloaded them.  By default, these files are stored in
1119
	  downloaded them.  By default, these files are stored in
1120
	  <filename>/var/ports/distfiles</filename> within each
1120
	  <filename>/var/ports/distfiles</filename> within each
1121
	  jail.  <filename>/var/ports</filename> inside each jail is
1121
	  jail.  <filename>/var/ports</filename> inside each jail is
1122
	  also used as a work directory when building ports.</para>
1122
	  also used as a work directory when building ports.</para>
1123
      </tip>
1123
      </tip>
1124
    </sect2>
1124
    </sect2>
1125
1125
1126
    <sect2 xml:id="jails-ezjail-create">
1126
    <sect2 xml:id="jails-ezjail-create">
1127
      <title>Creating and Starting a New Jail</title>
1127
      <title>Creating and Starting a New Jail</title>
1128
1128
1129
      <para>New jails are created with
1129
      <para>New jails are created with
1130
	<command>ezjail-admin create</command>.  In these examples,
1130
	<command>ezjail-admin create</command>.  In these examples,
1131
	the <literal>lo1</literal> loopback interface is used as
1131
	the <literal>lo1</literal> loopback interface is used as
1132
	described above.</para>
1132
	described above.</para>
1133
1133
1134
      <procedure xml:id="jails-ezjail-create-steps">
1134
      <procedure xml:id="jails-ezjail-create-steps">
1135
	<title>Create and Start a New Jail</title>
1135
	<title>Create and Start a New Jail</title>
1136
1136
1137
	<step>
1137
	<step>
1138
	  <para>Create the jail, specifying a name and the loopback
1138
	  <para>Create the jail, specifying a name and the loopback
1139
	    and network interfaces to use, along with their
1139
	    and network interfaces to use, along with their
1140
	    <acronym>IP</acronym> addresses.  In this example, the
1140
	    <acronym>IP</acronym> addresses.  In this example, the
1141
	    jail is named <literal>dnsjail</literal>.</para>
1141
	    jail is named <literal>dnsjail</literal>.</para>
1142
1142
1143
	  <screen>&prompt.root; <userinput>ezjail-admin create <replaceable>dnsjail</replaceable> '<replaceable>lo1|127.0.1.1</replaceable>,<replaceable>em0</replaceable>|<replaceable>192.168.1.50</replaceable>'</userinput></screen>
1143
	  <screen>&prompt.root; <userinput>ezjail-admin create <replaceable>dnsjail</replaceable> '<replaceable>lo1|127.0.1.1</replaceable>,<replaceable>em0</replaceable>|<replaceable>192.168.1.50</replaceable>'</userinput></screen>
1144
1144
1145
	  <tip xml:id="jails-ezjail-raw-network-sockets">
1145
	  <tip xml:id="jails-ezjail-raw-network-sockets">
1146
	    <para>Most network services run in jails without
1146
	    <para>Most network services run in jails without
1147
	      problems.  A few network services, most notably
1147
	      problems.  A few network services, most notably
1148
	      &man.ping.8;, use
1148
	      &man.ping.8;, use
1149
	      <emphasis>raw network sockets</emphasis>.  In jails, raw
1149
	      <emphasis>raw network sockets</emphasis>.  In jails, raw
1150
	      network sockets are disabled by default for security.
1150
	      network sockets are disabled by default for security.
1151
	      Services that require them will not work.</para>
1151
	      Services that require them will not work.</para>
1152
1152
1153
	    <para>Occasionally, a jail genuinely needs raw sockets.
1153
	    <para>Occasionally, a jail genuinely needs raw sockets.
1154
	      For example, network monitoring applications often use
1154
	      For example, network monitoring applications often use
1155
	      &man.ping.8; to check the availability of other
1155
	      &man.ping.8; to check the availability of other
1156
	      computers.  When raw network sockets are actually needed
1156
	      computers.  When raw network sockets are actually needed
1157
	      in a jail, they can be enabled by editing the
1157
	      in a jail, they can be enabled by editing the
1158
	      <application>ezjail</application>
1158
	      <application>ezjail</application>
1159
	      configuration file for the individual jail,
1159
	      configuration file for the individual jail,
1160
	      <filename>/usr/local/etc/ezjail/<replaceable>jailname</replaceable></filename>.
1160
	      <filename>/usr/local/etc/ezjail/<replaceable>jailname</replaceable></filename>.
1161
	      Modify the <literal>parameters</literal>
1161
	      Modify the <literal>parameters</literal>
1162
	      entry:</para>
1162
	      entry:</para>
1163
1163
1164
	    <programlisting>export jail_<replaceable>jailname</replaceable>_parameters="allow.raw_sockets=1"</programlisting>
1164
	    <programlisting>export jail_<replaceable>jailname</replaceable>_parameters="allow.raw_sockets=1"</programlisting>
1165
1165
1166
	    <para>Do not enable raw network sockets unless services in
1166
	    <para>Do not enable raw network sockets unless services in
1167
	      the jail actually require them.</para>
1167
	      the jail actually require them.</para>
1168
	  </tip>
1168
	  </tip>
1169
	</step>
1169
	</step>
1170
1170
1171
	<step>
1171
	<step>
1172
	  <para>Start the jail:</para>
1172
	  <para>Start the jail:</para>
1173
1173
1174
	  <screen>&prompt.root; <userinput>ezjail-admin start <replaceable>dnsjail</replaceable></userinput></screen>
1174
	  <screen>&prompt.root; <userinput>ezjail-admin start <replaceable>dnsjail</replaceable></userinput></screen>
1175
	</step>
1175
	</step>
1176
1176
1177
	<step>
1177
	<step>
1178
	  <para>Use a console on the jail:</para>
1178
	  <para>Use a console on the jail:</para>
1179
1179
1180
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>dnsjail</replaceable></userinput></screen>
1180
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>dnsjail</replaceable></userinput></screen>
1181
	</step>
1181
	</step>
1182
      </procedure>
1182
      </procedure>
1183
1183
1184
      <para>The jail is operating and additional configuration can be
1184
      <para>The jail is operating and additional configuration can be
1185
	completed.  Typical settings added at this point
1185
	completed.  Typical settings added at this point
1186
	include:</para>
1186
	include:</para>
1187
1187
1188
      <procedure>
1188
      <procedure>
1189
	<step>
1189
	<step>
1190
	  <title>Set the
1190
	  <title>Set the
1191
	    <systemitem class="username">root</systemitem>
1191
	    <systemitem class="username">root</systemitem>
1192
	    Password</title>
1192
	    Password</title>
1193
1193
1194
	  <para>Connect to the jail and set the
1194
	  <para>Connect to the jail and set the
1195
	    <systemitem class="username">root</systemitem> user's
1195
	    <systemitem class="username">root</systemitem> user's
1196
	    password:</para>
1196
	    password:</para>
1197
1197
1198
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>dnsjail</replaceable></userinput>
1198
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>dnsjail</replaceable></userinput>
1199
&prompt.root; <userinput>passwd</userinput>
1199
&prompt.root; <userinput>passwd</userinput>
1200
Changing local password for root
1200
Changing local password for root
1201
New Password:
1201
New Password:
1202
Retype New Password:</screen>
1202
Retype New Password:</screen>
1203
	</step>
1203
	</step>
1204
1204
1205
	<step>
1205
	<step>
1206
	  <title>Time Zone Configuration</title>
1206
	  <title>Time Zone Configuration</title>
1207
1207
1208
	  <para>The jail's time zone can be set with &man.tzsetup.8;.
1208
	  <para>The jail's time zone can be set with &man.tzsetup.8;.
1209
	    To avoid spurious error messages, the &man.adjkerntz.8;
1209
	    To avoid spurious error messages, the &man.adjkerntz.8;
1210
	    entry in <filename>/etc/crontab</filename> can be
1210
	    entry in <filename>/etc/crontab</filename> can be
1211
	    commented or removed.  This job attempts to update the
1211
	    commented or removed.  This job attempts to update the
1212
	    computer's hardware clock with time zone changes, but
1212
	    computer's hardware clock with time zone changes, but
1213
	    jails are not allowed to access that hardware.</para>
1213
	    jails are not allowed to access that hardware.</para>
1214
	</step>
1214
	</step>
1215
1215
1216
	<step>
1216
	<step>
1217
	  <title><acronym>DNS</acronym> Servers</title>
1217
	  <title><acronym>DNS</acronym> Servers</title>
1218
1218
1219
	  <para>Enter domain name server lines in
1219
	  <para>Enter domain name server lines in
1220
	    <filename>/etc/resolv.conf</filename> so
1220
	    <filename>/etc/resolv.conf</filename> so
1221
	    <acronym>DNS</acronym> works in the jail.</para>
1221
	    <acronym>DNS</acronym> works in the jail.</para>
1222
	</step>
1222
	</step>
1223
1223
1224
	<step>
1224
	<step>
1225
	  <title>Edit <filename>/etc/hosts</filename></title>
1225
	  <title>Edit <filename>/etc/hosts</filename></title>
1226
1226
1227
	  <para>Change the address and add the jail name to the
1227
	  <para>Change the address and add the jail name to the
1228
	    <literal>localhost</literal> entries in
1228
	    <literal>localhost</literal> entries in
1229
	    <filename>/etc/hosts</filename>.</para>
1229
	    <filename>/etc/hosts</filename>.</para>
1230
	</step>
1230
	</step>
1231
1231
1232
	<step>
1232
	<step>
1233
	  <title>Configure <filename>/etc/rc.conf</filename></title>
1233
	  <title>Configure <filename>/etc/rc.conf</filename></title>
1234
1234
1235
	  <para>Enter configuration settings in
1235
	  <para>Enter configuration settings in
1236
	    <filename>/etc/rc.conf</filename>.  This is much like
1236
	    <filename>/etc/rc.conf</filename>.  This is much like
1237
	    configuring a full computer.  The host name and
1237
	    configuring a full computer.  The host name and
1238
	    <acronym>IP</acronym> address are not set here.  Those
1238
	    <acronym>IP</acronym> address are not set here.  Those
1239
	    values are already provided by the jail
1239
	    values are already provided by the jail
1240
	    configuration.</para>
1240
	    configuration.</para>
1241
	</step>
1241
	</step>
1242
      </procedure>
1242
      </procedure>
1243
1243
1244
      <para>With the jail configured, the applications for which the
1244
      <para>With the jail configured, the applications for which the
1245
	jail was created can be installed.</para>
1245
	jail was created can be installed.</para>
1246
1246
1247
      <tip>
1247
      <tip>
1248
	<para>Some ports must be built with special options to be used
1248
	<para>Some ports must be built with special options to be used
1249
	  in a jail.  For example, both of the network monitoring
1249
	  in a jail.  For example, both of the network monitoring
1250
	  plugin packages
1250
	  plugin packages
1251
	  <package role="port">net-mgmt/nagios-plugins</package> and
1251
	  <package role="port">net-mgmt/nagios-plugins</package> and
1252
	  <package role="port">net-mgmt/monitoring-plugins</package>
1252
	  <package role="port">net-mgmt/monitoring-plugins</package>
1253
	  have a <literal>JAIL</literal> option which must be enabled
1253
	  have a <literal>JAIL</literal> option which must be enabled
1254
	  for them to work correctly inside a jail.</para>
1254
	  for them to work correctly inside a jail.</para>
1255
      </tip>
1255
      </tip>
1256
    </sect2>
1256
    </sect2>
1257
1257
1258
    <sect2 xml:id="jails-ezjail-update">
1258
    <sect2 xml:id="jails-ezjail-update">
1259
      <title>Updating Jails</title>
1259
      <title>Updating Jails</title>
1260
1260
1261
      <sect3 xml:id="jails-ezjail-update-os">
1261
      <sect3 xml:id="jails-ezjail-update-os">
1262
	<title>Updating the Operating System</title>
1262
	<title>Updating the Operating System</title>
1263
1263
1264
	<para>Because the basejail's copy of the userland is shared by
1264
	<para>Because the basejail's copy of the userland is shared by
1265
	  the other jails, updating the basejail automatically updates
1265
	  the other jails, updating the basejail automatically updates
1266
	  all of the other jails.  Either source or binary updates can
1266
	  all of the other jails.  Either source or binary updates can
1267
	  be used.</para>
1267
	  be used.</para>
1268
1268
1269
	<para>To build the world from source on the host, then
1269
	<para>To build the world from source on the host, then
1270
	  install it in the basejail, use:</para>
1270
	  install it in the basejail, use:</para>
1271
1271
1272
	<screen>&prompt.root; <userinput>ezjail-admin update -b</userinput></screen>
1272
	<screen>&prompt.root; <userinput>ezjail-admin update -b</userinput></screen>
1273
1273
1274
	<para>If the world has already been compiled on the host,
1274
	<para>If the world has already been compiled on the host,
1275
	  install it in the basejail with:</para>
1275
	  install it in the basejail with:</para>
1276
1276
1277
	<screen>&prompt.root; <userinput>ezjail-admin update -i</userinput></screen>
1277
	<screen>&prompt.root; <userinput>ezjail-admin update -i</userinput></screen>
1278
1278
1279
	<para>Binary updates use &man.freebsd-update.8;.  These
1279
	<para>Binary updates use &man.freebsd-update.8;.  These
1280
	  updates have the same limitations as if
1280
	  updates have the same limitations as if
1281
	  &man.freebsd-update.8; were being run directly.  The most
1281
	  &man.freebsd-update.8; were being run directly.  The most
1282
	  important one is that only -RELEASE versions of &os; are
1282
	  important one is that only -RELEASE versions of &os; are
1283
	  available with this method.</para>
1283
	  available with this method.</para>
1284
1284
1285
	<para>Update the basejail to the latest patched release of
1285
	<para>Update the basejail to the latest patched release of
1286
	  the version of &os; on the host.  For example, updating from
1286
	  the version of &os; on the host.  For example, updating from
1287
	  RELEASE-p1 to RELEASE-p2.</para>
1287
	  RELEASE-p1 to RELEASE-p2.</para>
1288
1288
1289
	<screen>&prompt.root; <userinput>ezjail-admin update -u</userinput></screen>
1289
	<screen>&prompt.root; <userinput>ezjail-admin update -u</userinput></screen>
1290
1290
1291
	<para>To upgrade the basejail to a new version, first
1291
	<para>To upgrade the basejail to a new version, first
1292
	  upgrade the host system as described in <xref
1292
	  upgrade the host system as described in <xref
1293
	    linkend="freebsdupdate-upgrade" />.  Once the host has
1293
	    linkend="freebsdupdate-upgrade" />.  Once the host has
1294
	  been upgraded and rebooted, the basejail can then be
1294
	  been upgraded and rebooted, the basejail can then be
1295
	  upgraded.  &man.freebsd-update.8; has no way of determining
1295
	  upgraded.  &man.freebsd-update.8; has no way of determining
1296
	  which version is currently installed in the basejail, so the
1296
	  which version is currently installed in the basejail, so the
1297
	  original version must be specified.  Use &man.file.1; to
1297
	  original version must be specified.  Use &man.file.1; to
1298
	  determine the original version in the basejail:</para>
1298
	  determine the original version in the basejail:</para>
1299
1299
1300
	<screen>&prompt.root; <userinput>file /usr/jails/basejail/bin/sh</userinput>
1300
	<screen>&prompt.root; <userinput>file /usr/jails/basejail/bin/sh</userinput>
1301
/usr/jails/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.3, stripped</screen>
1301
/usr/jails/basejail/bin/sh: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 9.3, stripped</screen>
1302
1302
1303
	<para>Now use this information to perform the upgrade from
1303
	<para>Now use this information to perform the upgrade from
1304
	  <literal>9.3-RELEASE</literal> to the current version of
1304
	  <literal>9.3-RELEASE</literal> to the current version of
1305
	  the host system:</para>
1305
	  the host system:</para>
1306
1306
1307
	<screen>&prompt.root; <userinput>ezjail-admin update -U -s <replaceable>9.3-RELEASE</replaceable></userinput></screen>
1307
	<screen>&prompt.root; <userinput>ezjail-admin update -U -s <replaceable>9.3-RELEASE</replaceable></userinput></screen>
1308
1308
1309
	<para>After updating the basejail, &man.mergemaster.8; must
1309
	<para>After updating the basejail, &man.mergemaster.8; must
1310
	  be run to update each jail's configuration files.</para>
1310
	  be run to update each jail's configuration files.</para>
1311
1311
1312
	<para>How to use &man.mergemaster.8; depends on the purpose
1312
	<para>How to use &man.mergemaster.8; depends on the purpose
1313
	  and trustworthiness of a jail.  If a jail's services or
1313
	  and trustworthiness of a jail.  If a jail's services or
1314
	  users are not trusted, then &man.mergemaster.8; should only
1314
	  users are not trusted, then &man.mergemaster.8; should only
1315
	  be run from within that jail:</para>
1315
	  be run from within that jail:</para>
1316
1316
1317
	<example xml:id="jails-ezjail-update-mergemaster-untrusted">
1317
	<example xml:id="jails-ezjail-update-mergemaster-untrusted">
1318
	  <title>&man.mergemaster.8; on Untrusted Jail</title>
1318
	  <title>&man.mergemaster.8; on Untrusted Jail</title>
1319
1319
1320
	  <para>Delete the link from the jail's
1320
	  <para>Delete the link from the jail's
1321
	    <filename>/usr/src</filename> into the basejail and
1321
	    <filename>/usr/src</filename> into the basejail and
1322
	    create a new <filename>/usr/src</filename> in the jail
1322
	    create a new <filename>/usr/src</filename> in the jail
1323
	    as a mountpoint.  Mount the host computer's
1323
	    as a mountpoint.  Mount the host computer's
1324
	    <filename>/usr/src</filename> read-only on the jail's
1324
	    <filename>/usr/src</filename> read-only on the jail's
1325
	    new <filename>/usr/src</filename> mountpoint:</para>
1325
	    new <filename>/usr/src</filename> mountpoint:</para>
1326
1326
1327
	  <screen>&prompt.root; <userinput>rm /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput>
1327
	  <screen>&prompt.root; <userinput>rm /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput>
1328
&prompt.root; <userinput>mkdir /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput>
1328
&prompt.root; <userinput>mkdir /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput>
1329
&prompt.root; <userinput>mount -t nullfs -o ro /usr/src /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput></screen>
1329
&prompt.root; <userinput>mount -t nullfs -o ro /usr/src /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput></screen>
1330
1330
1331
	  <para>Get a console in the jail:</para>
1331
	  <para>Get a console in the jail:</para>
1332
1332
1333
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>jailname</replaceable></userinput></screen>
1333
	  <screen>&prompt.root; <userinput>ezjail-admin console <replaceable>jailname</replaceable></userinput></screen>
1334
1334
1335
	  <para>Inside the jail, run <command>mergemaster</command>.
1335
	  <para>Inside the jail, run <command>mergemaster</command>.
1336
	    Then exit the jail console:</para>
1336
	    Then exit the jail console:</para>
1337
1337
1338
	  <screen>&prompt.root; <userinput>cd /usr/src</userinput>
1338
	  <screen>&prompt.root; <userinput>cd /usr/src</userinput>
1339
&prompt.root; <userinput>mergemaster -U</userinput>
1339
&prompt.root; <userinput>mergemaster -U</userinput>
1340
&prompt.root; <userinput>exit</userinput></screen>
1340
&prompt.root; <userinput>exit</userinput></screen>
1341
1341
1342
	  <para>Finally, unmount the jail's
1342
	  <para>Finally, unmount the jail's
1343
	    <filename>/usr/src</filename>:</para>
1343
	    <filename>/usr/src</filename>:</para>
1344
1344
1345
	  <screen>&prompt.root; <userinput>umount /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput></screen>
1345
	  <screen>&prompt.root; <userinput>umount /usr/jails/<replaceable>jailname</replaceable>/usr/src</userinput></screen>
1346
	</example>
1346
	</example>
1347
1347
1348
	<example xml:id="jails-ezjail-update-mergemaster-trusted">
1348
	<example xml:id="jails-ezjail-update-mergemaster-trusted">
1349
1349
1350
	  <title>&man.mergemaster.8; on Trusted Jail</title>
1350
	  <title>&man.mergemaster.8; on Trusted Jail</title>
1351
1351
1352
	  <para>If the users and services in a jail are trusted,
1352
	  <para>If the users and services in a jail are trusted,
1353
	    &man.mergemaster.8; can be run from the host:</para>
1353
	    &man.mergemaster.8; can be run from the host:</para>
1354
1354
1355
	  <screen>&prompt.root; <userinput>mergemaster -U -D /usr/jails/<replaceable>jailname</replaceable></userinput></screen>
1355
	  <screen>&prompt.root; <userinput>mergemaster -U -D /usr/jails/<replaceable>jailname</replaceable></userinput></screen>
1356
	</example>
1356
	</example>
1357
      </sect3>
1357
      </sect3>
1358
1358
1359
      <sect3 xml:id="jails-ezjail-update-ports">
1359
      <sect3 xml:id="jails-ezjail-update-ports">
1360
	<title>Updating Ports</title>
1360
	<title>Updating Ports</title>
1361
1361
1362
	<para>The ports tree in the basejail is shared by the other
1362
	<para>The ports tree in the basejail is shared by the other
1363
	  jails.  Updating that copy of the ports tree gives the other
1363
	  jails.  Updating that copy of the ports tree gives the other
1364
	  jails the updated version also.</para>
1364
	  jails the updated version also.</para>
1365
1365
1366
	<para>The basejail ports tree is updated with
1366
	<para>The basejail ports tree is updated with
1367
	  &man.portsnap.8;:</para>
1367
	  &man.portsnap.8;:</para>
1368
1368
1369
	<screen>&prompt.root; <userinput>ezjail-admin update -P</userinput></screen>
1369
	<screen>&prompt.root; <userinput>ezjail-admin update -P</userinput></screen>
1370
      </sect3>
1370
      </sect3>
1371
    </sect2>
1371
    </sect2>
1372
1372
1373
    <sect2 xml:id="jails-ezjail-control">
1373
    <sect2 xml:id="jails-ezjail-control">
1374
      <title>Controlling Jails</title>
1374
      <title>Controlling Jails</title>
1375
1375
1376
      <sect3 xml:id="jails-ezjail-control-stop-start">
1376
      <sect3 xml:id="jails-ezjail-control-stop-start">
1377
	<title>Stopping and Starting Jails</title>
1377
	<title>Stopping and Starting Jails</title>
1378
1378
1379
	<para><application>ezjail</application> automatically starts
1379
	<para><application>ezjail</application> automatically starts
1380
	  jails when the computer is started.  Jails can be manually
1380
	  jails when the computer is started.  Jails can be manually
1381
	  stopped and restarted with <command>stop</command> and
1381
	  stopped and restarted with <command>stop</command> and
1382
	  <command>start</command>:</para>
1382
	  <command>start</command>:</para>
1383
1383
1384
	<screen>&prompt.root; <userinput>ezjail-admin stop <replaceable>sambajail</replaceable></userinput>
1384
	<screen>&prompt.root; <userinput>ezjail-admin stop <replaceable>sambajail</replaceable></userinput>
1385
Stopping jails: sambajail.</screen>
1385
Stopping jails: sambajail.</screen>
1386
1386
1387
	<para>By default, jails are started automatically when the
1387
	<para>By default, jails are started automatically when the
1388
	  host computer starts.  Autostarting can be disabled
1388
	  host computer starts.  Autostarting can be disabled
1389
	  with <command>config</command>:</para>
1389
	  with <command>config</command>:</para>
1390
1390
1391
	<screen>&prompt.root; <userinput>ezjail-admin config -r norun <replaceable>seldomjail</replaceable></userinput></screen>
1391
	<screen>&prompt.root; <userinput>ezjail-admin config -r norun <replaceable>seldomjail</replaceable></userinput></screen>
1392
1392
1393
	<para>This takes effect the next time the host computer is
1393
	<para>This takes effect the next time the host computer is
1394
	  started.  A jail that is already running will not be
1394
	  started.  A jail that is already running will not be
1395
	  stopped.</para>
1395
	  stopped.</para>
1396
1396
1397
	<para>Enabling autostart is very similar:</para>
1397
	<para>Enabling autostart is very similar:</para>
1398
1398
1399
	<screen>&prompt.root; <userinput>ezjail-admin config -r run <replaceable>oftenjail</replaceable></userinput></screen>
1399
	<screen>&prompt.root; <userinput>ezjail-admin config -r run <replaceable>oftenjail</replaceable></userinput></screen>
1400
      </sect3>
1400
      </sect3>
1401
1401
1402
      <sect3 xml:id="jails-ezjail-control-backup">
1402
      <sect3 xml:id="jails-ezjail-control-backup">
1403
	<title>Archiving and Restoring Jails</title>
1403
	<title>Archiving and Restoring Jails</title>
1404
1404
1405
	<para>Use <command>archive</command> to create a
1405
	<para>Use <command>archive</command> to create a
1406
	  <filename>.tar.gz</filename> archive of a jail.  The file
1406
	  <filename>.tar.gz</filename> archive of a jail.  The file
1407
	  name is composed from the name of the jail and the current
1407
	  name is composed from the name of the jail and the current
1408
	  date.  Archive files are written to the archive directory,
1408
	  date.  Archive files are written to the archive directory,
1409
	  <filename>/usr/jails/ezjail_archives</filename>.  A
1409
	  <filename>/usr/jails/ezjail_archives</filename>.  A
1410
	  different archive directory can be chosen by setting
1410
	  different archive directory can be chosen by setting
1411
	  <varname>ezjail_archivedir</varname> in the configuration
1411
	  <varname>ezjail_archivedir</varname> in the configuration
1412
	  file.</para>
1412
	  file.</para>
1413
1413
1414
	<para>The archive file can be copied elsewhere as a backup, or
1414
	<para>The archive file can be copied elsewhere as a backup, or
1415
	  an existing jail can be restored from it with
1415
	  an existing jail can be restored from it with
1416
	  <command>restore</command>.  A new jail can be created from
1416
	  <command>restore</command>.  A new jail can be created from
1417
	  the archive, providing a convenient way to clone existing
1417
	  the archive, providing a convenient way to clone existing
1418
	  jails.</para>
1418
	  jails.</para>
1419
1419
1420
	<para>Stop and archive a jail named
1420
	<para>Stop and archive a jail named
1421
	  <literal>wwwserver</literal>:</para>
1421
	  <literal>wwwserver</literal>:</para>
1422
1422
1423
	<screen>&prompt.root; <userinput>ezjail-admin stop <replaceable>wwwserver</replaceable></userinput>
1423
	<screen>&prompt.root; <userinput>ezjail-admin stop <replaceable>wwwserver</replaceable></userinput>
1424
Stopping jails: wwwserver.
1424
Stopping jails: wwwserver.
1425
&prompt.root; <userinput>ezjail-admin archive <replaceable>wwwserver</replaceable></userinput>
1425
&prompt.root; <userinput>ezjail-admin archive <replaceable>wwwserver</replaceable></userinput>
1426
&prompt.root; <userinput>ls /usr/jails/ezjail-archives/</userinput>
1426
&prompt.root; <userinput>ls /usr/jails/ezjail-archives/</userinput>
1427
wwwserver-201407271153.13.tar.gz</screen>
1427
wwwserver-201407271153.13.tar.gz</screen>
1428
1428
1429
	<para>Create a new jail named
1429
	<para>Create a new jail named
1430
	  <literal>wwwserver-clone</literal> from the archive created
1430
	  <literal>wwwserver-clone</literal> from the archive created
1431
	  in the previous step.  Use the <filename>em1</filename>
1431
	  in the previous step.  Use the <filename>em1</filename>
1432
	  interface and assign a new <acronym>IP</acronym> address to
1432
	  interface and assign a new <acronym>IP</acronym> address to
1433
	  avoid conflict with the original:</para>
1433
	  avoid conflict with the original:</para>
1434
1434
1435
	<screen>&prompt.root; <userinput>ezjail-admin create -a /usr/jails/ezjail_archives/wwwserver-201407271153.13.tar.gz <replaceable>wwwserver-clone</replaceable> 'lo1|127.0.3.1,em1|192.168.1.51'</userinput></screen>
1435
	<screen>&prompt.root; <userinput>ezjail-admin create -a /usr/jails/ezjail_archives/wwwserver-201407271153.13.tar.gz <replaceable>wwwserver-clone</replaceable> 'lo1|127.0.3.1,em1|192.168.1.51'</userinput></screen>
1436
      </sect3>
1436
      </sect3>
1437
    </sect2>
1437
    </sect2>
1438
1438
1439
    <sect2 xml:id="jails-ezjail-example-bind">
1439
    <sect2 xml:id="jails-ezjail-example-bind">
1440
      <title>Full Example: <application>BIND</application> in a
1440
      <title>Full Example: <application>BIND</application> in a
1441
	Jail</title>
1441
	Jail</title>
1442
1442
1443
      <para>Putting the <application>BIND</application>
1443
      <para>Putting the <application>BIND</application>
1444
	<acronym>DNS</acronym> server in a jail improves security by
1444
	<acronym>DNS</acronym> server in a jail improves security by
1445
	isolating it.  This example creates a simple caching-only name
1445
	isolating it.  This example creates a simple caching-only name
1446
	server.</para>
1446
	server.</para>
1447
1447
1448
      <itemizedlist xml:id="jails-ezjail-example-bind-assumptions">
1448
      <itemizedlist xml:id="jails-ezjail-example-bind-assumptions">
1449
	<listitem>
1449
	<listitem>
1450
	  <para>The jail will be called
1450
	  <para>The jail will be called
1451
	    <literal>dns1</literal>.</para>
1451
	    <literal>dns1</literal>.</para>
1452
	</listitem>
1452
	</listitem>
1453
1453
1454
	<listitem>
1454
	<listitem>
1455
	  <para>The jail will use <acronym>IP</acronym> address
1455
	  <para>The jail will use <acronym>IP</acronym> address
1456
	    <literal>192.168.1.240</literal> on the host's
1456
	    <literal>192.168.1.240</literal> on the host's
1457
	    <literal>re0</literal> interface.</para>
1457
	    <literal>re0</literal> interface.</para>
1458
	</listitem>
1458
	</listitem>
1459
1459
1460
	<listitem>
1460
	<listitem>
1461
	  <para>The upstream <acronym>ISP</acronym>'s DNS servers are
1461
	  <para>The upstream <acronym>ISP</acronym>'s DNS servers are
1462
	    at <literal>10.0.0.62</literal> and
1462
	    at <literal>10.0.0.62</literal> and
1463
	    <literal>10.0.0.61</literal>.</para>
1463
	    <literal>10.0.0.61</literal>.</para>
1464
	</listitem>
1464
	</listitem>
1465
1465
1466
	<listitem>
1466
	<listitem>
1467
	  <para>The basejail has already been created and a ports tree
1467
	  <para>The basejail has already been created and a ports tree
1468
	    installed.</para>
1468
	    installed.</para>
1469
	</listitem>
1469
	</listitem>
1470
      </itemizedlist>
1470
      </itemizedlist>
1471
1471
1472
      <example xml:id="jails-ezjail-example-bind-steps">
1472
      <example xml:id="jails-ezjail-example-bind-steps">
1473
	<title>Running BIND in a Jail</title>
1473
	<title>Running BIND in a Jail</title>
1474
1474
1475
	<para>Create a cloned loopback interface by adding a line to
1475
	<para>Create a cloned loopback interface by adding a line to
1476
	  <filename>/etc/rc.conf</filename>:</para>
1476
	  <filename>/etc/rc.conf</filename>:</para>
1477
1477
1478
	<programlisting>cloned_interfaces="lo1"</programlisting>
1478
	<programlisting>cloned_interfaces="lo1"</programlisting>
1479
1479
1480
	<para>Immediately create the new loopback interface:</para>
1480
	<para>Immediately create the new loopback interface:</para>
1481
1481
1482
	<screen>&prompt.root; <userinput>service netif cloneup</userinput>
1482
	<screen>&prompt.root; <userinput>service netif cloneup</userinput>
1483
Created clone interfaces: lo1.</screen>
1483
Created clone interfaces: lo1.</screen>
1484
1484
1485
	<para>Create the jail:</para>
1485
	<para>Create the jail:</para>
1486
1486
1487
	<screen>&prompt.root; <userinput>ezjail-admin create dns1 'lo1|127.0.2.1,re0|192.168.1.240'</userinput></screen>
1487
	<screen>&prompt.root; <userinput>ezjail-admin create dns1 'lo1|127.0.2.1,re0|192.168.1.240'</userinput></screen>
1488
1488
1489
	<para>Start the jail, connect to a console running on it, and
1489
	<para>Start the jail, connect to a console running on it, and
1490
	  perform some basic configuration:</para>
1490
	  perform some basic configuration:</para>
1491
1491
1492
	<screen>&prompt.root; <userinput>ezjail-admin start dns1</userinput>
1492
	<screen>&prompt.root; <userinput>ezjail-admin start dns1</userinput>
1493
&prompt.root; <userinput>ezjail-admin console dns1</userinput>
1493
&prompt.root; <userinput>ezjail-admin console dns1</userinput>
1494
&prompt.root; <userinput>passwd</userinput>
1494
&prompt.root; <userinput>passwd</userinput>
1495
Changing local password for root
1495
Changing local password for root
1496
New Password:
1496
New Password:
1497
Retype New Password:
1497
Retype New Password:
1498
&prompt.root; <userinput>tzsetup</userinput>
1498
&prompt.root; <userinput>tzsetup</userinput>
1499
&prompt.root; <userinput>sed -i .bak -e '/adjkerntz/ s/^/#/' /etc/crontab</userinput>
1499
&prompt.root; <userinput>sed -i .bak -e '/adjkerntz/ s/^/#/' /etc/crontab</userinput>
1500
&prompt.root; <userinput>sed -i .bak -e 's/127.0.0.1/127.0.2.1/g; s/localhost.my.domain/dns1.my.domain dns1/' /etc/hosts</userinput></screen>
1500
&prompt.root; <userinput>sed -i .bak -e 's/127.0.0.1/127.0.2.1/g; s/localhost.my.domain/dns1.my.domain dns1/' /etc/hosts</userinput></screen>
1501
1501
1502
	<para>Temporarily set the upstream <acronym>DNS</acronym>
1502
	<para>Temporarily set the upstream <acronym>DNS</acronym>
1503
	  servers in <filename>/etc/resolv.conf</filename> so ports
1503
	  servers in <filename>/etc/resolv.conf</filename> so ports
1504
	  can be downloaded:</para>
1504
	  can be downloaded:</para>
1505
1505
1506
	<programlisting>nameserver 10.0.0.62
1506
	<programlisting>nameserver 10.0.0.62
1507
nameserver 10.0.0.61</programlisting>
1507
nameserver 10.0.0.61</programlisting>
1508
1508
1509
	<para>Still using the jail console, install
1509
	<para>Still using the jail console, install
1510
	  <package role="port">dns/bind99</package>.</para>
1510
	  <package role="port">dns/bind99</package>.</para>
1511
1511
1512
	<screen>&prompt.root; <userinput>make -C /usr/ports/dns/bind99 install clean</userinput></screen>
1512
	<screen>&prompt.root; <userinput>make -C /usr/ports/dns/bind99 install clean</userinput></screen>
1513
1513
1514
	<para>Configure the name server by editing
1514
	<para>Configure the name server by editing
1515
	  <filename>/usr/local/etc/namedb/named.conf</filename>.</para>
1515
	  <filename>/usr/local/etc/namedb/named.conf</filename>.</para>
1516
1516
1517
	<para>Create an Access Control List (<acronym>ACL</acronym>)
1517
	<para>Create an Access Control List (<acronym>ACL</acronym>)
1518
	  of addresses and networks that are permitted to send
1518
	  of addresses and networks that are permitted to send
1519
	  <acronym>DNS</acronym> queries to this name server.  This
1519
	  <acronym>DNS</acronym> queries to this name server.  This
1520
	  section is added just before the <literal>options</literal>
1520
	  section is added just before the <literal>options</literal>
1521
	  section already in the file:</para>
1521
	  section already in the file:</para>
1522
1522
1523
	<programlisting>...
1523
	<programlisting>...
1524
// or cause huge amounts of useless Internet traffic.
1524
// or cause huge amounts of useless Internet traffic.
1525
1525
1526
acl "trusted" {
1526
acl "trusted" {
1527
	192.168.1.0/24;
1527
	192.168.1.0/24;
1528
	localhost;
1528
	localhost;
1529
	localnets;
1529
	localnets;
1530
};
1530
};
1531
1531
1532
options {
1532
options {
1533
...</programlisting>
1533
...</programlisting>
1534
1534
1535
	<para>Use the jail <acronym>IP</acronym> address in the
1535
	<para>Use the jail <acronym>IP</acronym> address in the
1536
	  <literal>listen-on</literal> setting to accept
1536
	  <literal>listen-on</literal> setting to accept
1537
	  <acronym>DNS</acronym> queries from other computers on the
1537
	  <acronym>DNS</acronym> queries from other computers on the
1538
	  network:</para>
1538
	  network:</para>
1539
1539
1540
	<programlisting>	listen-on	{ 192.168.1.240; };</programlisting>
1540
	<programlisting>	listen-on	{ 192.168.1.240; };</programlisting>
1541
1541
1542
	<para>A simple caching-only <acronym>DNS</acronym> name server
1542
	<para>A simple caching-only <acronym>DNS</acronym> name server
1543
	  is created by changing the <literal>forwarders</literal>
1543
	  is created by changing the <literal>forwarders</literal>
1544
	  section.  The original file contains:</para>
1544
	  section.  The original file contains:</para>
1545
1545
1546
	<programlisting>/*
1546
	<programlisting>/*
1547
	forwarders {
1547
	forwarders {
1548
		127.0.0.1;
1548
		127.0.0.1;
1549
	};
1549
	};
1550
*/</programlisting>
1550
*/</programlisting>
1551
1551
1552
	<para>Uncomment the section by removing the
1552
	<para>Uncomment the section by removing the
1553
	  <literal>/*</literal> and <literal>*/</literal> lines.
1553
	  <literal>/*</literal> and <literal>*/</literal> lines.
1554
	  Enter the <acronym>IP</acronym> addresses of the upstream
1554
	  Enter the <acronym>IP</acronym> addresses of the upstream
1555
	  <acronym>DNS</acronym> servers.  Immediately after the
1555
	  <acronym>DNS</acronym> servers.  Immediately after the
1556
	  <literal>forwarders</literal> section, add references to the
1556
	  <literal>forwarders</literal> section, add references to the
1557
	  <literal>trusted</literal> <acronym>ACL</acronym> defined
1557
	  <literal>trusted</literal> <acronym>ACL</acronym> defined
1558
	  earlier:</para>
1558
	  earlier:</para>
1559
1559
1560
	<programlisting>	forwarders {
1560
	<programlisting>	forwarders {
1561
		10.0.0.62;
1561
		10.0.0.62;
1562
		10.0.0.61;
1562
		10.0.0.61;
1563
	};
1563
	};
1564
1564
1565
	allow-query       { any; };
1565
	allow-query       { any; };
1566
	allow-recursion   { trusted; };
1566
	allow-recursion   { trusted; };
1567
	allow-query-cache { trusted; };</programlisting>
1567
	allow-query-cache { trusted; };</programlisting>
1568
1568
1569
	<para>Enable the service in
1569
	<para>Enable the service in
1570
	  <filename>/etc/rc.conf</filename>:</para>
1570
	  <filename>/etc/rc.conf</filename>:</para>
1571
1571
1572
	<programlisting>named_enable="YES"</programlisting>
1572
	<programlisting>named_enable="YES"</programlisting>
1573
1573
1574
	<para>Start and test the name server:</para>
1574
	<para>Start and test the name server:</para>
1575
1575
1576
	<screen>&prompt.root; <userinput>service named start</userinput>
1576
	<screen>&prompt.root; <userinput>service named start</userinput>
1577
wrote key file "/usr/local/etc/namedb/rndc.key"
1577
wrote key file "/usr/local/etc/namedb/rndc.key"
1578
Starting named.
1578
Starting named.
1579
&prompt.root; <userinput>/usr/local/bin/dig @192.168.1.240 freebsd.org</userinput></screen>
1579
&prompt.root; <userinput>/usr/local/bin/dig @192.168.1.240 freebsd.org</userinput></screen>
1580
1580
1581
	<para>A response that includes</para>
1581
	<para>A response that includes</para>
1582
1582
1583
	<screen>;; Got answer;</screen>
1583
	<screen>;; Got answer;</screen>
1584
1584
1585
	<para>shows that the new <acronym>DNS</acronym> server is
1585
	<para>shows that the new <acronym>DNS</acronym> server is
1586
	  working.  A long delay followed by a response
1586
	  working.  A long delay followed by a response
1587
	  including</para>
1587
	  including</para>
1588
1588
1589
	<screen>;; connection timed out; no servers could be reached</screen>
1589
	<screen>;; connection timed out; no servers could be reached</screen>
1590
1590
1591
	<para>shows a problem.  Check the configuration settings and
1591
	<para>shows a problem.  Check the configuration settings and
1592
	  make sure any local firewalls allow the new
1592
	  make sure any local firewalls allow the new
1593
	  <acronym>DNS</acronym> access to the upstream
1593
	  <acronym>DNS</acronym> access to the upstream
1594
	  <acronym>DNS</acronym> servers.</para>
1594
	  <acronym>DNS</acronym> servers.</para>
1595
1595
1596
	<para>The new <acronym>DNS</acronym> server can use itself for
1596
	<para>The new <acronym>DNS</acronym> server can use itself for
1597
	  local name resolution, just like other local computers.  Set
1597
	  local name resolution, just like other local computers.  Set
1598
	  the address of the <acronym>DNS</acronym> server in the
1598
	  the address of the <acronym>DNS</acronym> server in the
1599
	  client computer's
1599
	  client computer's
1600
	  <filename>/etc/resolv.conf</filename>:</para>
1600
	  <filename>/etc/resolv.conf</filename>:</para>
1601
1601
1602
	<programlisting>nameserver 192.168.1.240</programlisting>
1602
	<programlisting>nameserver 192.168.1.240</programlisting>
1603
1603
1604
	<para>A local <acronym>DHCP</acronym> server can be configured
1604
	<para>A local <acronym>DHCP</acronym> server can be configured
1605
	  to provide this address for a local <acronym>DNS</acronym>
1605
	  to provide this address for a local <acronym>DNS</acronym>
1606
	  server, providing automatic configuration on
1606
	  server, providing automatic configuration on
1607
	  <acronym>DHCP</acronym> clients.</para>
1607
	  <acronym>DHCP</acronym> clients.</para>
1608
      </example>
1608
      </example>
1609
    </sect2>
1609
    </sect2>
1610
  </sect1>
1610
  </sect1>
1611
</chapter>
1611
</chapter>

Return to bug 207344