xref: /freebsd/sbin/bectl/bectl.8 (revision 7b5e687355afe772894661db63d1d4466751d806)
1.\"
2.\" SPDX-License-Identifier: BSD-2-Clause
3.\"
4.\" Copyright (c) 2017 Kyle J. Kneitinger <kyle@kneit.in>
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\"
15.\"
16.\"     @(#)be.1
17.\"
18.\" $FreeBSD$
19.\"
20.Dd June 28, 2023
21.Dt BECTL 8
22.Os
23.Sh NAME
24.Nm bectl
25.Nd Utility to manage boot environments on ZFS
26.Sh SYNOPSIS
27.Nm
28.Op Fl h\&?
29.Nm
30.Op Fl r Ar beroot
31.Cm activate
32.Op Fl t | Fl T
33.Ar beName
34.Nm
35.Op Fl r Ar beroot
36.Cm check
37.Nm
38.Op Fl r Ar beroot
39.Cm create
40.Op Fl r
41.Op Fl e Brq Ar nonActiveBe | Ar beName Ns Cm @ Ns Ar snapshot
42.Ar newBeName
43.Nm
44.Op Fl r Ar beroot
45.Cm create
46.Op Fl r
47.Ar beName@snapshot
48.Nm
49.Op Fl r Ar beroot
50.Cm destroy
51.Op Fl \&Fo
52.Ar beName Ns Op Cm @ Ns Ar snapshot
53.Nm
54.Op Fl r Ar beroot
55.Cm export
56.Ar sourceBe
57.Nm
58.Op Fl r Ar beroot
59.Cm import
60.Ar targetBe
61.Nm
62.Op Fl r Ar beroot
63.Cm jail
64.Op Fl bU
65.Oo Bro Fl o Ar key Ns Cm = Ns Ar value | Fl u Ar key Brc Oc Ns ...
66.Ar beName
67.Op Ar utility Op Ar argument ...
68.Nm
69.Op Fl r Ar beroot
70.Cm list
71.Op Fl aDHs
72.Op Fl c Ar property
73.Op Fl C Ar property
74.Oo Bro Fl c Ar property | Fl C Ar property Brc Oc
75.Nm
76.Op Fl r Ar beroot
77.Cm mount
78.Ar beName
79.Op Ar mountpoint
80.Nm
81.Op Fl r Ar beroot
82.Cm rename
83.Ar origBeName
84.Ar newBeName
85.Nm
86.Op Fl r Ar beroot
87.Brq Cm ujail | unjail
88.Brq Ar jailId | jailName | beName
89.Nm
90.Op Fl r Ar beroot
91.Brq Cm umount | unmount
92.Op Fl f
93.Ar beName
94.Sh DESCRIPTION
95The
96.Nm
97command is used to setup and interact with ZFS boot environments, which are
98bootable clones of datasets.
99.Pp
100A boot environment allows the system to be upgraded, while preserving the
101pre-upgrade system environment.
102.Pp
103.Nm
104itself accepts an
105.Fl r
106flag specified before the command to indicate the
107.Ar beroot
108that should be used as the boot environment root, or the dataset whose children
109are all boot environments.
110Normally this information is derived from the bootfs property of the pool that
111is mounted at
112.Pa / ,
113but it is useful when the system has not been booted into a ZFS root or a
114different pool should be operated on.
115For instance, booting into the recovery media and manually importing a pool from
116one of the system's resident disks will require the
117.Fl r
118flag to work.
119.Pp
120.Ss Supported Subcommands and Flags
121.Bl -tag -width activate
122.It Xo
123.Fl h |
124.Fl \&?
125Print usage information.
126.It Xo
127.Cm activate
128.Op Fl t | Fl T
129.Ar beName
130.Xc
131Activate the given
132.Ar beName
133as the default boot filesystem.
134If the
135.Fl t
136flag is given, this takes effect only for the next boot.
137Flag
138.Fl T
139removes temporary boot once configuration.
140Without temporary configuration, the next boot will use zfs dataset specified
141in boot pool
142.Ar bootfs
143property.
144.It Xo
145.Cm check
146.Xc
147Performs a silent sanity check on the current system.
148If boot environments are supported and used,
149.Nm
150will exit with a status code of 0.
151Any other status code is not currently defined and may, in the future, grow
152special meaning for different degrees of sanity check failures.
153.It Xo
154.Cm create
155.Op Fl r
156.Op Fl e Brq Ar nonActiveBe | Ar beName Ns Cm @ Ns Ar snapshot
157.Ar newBeName
158.Xc
159Create a new boot environment named
160.Ar newBeName .
161.Pp
162If the
163.Fl r
164flag is given, a recursive boot environment will be made.
165See
166.Sx Boot Environment Structures
167for a discussion on different layouts.
168.Pp
169If the
170.Fl e
171flag is specified, the new environment will be cloned from the given
172.Ar nonActiveBe
173or
174.Ar beName Ns Cm @ Ns Ar snapshot .
175Otherwise, the new environment will be created from the currently booted
176environment.
177.Pp
178If
179.Nm
180is creating from another boot environment, a snapshot of that boot environment
181will be created to clone from.
182.It Xo
183.Cm create
184.Op Fl r
185.Ar beName@snapshot
186.Xc
187Create a snapshot of the boot environment named
188.Ar beName .
189.Pp
190If the
191.Fl r
192flag is given, a recursive snapshot of the boot environment will be created.
193A snapshot is created for each descendant dataset of the boot environment.
194See
195.Sx Boot Environment Structures
196for a discussion on different layouts.
197.Pp
198No new boot environment is created with this subcommand.
199.It Xo
200.Cm destroy
201.Op Fl \&Fo
202.Ar beName Ns Op Cm @ Ns Ar snapshot
203.Xc
204Destroy the given
205.Ar beName
206boot environment or
207.Ar beName Ns Cm @ Ns Ar snapshot
208snapshot without confirmation, unlike in
209.Xr beadm 1 .
210Specifying
211.Fl F
212will automatically unmount without confirmation.
213.Pp
214By default,
215.Nm
216will warn that it is not destroying the origin of
217.Ar beName .
218The
219.Fl o
220flag may be specified to destroy the origin as well.
221.It Cm export Ar sourceBe
222Export
223.Ar sourceBe
224to
225.Xr stdout 4 .
226.Xr stdout 4
227must be piped or redirected to a file.
228.It Cm import Ar targetBe
229Import
230.Ar targetBe
231from
232.Xr stdin 4 .
233.It Xo
234.Cm jail
235.Op Fl bU
236.Oo Bro Fl o Ar key Ns Cm = Ns Ar value | Fl u Ar key Brc Oc Ns ...
237.Ar beName
238.Op Ar utility Op Ar argument ...
239.Xc
240Create a jail of the given boot environment.
241Multiple
242.Fl o
243and
244.Fl u
245arguments may be specified.
246.Fl o
247will set a jail parameter, and
248.Fl u
249will unset a jail parameter.
250.Pp
251By default, jails are created in interactive mode and
252.Pa /bin/sh
253is
254executed within the jail.
255If
256.Ar utility
257is specified, it will be executed instead of
258.Pa /bin/sh .
259The jail will be destroyed and the boot environment unmounted when the command
260finishes executing, unless the
261.Fl U
262argument is specified.
263.Pp
264The
265.Fl b
266argument enables batch mode, thereby disabling interactive mode.
267The
268.Fl U
269argument will be ignored in batch mode.
270.Pp
271The
272.Va name ,
273.Va host.hostname ,
274and
275.Va path
276must be set, the default values are specified below.
277.Pp
278All
279.Ar key Ns Cm = Ns Ar value
280pairs are interpreted as jail parameters as described in
281.Xr jail 8 .
282The following default parameters are provided:
283.Bl -column "allow.mount.devfs" ""
284.It Va allow.mount Ta Cm true
285.It Va allow.mount.devfs Ta Cm true
286.It Va enforce_statfs Ta Cm 1
287.It Va name Ta Set to jail ID.
288.It Va host.hostname Ta Va bootenv
289.It Va path Ta Set to a path in Pa /tmp
290generated by
291.Xr libbe 3 .
292.El
293.Pp
294All default parameters may be overwritten.
295.It Xo
296.Cm list
297.Op Fl aDHs
298.Oo Bro Fl c Ar property | Fl C Ar property Brc Oc
299.Xc
300.Pp
301Display all boot environments.
302The
303.Em Active
304field indicates whether the boot environment is active now
305.Pq Em \&N ;
306active on reboot
307.Pq Em \&R ;
308is used on next boot once
309.Pq Em \&T ;
310or combination of
311.Pq Em \&NRT .
312.Bl -tag -width indent
313.It Fl a
314Display all datasets.
315.It Fl D
316Display the full space usage for each boot environment, assuming all
317other boot environments were destroyed.
318.It Fl H
319Used for scripting.
320Do not print headers and separate fields by a single tab instead of
321arbitrary white space.
322.It Fl s
323Display all snapshots as well.
324.It Fl c Ar property
325Sort boot environments by the given ZFS dataset property.
326The following properties are supported:
327.Pp
328.Bl -tag -width 4n -offset indent -compact
329.It name (the default)
330.It creation
331.It origin
332.It used
333.It usedbydataset
334.It usedbyrefreservation
335.It usedbysnapshots
336.El
337.Pp
338Short forms usedds, usedrefreserv and usedsnap are also supported.
339.It Fl C Ar property
340Same as the
341.Fl c
342option, but displays in descending order.
343.El
344.Pp
345The
346.Fl D
347option is ignored when either the
348.Fl s
349or
350.Fl a
351option is used.
352.It Cm mount Ar beName Op Ar mountpoint
353Mount the given boot environment.
354.Pp
355If a nonexistent
356.Ar mountpoint
357is given:
358.Nm
359will make the directory, including intermediate directories as required.
360.Pp
361If no
362.Ar mountpoint
363is given:
364.Nm
365will make a directory such as
366.Pa be_mount.c6Sf
367in
368.Pa /tmp .
369Randomness in the last four characters of the directory name will prevent
370mount point conflicts.
371Unmount of an environment, followed by mount of the same environment
372without giving a
373.Ar mountpoint ,
374will result in a different randomly-named mountpoint.
375.It Cm rename Ar origBeName newBeName
376Rename the given
377.Ar origBeName
378to the given
379.Ar newBeName .
380The boot environment will not be unmounted in order for this rename to occur.
381.It Cm ujail Brq Ar jailId | jailName | beName
382.It Cm unjail Brq Ar jailId | jailName | beName
383Destroy the jail created from the given boot environment.
384.It Xo
385.Cm umount
386.Op Fl f
387.Ar beName
388.Xc
389.It Xo
390.Cm unmount
391.Op Fl f
392.Ar beName
393.Xc
394Unmount the given boot environment, if it is mounted.
395Specifying
396.Fl f
397will force the unmount if busy.
398.Pp
399Unmount will not remove the mount point.
400.El
401.Pp
402.Ss Boot Environment Structures
403The traditional
404.Fx
405boot environment layout, as created by the Auto ZFS option to
406.Xr bsdinstall 8 ,
407is a
408.Dq shallow
409boot environment structure, where boot environment datasets do not have any
410directly subordinate datasets.
411Instead, they're organized off in
412.Pa zroot/ROOT ,
413and they rely on datasets elsewhere in the pool having
414.Dv canmount
415set to
416.Dv off .
417For instance, a simplified pool may be laid out as such:
418.Bd -literal -offset indent
419% zfs list -o name,canmount,mountpoint
420NAME			CANMOUNT	MOUNTPOINT
421zroot
422zroot/ROOT		noauto		none
423zroot/ROOT/default	noauto		none
424zroot/home		on		/home
425zroot/usr		off		/usr
426zroot/usr/src		on		/usr/src
427zroot/var		off		/var
428.Ed
429.Pp
430In that example,
431.Pa zroot/usr
432has
433.Dv canmount
434set to
435.Dv off ,
436thus files in
437.Pa /usr
438typically fall into the boot environment because this dataset is not mounted.
439.Pa zroot/usr/src
440is mounted, thus files in
441.Pa /usr/src
442are not in the boot environment.
443.Pp
444The other style of boot environments in use, frequently called
445.Dq deep boot environments ,
446organizes some or all of the boot environment as subordinate to the boot
447environment dataset.
448For example:
449.Bd -literal -offset indent
450% zfs list -o name,canmount,mountpoint
451NAME				CANMOUNT	MOUNTPOINT
452zroot
453zroot/ROOT			noauto		none
454zroot/ROOT/default		noauto		none
455zroot/ROOT/default/usr		noauto		/usr
456zroot/ROOT/default/usr/local	noauto		/usr/local
457zroot/var			on		/var
458.Ed
459.Pp
460Note that the subordinate datasets now have
461.Dv canmount
462set to
463.Dv noauto .
464These are more obviously a part of the boot environment, as indicated by their
465positioning in the layout.
466These subordinate datasets will be mounted by the
467.Dv zfsbe
468.Xr rc 8
469script at boot time.
470In this example,
471.Pa /var
472is excluded from the boot environment.
473.Pp
474.Nm
475subcommands that have their own
476.Fl r
477operate on this second,
478.Dq deep
479style of boot environment, when the
480.Fl r
481flag is set.
482A future version of
483.Nm
484may default to handling both styles and deprecate the various
485.Fl r
486flags.
487\" .Sh EXAMPLES
488\" .Bl -bullet
489\" .It
490\" To fill in with jail upgrade example when behavior is firm.
491\" .El
492.Sh SEE ALSO
493.Xr libbe 3 ,
494.Xr zfsprops 7 ,
495.Xr beinstall.sh 8 ,
496.Xr jail 8 ,
497.Xr zfs 8 ,
498.Xr zpool 8
499.Sh HISTORY
500.Nm
501is based on
502.Xr beadm 1
503and was implemented as a project for the 2017 Summer of Code, along with
504.Xr libbe 3 .
505.Sh AUTHORS
506.Nm
507was written by
508.An Kyle Kneitinger (kneitinger) Aq Mt kyle@kneit.in .
509.Pp
510.Xr beadm 1
511was written and is maintained by
512.An Slawomir Wojciech Wojtczak (vermaden) Aq Mt vermaden@interia.pl .
513.Pp
514.An Bryan Drewery (bdrewery) Aq Mt bryan@shatow.net
515wrote the original
516.Xr beadm 1
517manual page that this one is derived from.
518