aboutsummaryrefslogtreecommitdiff
path: root/sbin/bectl
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/bectl')
-rw-r--r--sbin/bectl/Makefile3
-rw-r--r--sbin/bectl/Makefile.depend13
-rw-r--r--sbin/bectl/bectl.8182
-rw-r--r--sbin/bectl/bectl.c84
-rw-r--r--sbin/bectl/bectl.h25
-rw-r--r--sbin/bectl/bectl_jail.c26
-rw-r--r--sbin/bectl/bectl_list.c26
-rw-r--r--sbin/bectl/tests/Makefile1
-rw-r--r--sbin/bectl/tests/Makefile.depend10
-rwxr-xr-xsbin/bectl/tests/bectl_test.sh125
10 files changed, 231 insertions, 264 deletions
diff --git a/sbin/bectl/Makefile b/sbin/bectl/Makefile
index d640de33bf72..c11426c57e45 100644
--- a/sbin/bectl/Makefile
+++ b/sbin/bectl/Makefile
@@ -1,4 +1,3 @@
-
.include <src.opts.mk>
PACKAGE=zfs
@@ -22,7 +21,7 @@ CFLAGS+= -I${SRCTOP}/sys
CFLAGS+= -I${SRCTOP}/cddl/compat/opensolaris/include
CFLAGS+= -I${SRCTOP}/sys/contrib/openzfs/module/icp/include
CFLAGS+= -include ${SRCTOP}/sys/contrib/openzfs/include/os/freebsd/spl/sys/ccompile.h
-CFLAGS+= -DHAVE_ISSETUGID
+CFLAGS+= -DHAVE_ISSETUGID -DHAVE_STRLCAT -DHAVE_STRLCPY
CFLAGS+= -include ${SRCTOP}/sys/modules/zfs/zfs_config.h
HAS_TESTS= yes
diff --git a/sbin/bectl/Makefile.depend b/sbin/bectl/Makefile.depend
index f04ca630e059..bcc4f32f88da 100644
--- a/sbin/bectl/Makefile.depend
+++ b/sbin/bectl/Makefile.depend
@@ -1,28 +1,17 @@
# Autogenerated - do NOT edit!
DIRDEPS = \
- cddl/lib/libavl \
cddl/lib/libnvpair \
cddl/lib/libspl \
- cddl/lib/libumem \
- cddl/lib/libuutil \
- cddl/lib/libzfs \
- cddl/lib/libzfs_core \
+ cddl/lib/libzfsbootenv \
include \
include/xlocale \
lib/${CSU_DIR} \
lib/libbe \
lib/libc \
lib/libcompiler_rt \
- lib/libexpat \
- lib/libgeom \
lib/libjail \
- lib/libmd \
- lib/libsbuf \
- lib/libthr \
lib/libutil \
- lib/libz \
- lib/msun \
.include <dirdeps.mk>
diff --git a/sbin/bectl/bectl.8 b/sbin/bectl/bectl.8
index 718f4e2597ae..0e08b3383e9a 100644
--- a/sbin/bectl/bectl.8
+++ b/sbin/bectl/bectl.8
@@ -1,29 +1,17 @@
.\"
-.\" SPDX-License-Identifier: BSD-2-Clause
-.\"
.\" Copyright (c) 2017 Kyle J. Kneitinger <kyle@kneit.in>
.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\"
-.\" @(#)be.1
+.\" SPDX-License-Identifier: BSD-2-Clause
.\"
-.Dd June 28, 2023
+.Dd June 13, 2025
.Dt BECTL 8
.Os
.Sh NAME
.Nm bectl
-.Nd Utility to manage boot environments on ZFS
+.Nd manage ZFS boot environments
.Sh SYNOPSIS
.Nm
-.Op Fl h\&?
+.Op Fl h
.Nm
.Op Fl r Ar beroot
.Cm activate
@@ -92,35 +80,31 @@
.Sh DESCRIPTION
The
.Nm
-command is used to setup and interact with ZFS boot environments, which are
-bootable clones of datasets.
-.Pp
-A boot environment allows the system to be upgraded, while preserving the
-pre-upgrade system environment.
-.Pp
-.Nm
-itself accepts an
-.Fl r
-flag specified before the command to indicate the
-.Ar beroot
-that should be used as the boot environment root, or the dataset whose children
-are all boot environments.
-Normally this information is derived from the bootfs property of the pool that
-is mounted at
-.Pa / ,
-but it is useful when the system has not been booted into a ZFS root or a
-different pool should be operated on.
-For instance, booting into the recovery media and manually importing a pool from
-one of the system's resident disks will require the
-.Fl r
-flag to work.
-.Pp
+utility manages bootable ZFS clones called boot environments.
+Boot envionments allow system changes to be tested safely,
+as they are selectable directly from the boot
+.Xr loader 8 .
+This utility can
+.Cm create ,
+.Cm list ,
+.Cm mount ,
+or
+.Cm jail
+boot environments.
+Once the changes have been tested, the boot environment can be
+.Cm unmount Ns ed ,
+.Cm activate Ns d ,
+.Cm rename Ns d ,
+and
+.Cm destroy Ns ed .
.Ss Supported Subcommands and Flags
-.Bl -tag -width activate
-.It Xo
-.Fl h |
-.Fl \&?
-Print usage information.
+.Bl -tag -width indent
+.It Fl h
+Print usage information and exit.
+.It Fl r Ar beroot Sy Ar subcommand
+Specify a parent dataset for the boot environment to use for
+.Ar subcommand
+for operation on manually imported pools or unusual layouts.
.It Xo
.Cm activate
.Op Fl t | Fl T
@@ -135,19 +119,19 @@ flag is given, this takes effect only for the next boot.
Flag
.Fl T
removes temporary boot once configuration.
-Without temporary configuration, the next boot will use zfs dataset specified
-in boot pool
+Without temporary configuration,
+the next boot will use zfs dataset specified in boot pool
.Ar bootfs
property.
.It Xo
.Cm check
.Xc
-Performs a silent sanity check on the current system.
+Perform a check to see if the current system can use boot environments.
If boot environments are supported and used,
.Nm
will exit with a status code of 0.
-Any other status code is not currently defined and may, in the future, grow
-special meaning for different degrees of sanity check failures.
+Any other status code is not currently defined and may, in the future,
+grow special meaning for different degrees of sanity check failures.
.It Xo
.Cm create
.Op Fl r
@@ -175,8 +159,8 @@ environment.
.Pp
If
.Nm
-is creating from another boot environment, a snapshot of that boot environment
-will be created to clone from.
+is creating from another boot environment,
+a snapshot of that boot environment will be created to clone from.
.It Xo
.Cm create
.Op Fl r
@@ -187,8 +171,10 @@ Create a snapshot of the boot environment named
.Pp
If the
.Fl r
-flag is given, a recursive snapshot of the boot environment will be created.
-A snapshot is created for each descendant dataset of the boot environment.
+flag is given,
+a recursive snapshot of the boot environment will be created.
+A snapshot is created for each descendant dataset
+of the boot environment.
See
.Sx Boot Environment Structures
for a discussion on different layouts.
@@ -204,7 +190,7 @@ Destroy the given
boot environment or
.Ar beName Ns Cm @ Ns Ar snapshot
snapshot without confirmation, unlike in
-.Xr beadm 1 .
+.Xr beadm 8 .
Specifying
.Fl F
will automatically unmount without confirmation.
@@ -254,8 +240,8 @@ If
.Ar utility
is specified, it will be executed instead of
.Pa /bin/sh .
-The jail will be destroyed and the boot environment unmounted when the command
-finishes executing, unless the
+The jail will be destroyed and the boot environment unmounted
+when the command finishes executing, unless the
.Fl U
argument is specified.
.Pp
@@ -282,11 +268,11 @@ The following default parameters are provided:
.It Va allow.mount Ta Cm true
.It Va allow.mount.devfs Ta Cm true
.It Va enforce_statfs Ta Cm 1
-.It Va name Ta Set to jail ID.
+.It Va name Ta set to jail ID
.It Va host.hostname Ta Va bootenv
-.It Va path Ta Set to a path in Pa /tmp
+.It Va path Ta set to a path in Pa /tmp
generated by
-.Xr libbe 3 .
+.Xr libbe 3
.El
.Pp
All default parameters may be overwritten.
@@ -311,8 +297,8 @@ or combination of
.It Fl a
Display all datasets.
.It Fl D
-Display the full space usage for each boot environment, assuming all
-other boot environments were destroyed.
+Display the full space usage for each boot environment,
+assuming all other boot environments were destroyed.
.It Fl H
Used for scripting.
Do not print headers and separate fields by a single tab instead of
@@ -364,8 +350,8 @@ will make a directory such as
.Pa be_mount.c6Sf
in
.Pa /tmp .
-Randomness in the last four characters of the directory name will prevent
-mount point conflicts.
+Randomness in the last four characters of the directory name
+will prevent mount point conflicts.
Unmount of an environment, followed by mount of the same environment
without giving a
.Ar mountpoint ,
@@ -375,7 +361,7 @@ Rename the given
.Ar origBeName
to the given
.Ar newBeName .
-The boot environment will not be unmounted in order for this rename to occur.
+The boot environment will not be unmounted for this rename to occur.
.It Cm ujail Brq Ar jailId | jailName | beName
.It Cm unjail Brq Ar jailId | jailName | beName
Destroy the jail created from the given boot environment.
@@ -396,7 +382,6 @@ will force the unmount if busy.
.Pp
Unmount will not remove the mount point.
.El
-.Pp
.Ss Boot Environment Structures
The traditional
.Fx
@@ -404,8 +389,8 @@ boot environment layout, as created by the Auto ZFS option to
.Xr bsdinstall 8 ,
is a
.Dq shallow
-boot environment structure, where boot environment datasets do not have any
-directly subordinate datasets.
+boot environment structure, where boot environment datasets
+do not have any directly subordinate datasets.
Instead, they're organized off in
.Pa zroot/ROOT ,
and they rely on datasets elsewhere in the pool having
@@ -433,7 +418,8 @@ set to
.Dv off ,
thus files in
.Pa /usr
-typically fall into the boot environment because this dataset is not mounted.
+typically fall into the boot environment
+because this dataset is not mounted.
.Pa zroot/usr/src
is mounted, thus files in
.Pa /usr/src
@@ -459,8 +445,8 @@ Note that the subordinate datasets now have
.Dv canmount
set to
.Dv noauto .
-These are more obviously a part of the boot environment, as indicated by their
-positioning in the layout.
+These are more obviously a part of the boot environment,
+as indicated by their positioning in the layout.
These subordinate datasets will be mounted by the
.Dv zfsbe
.Xr rc 8
@@ -482,34 +468,50 @@ A future version of
may default to handling both styles and deprecate the various
.Fl r
flags.
-\" .Sh EXAMPLES
-\" .Bl -bullet
-\" .It
-\" To fill in with jail upgrade example when behavior is firm.
-\" .El
+.Sh EXAMPLES
+Create a boot environment, named with today's date,
+containing snapshots of the root dataset and of all child datasets:
+.Pp
+.Dl bectl create -r `date +%Y%m%d`
+.Pp
+Mount a previous boot environment,
+.Ar yesterdaysbe ,
+to
+.Pa /mnt :
+.Pp
+.Dl bectl mount yesterdaysbe /mnt
+.\" To fill in with jail upgrade example when behavior is firm.
.Sh SEE ALSO
.Xr libbe 3 ,
.Xr zfsprops 7 ,
.Xr beinstall.sh 8 ,
.Xr jail 8 ,
+.Xr loader 8 ,
.Xr zfs 8 ,
.Xr zpool 8
.Sh HISTORY
.Nm
-is based on
-.Xr beadm 1
-and was implemented as a project for the 2017 Summer of Code, along with
-.Xr libbe 3 .
-.Sh AUTHORS
-.Nm
-was written by
-.An Kyle Kneitinger (kneitinger) Aq Mt kyle@kneit.in .
-.Pp
-.Xr beadm 1
-was written and is maintained by
-.An Slawomir Wojciech Wojtczak (vermaden) Aq Mt vermaden@interia.pl .
+and
+.Xr libbe 3
+were written by
+.An Kyle Kneitinger (kneitinger) Aq Mt kyle@kneit.in
+as a 2017 Google Summer of Code project, with
+.An Allan Jude (allanjude) Aq Mt allanjude@freebsd.org
+as mentor.
.Pp
+.Nm
+and this manual page were derived from
+.Xr beadm 8 .
+.Sh AUTHORS
+.An Slawomir Wojciech Wojtczak (vermaden) Aq Mt vermaden@interia.pl
+is the creator and maintainer of
+.Xr beadm 8 .
.An Bryan Drewery (bdrewery) Aq Mt bryan@shatow.net
-wrote the original
-.Xr beadm 1
-manual page that this one is derived from.
+contributed child dataset fixes, and wrote the
+.Xr beadm 8
+manual page.
+.Pp
+Most later changes to
+.Nm ,
+and to this page, were written by
+.An Kyle Evans (kevans) Aq Mt kevans@freebsd.org .
diff --git a/sbin/bectl/bectl.c b/sbin/bectl/bectl.c
index 287eeaf29fab..95715b34336b 100644
--- a/sbin/bectl/bectl.c
+++ b/sbin/bectl/bectl.c
@@ -1,31 +1,9 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
+/*
* Copyright (c) 2017 Kyle J. Kneitinger <kyle@kneit.in>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-2-Clause
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/mount.h>
#include <errno.h>
@@ -65,7 +43,7 @@ usage(bool explicit)
fp = explicit ? stdout : stderr;
fprintf(fp, "%s",
- "Usage:\tbectl {-h | -? | subcommand [args...]}\n"
+ "Usage:\tbectl {-h | subcommand [args...]}\n"
#if SOON
"\tbectl [-r beroot] add (path)*\n"
#endif
@@ -115,7 +93,9 @@ static struct command_map_entry command_map[] =
{ "mount", bectl_cmd_mount, false },
{ "rename", bectl_cmd_rename, false },
{ "unjail", bectl_cmd_unjail, false },
+ { "ujail", bectl_cmd_unjail, false },
{ "unmount", bectl_cmd_unmount, false },
+ { "umount", bectl_cmd_unmount, false },
{ "check", bectl_cmd_check, true },
};
@@ -178,13 +158,15 @@ bectl_cmd_activate(int argc, char *argv[])
/* activate logic goes here */
if ((err = be_activate(be, argv[0], temp)) != 0)
/* XXX TODO: more specific error msg based on err */
- printf("Did not successfully activate boot environment %s\n",
+ printf("Did not successfully activate boot environment %s",
argv[0]);
else
- printf("Successfully activated boot environment %s\n", argv[0]);
+ printf("Successfully activated boot environment %s", argv[0]);
if (temp)
- printf("for next boot\n");
+ printf(" for next boot");
+
+ printf("\n");
return (err);
}
@@ -440,7 +422,7 @@ bectl_cmd_mount(int argc, char *argv[])
switch (err) {
case BE_ERR_SUCCESS:
- printf("Successfully mounted %s at %s\n", bootenv, result_loc);
+ printf("%s\n", result_loc);
break;
default:
fprintf(stderr,
@@ -546,36 +528,30 @@ main(int argc, char *argv[])
{
struct command_map_entry *cmd;
const char *command;
- char *root;
- int rc;
-
- cmd = NULL;
- root = NULL;
- if (argc < 2)
- return (usage(false));
+ char *root = NULL;
+ int opt, rc;
- if (strcmp(argv[1], "-r") == 0) {
- if (argc < 4)
- return (usage(false));
- root = strdup(argv[2]);
- command = argv[3];
- argc -= 3;
- argv += 3;
- } else {
- command = argv[1];
- argc -= 1;
- argv += 1;
+ while ((opt = getopt(argc, argv, "hr:")) != -1) {
+ switch (opt) {
+ case 'h':
+ exit(usage(true));
+ case 'r':
+ root = strdup(optarg);
+ break;
+ default:
+ exit(usage(false));
+ }
}
- /* Handle command aliases */
- if (strcmp(command, "umount") == 0)
- command = "unmount";
+ argc -= optind;
+ argv += optind;
- if (strcmp(command, "ujail") == 0)
- command = "unjail";
+ if (argc == 0)
+ exit(usage(false));
- if ((strcmp(command, "-?") == 0) || (strcmp(command, "-h") == 0))
- return (usage(true));
+ command = *argv;
+ optreset = 1;
+ optind = 1;
if ((cmd = get_cmd_info(command)) == NULL) {
fprintf(stderr, "Unknown command: %s\n", command);
diff --git a/sbin/bectl/bectl.h b/sbin/bectl/bectl.h
index b8b824b18010..355110bcd6d3 100644
--- a/sbin/bectl/bectl.h
+++ b/sbin/bectl/bectl.h
@@ -1,28 +1,7 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
+/*
* Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-2-Clause
*/
int usage(bool explicit);
diff --git a/sbin/bectl/bectl_jail.c b/sbin/bectl/bectl_jail.c
index ae48202163de..050d46b627b4 100644
--- a/sbin/bectl/bectl_jail.c
+++ b/sbin/bectl/bectl_jail.c
@@ -1,31 +1,9 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
+/*
* Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-2-Clause
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/jail.h>
#include <sys/mount.h>
diff --git a/sbin/bectl/bectl_list.c b/sbin/bectl/bectl_list.c
index 0fcb5deb37f3..bd724b7bf012 100644
--- a/sbin/bectl/bectl_list.c
+++ b/sbin/bectl/bectl_list.c
@@ -1,31 +1,9 @@
-/*-
- * SPDX-License-Identifier: BSD-2-Clause
- *
+/*
* Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-2-Clause
*/
-#include <sys/cdefs.h>
#include <sys/param.h>
#include <stdbool.h>
#include <stdio.h>
diff --git a/sbin/bectl/tests/Makefile b/sbin/bectl/tests/Makefile
index 5da29657bea1..3a35a5263a69 100644
--- a/sbin/bectl/tests/Makefile
+++ b/sbin/bectl/tests/Makefile
@@ -1,4 +1,3 @@
-
PACKAGE= tests
ATF_TESTS_SH+= bectl_test
diff --git a/sbin/bectl/tests/Makefile.depend b/sbin/bectl/tests/Makefile.depend
new file mode 100644
index 000000000000..11aba52f82cf
--- /dev/null
+++ b/sbin/bectl/tests/Makefile.depend
@@ -0,0 +1,10 @@
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/sbin/bectl/tests/bectl_test.sh b/sbin/bectl/tests/bectl_test.sh
index 0f167829cf46..8084b0a173f4 100755
--- a/sbin/bectl/tests/bectl_test.sh
+++ b/sbin/bectl/tests/bectl_test.sh
@@ -1,28 +1,7 @@
#
-# SPDX-License-Identifier: BSD-2-Clause
-#
# Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
+# SPDX-License-Identifier: BSD-2-Clause
#
ZPOOL_NAME_FILE=zpool_name
@@ -93,7 +72,6 @@ bectl_cleanup()
atf_test_case bectl_create cleanup
bectl_create_head()
{
-
atf_set "descr" "Check the various forms of bectl create"
atf_set "require.user" root
}
@@ -157,7 +135,6 @@ bectl_create_cleanup()
atf_test_case bectl_destroy cleanup
bectl_destroy_head()
{
-
atf_set "descr" "Check bectl destroy"
atf_set "require.user" root
}
@@ -240,14 +217,12 @@ bectl_destroy_body()
}
bectl_destroy_cleanup()
{
-
bectl_cleanup $(get_zpool_name)
}
atf_test_case bectl_export_import cleanup
bectl_export_import_head()
{
-
atf_set "descr" "Check bectl export and import"
atf_set "require.user" root
}
@@ -278,14 +253,12 @@ bectl_export_import_body()
}
bectl_export_import_cleanup()
{
-
bectl_cleanup $(get_zpool_name)
}
atf_test_case bectl_list cleanup
bectl_list_head()
{
-
atf_set "descr" "Check bectl list"
atf_set "require.user" root
}
@@ -323,14 +296,12 @@ bectl_list_body()
}
bectl_list_cleanup()
{
-
bectl_cleanup $(get_zpool_name)
}
atf_test_case bectl_mount cleanup
bectl_mount_head()
{
-
atf_set "descr" "Check bectl mount/unmount"
atf_set "require.user" root
}
@@ -367,14 +338,12 @@ bectl_mount_body()
}
bectl_mount_cleanup()
{
-
bectl_cleanup $(get_zpool_name)
}
atf_test_case bectl_rename cleanup
bectl_rename_head()
{
-
atf_set "descr" "Check bectl rename"
atf_set "require.user" root
}
@@ -403,14 +372,12 @@ bectl_rename_body()
}
bectl_rename_cleanup()
{
-
bectl_cleanup $(get_zpool_name)
}
atf_test_case bectl_jail cleanup
bectl_jail_head()
{
-
atf_set "descr" "Check bectl rename"
atf_set "require.user" root
atf_set "require.progs" jail
@@ -577,6 +544,94 @@ bectl_promotion_cleanup()
bectl_cleanup $(get_zpool_name)
}
+atf_test_case bectl_destroy_bootonce cleanup
+bectl_destroy_bootonce_head()
+{
+ atf_set "descr" "Check bectl destroy (bootonce)"
+ atf_set "require.user" root
+}
+bectl_destroy_bootonce_body()
+{
+ if [ "$(atf_config_get ci false)" = "true" ] && \
+ [ "$(uname -p)" = "i386" ]; then
+ atf_skip "https://bugs.freebsd.org/249055"
+ fi
+
+ if [ "$(atf_config_get ci false)" = "true" ] && \
+ [ "$(uname -p)" = "armv7" ]; then
+ atf_skip "https://bugs.freebsd.org/249229"
+ fi
+
+ cwd=$(realpath .)
+ zpool=$(make_zpool_name)
+ disk=${cwd}/disk.img
+ mount=${cwd}/mnt
+ root=${mount}/root
+
+ be=default2
+
+ bectl_create_setup ${zpool} ${disk} ${mount}
+ atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
+
+ # Create boot environment and bootonce activate it
+ atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
+ atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
+
+ # Destroy it
+ atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT destroy ${be}
+
+ # Should be empty
+ atf_check -s exit:0 -o empty zfsbootcfg -z ${zpool}
+}
+bectl_destroy_bootonce_cleanup()
+{
+ bectl_cleanup $(get_zpool_name)
+}
+
+atf_test_case bectl_rename_bootonce cleanup
+bectl_rename_bootonce_head()
+{
+ atf_set "descr" "Check bectl destroy (bootonce)"
+ atf_set "require.user" root
+}
+bectl_rename_bootonce_body()
+{
+ if [ "$(atf_config_get ci false)" = "true" ] && \
+ [ "$(uname -p)" = "i386" ]; then
+ atf_skip "https://bugs.freebsd.org/249055"
+ fi
+
+ if [ "$(atf_config_get ci false)" = "true" ] && \
+ [ "$(uname -p)" = "armv7" ]; then
+ atf_skip "https://bugs.freebsd.org/249229"
+ fi
+
+ cwd=$(realpath .)
+ zpool=$(make_zpool_name)
+ disk=${cwd}/disk.img
+ mount=${cwd}/mnt
+ root=${mount}/root
+
+ be=default2
+
+ bectl_create_setup ${zpool} ${disk} ${mount}
+ atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
+
+ # Create boot environment and bootonce activate it
+ atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
+ atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
+
+ # Rename it
+ atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT rename ${be} ${be}_renamed
+
+ # Should be renamed
+ atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}_renamed:\n" zfsbootcfg -z ${zpool}
+}
+bectl_rename_bootonce_cleanup()
+{
+ bectl_cleanup $(get_zpool_name)
+}
+
atf_init_test_cases()
{
atf_add_test_case bectl_create
@@ -587,4 +642,6 @@ atf_init_test_cases()
atf_add_test_case bectl_rename
atf_add_test_case bectl_jail
atf_add_test_case bectl_promotion
+ atf_add_test_case bectl_destroy_bootonce
+ atf_add_test_case bectl_rename_bootonce
}