aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Riedesel <mark@klowner.com>2016-09-17 10:46:03 -0500
committerNatanael Copa <ncopa@alpinelinux.org>2016-12-24 13:05:24 +0000
commitbe20737c8c6ca8b4ba94302f6b6c9725bc98565d (patch)
treea292a95335041a7f5936b4d38e62f016a8f0b839
parent92801060dccf632c827867eb361396646e04ae99 (diff)
downloadmkinitfs-be20737c8c6ca8b4ba94302f6b6c9725bc98565d.tar.bz2
mkinitfs-be20737c8c6ca8b4ba94302f6b6c9725bc98565d.tar.xz
add zpool import capability
-rw-r--r--features.d/zfs.files2
-rw-r--r--features.d/zfs.modules7
-rwxr-xr-xinitramfs-init.in5
-rw-r--r--nlplug-findfs.c17
4 files changed, 29 insertions, 2 deletions
diff --git a/features.d/zfs.files b/features.d/zfs.files
new file mode 100644
index 0000000..c821e15
--- /dev/null
+++ b/features.d/zfs.files
@@ -0,0 +1,2 @@
+/usr/sbin/zfs
+/usr/sbin/zpool
diff --git a/features.d/zfs.modules b/features.d/zfs.modules
new file mode 100644
index 0000000..be5225a
--- /dev/null
+++ b/features.d/zfs.modules
@@ -0,0 +1,7 @@
+extra/avl
+extra/nvpair
+extra/spl
+extra/unicode
+extra/zcommon
+extra/zfs
+extra/zpios
diff --git a/initramfs-init.in b/initramfs-init.in
index 64b1b5b..24a25c9 100755
--- a/initramfs-init.in
+++ b/initramfs-init.in
@@ -363,6 +363,11 @@ if [ -n "$KOPT_nbd" ]; then
setup_nbd || echo "Failed to setup nbd device."
fi
+if [ "$KOPT_rootfstype" = "zfs" ]; then
+ # zpool reports /dev/zfs missing if it can't read /etc/mtab
+ ln -s /proc/mounts /etc/mtab
+fi
+
# check if root=... was set
if [ -n "$KOPT_root" ]; then
if [ "$SINGLEMODE" = "yes" ]; then
diff --git a/nlplug-findfs.c b/nlplug-findfs.c
index 7907389..7104d40 100644
--- a/nlplug-findfs.c
+++ b/nlplug-findfs.c
@@ -51,11 +51,12 @@
#define LVM_PATH "/sbin/lvm"
#define MDADM_PATH "/sbin/mdadm"
+#define ZPOOL_PATH "/usr/sbin/zpool"
static int dodebug;
static char *default_envp[2];
char *argv0;
-static int use_mdadm, use_lvm;
+static int use_mdadm, use_lvm, use_zpool;
#if defined(DEBUG)
#include <stdarg.h>
@@ -496,6 +497,15 @@ static void start_lvm2(char *devnode)
spawn_command(&spawnmgr, lvm2_argv, 0);
}
+static void start_zpool(char *uuid) {
+ char *zpool_argv[] = {
+ ZPOOL_PATH, "import", uuid,
+ NULL
+ };
+ if (use_zpool && uuid)
+ spawn_command(&spawnmgr, zpool_argv, 0);
+}
+
static int read_pass(char *pass, size_t pass_size)
{
struct termios old_flags, new_flags;
@@ -913,6 +923,7 @@ static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia
blkid_get_cache(&conf->blkid_cache, NULL);
type = blkid_get_tag_value(conf->blkid_cache, "TYPE", ev->devnode);
+ uuid = blkid_get_tag_value(conf->blkid_cache, "UUID", ev->devnode);
if (searchdev != NULL) {
if (strncmp("LABEL=", searchdev, 6) == 0) {
@@ -920,7 +931,6 @@ static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia
if (label && strcmp(label, searchdev+6) == 0)
rc = FOUND_DEVICE;
} else if (strncmp("UUID=", searchdev, 5) == 0) {
- uuid = blkid_get_tag_value(conf->blkid_cache, "UUID", ev->devnode);
if (uuid && strcmp(uuid, searchdev+5) == 0)
rc = FOUND_DEVICE;
}
@@ -934,6 +944,8 @@ static int searchdev(struct uevent *ev, const char *searchdev, int scanbootmedia
start_mdadm(ev->devnode);
} else if (strcmp("LVM2_member", type) == 0) {
start_lvm2(ev->devnode);
+ } else if (strcmp("zfs_member", type) == 0) {
+ start_zpool(uuid);
} else if (scanbootmedia) {
rc = scandev(conf, ev->devnode, type);
}
@@ -1133,6 +1145,7 @@ int main(int argc, char *argv[])
conf.uevent_timeout = DEFAULT_EVENT_TIMEOUT;
use_lvm = access(LVM_PATH, X_OK) == 0;
use_mdadm = access(MDADM_PATH, X_OK) == 0;
+ use_zpool = access(ZPOOL_PATH, X_OK) == 0;
argv0 = strrchr(argv[0], '/');
if (argv0++ == NULL)