diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
index ce84349586..dd1cb70da2 100644
--- a/cmd/zdb/zdb.c
+++ b/cmd/zdb/zdb.c
@@ -2394,8 +2394,8 @@ main(int argc, char **argv)
 	}
 
 	kernel_init(FREAD);
-	g_zfs = libzfs_init();
-	ASSERT(g_zfs != NULL);
+	if ((g_zfs = libzfs_init()) == NULL)
+		return (1);
 
 	for (c = 0; c < 256; c++) {
 		if (dump_all && c != 'l' && c != 'R')
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
index 618ae10225..65a1035817 100644
--- a/cmd/zfs/zfs_main.c
+++ b/cmd/zfs/zfs_main.c
@@ -4063,17 +4063,6 @@ main(int argc, char **argv)
 
 	opterr = 0;
 
-	if ((g_zfs = libzfs_init()) == NULL) {
-		(void) fprintf(stderr, gettext("internal error: failed to "
-		    "initialize ZFS library\n"));
-		return (1);
-	}
-
-	zpool_set_history_str("zfs", argc, argv, history_str);
-	verify(zpool_stage_history(g_zfs, history_str) == 0);
-
-	libzfs_print_on_error(g_zfs, B_TRUE);
-
 	if ((mnttab_file = fopen(MNTTAB, "r")) == NULL) {
 		(void) fprintf(stderr, gettext("internal error: unable to "
 		    "open %s\n"), MNTTAB);
@@ -4119,9 +4108,18 @@ main(int argc, char **argv)
 		/*
 		 * Special case '-?'
 		 */
-		if (strcmp(cmdname, "-?") == 0)
+		if ((strcmp(cmdname, "-?") == 0) ||
+		    (strcmp(cmdname, "--help") == 0))
 			usage(B_TRUE);
 
+		if ((g_zfs = libzfs_init()) == NULL)
+			return (1);
+
+		zpool_set_history_str("zfs", argc, argv, history_str);
+		verify(zpool_stage_history(g_zfs, history_str) == 0);
+
+		libzfs_print_on_error(g_zfs, B_TRUE);
+
 		/*
 		 * 'volinit' and 'volfini' do not appear in the usage message,
 		 * so we have to special case them here.
diff --git a/cmd/zinject/zinject.c b/cmd/zinject/zinject.c
index 0ad8549b24..e600bbde6f 100644
--- a/cmd/zinject/zinject.c
+++ b/cmd/zinject/zinject.c
@@ -486,19 +486,6 @@ main(int argc, char **argv)
 	int ret;
 	int flags = 0;
 
-	if ((g_zfs = libzfs_init()) == NULL) {
-		(void) fprintf(stderr, "internal error: failed to "
-		    "initialize ZFS library\n");
-		return (1);
-	}
-
-	libzfs_print_on_error(g_zfs, B_TRUE);
-
-	if ((zfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
-		(void) fprintf(stderr, "failed to open ZFS device\n");
-		return (1);
-	}
-
 	if (argc == 1) {
 		/*
 		 * No arguments.  Print the available handlers.  If there are no
@@ -612,6 +599,16 @@ main(int argc, char **argv)
 	argc -= optind;
 	argv += optind;
 
+	if ((g_zfs = libzfs_init()) == NULL)
+		return (1);
+
+	libzfs_print_on_error(g_zfs, B_TRUE);
+
+	if ((zfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
+		(void) fprintf(stderr, "failed to open ZFS device\n");
+		return (1);
+	}
+
 	if (cancel != NULL) {
 		/*
 		 * '-c' is invalid with any other options.
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index 63b8086594..b154498055 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -4254,14 +4254,6 @@ main(int argc, char **argv)
 	(void) setlocale(LC_ALL, "");
 	(void) textdomain(TEXT_DOMAIN);
 
-	if ((g_zfs = libzfs_init()) == NULL) {
-		(void) fprintf(stderr, gettext("internal error: failed to "
-		    "initialize ZFS library\n"));
-		return (1);
-	}
-
-	libzfs_print_on_error(g_zfs, B_TRUE);
-
 	opterr = 0;
 
 	/*
@@ -4277,9 +4269,15 @@ main(int argc, char **argv)
 	/*
 	 * Special case '-?'
 	 */
-	if (strcmp(cmdname, "-?") == 0)
+	if ((strcmp(cmdname, "-?") == 0) ||
+	     strcmp(cmdname, "--help") == 0)
 		usage(B_TRUE);
 
+	if ((g_zfs = libzfs_init()) == NULL)
+		return (1);
+
+	libzfs_print_on_error(g_zfs, B_TRUE);
+
 	zpool_set_history_str("zpool", argc, argv, history_str);
 	verify(zpool_stage_history(g_zfs, history_str) == 0);
 
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
index d28a4f9f8e..2419e6b45d 100644
--- a/lib/libzfs/libzfs_sendrecv.c
+++ b/lib/libzfs/libzfs_sendrecv.c
@@ -39,6 +39,7 @@
 #include <sys/mntent.h>
 #include <sys/mnttab.h>
 #include <sys/avl.h>
+#include <sys/debug.h>
 #include <stddef.h>
 
 #include <libzfs.h>
diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c
index fbf00b7fbe..383e91b410 100644
--- a/lib/libzfs/libzfs_util.c
+++ b/lib/libzfs/libzfs_util.c
@@ -579,6 +579,13 @@ libzfs_init(void)
 	}
 
 	if ((hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)) < 0) {
+		(void) fprintf(stderr, gettext("Unable to open %s: %s.\n"),
+			       ZFS_DEV, strerror(errno));
+		if (errno == ENOENT)
+			(void) fprintf(stderr,
+			     gettext("Verify the ZFS module stack is "
+			     "loaded by running '/sbin/modprobe zfs'.\n"));
+
 		free(hdl);
 		return (NULL);
 	}