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