diff options
author | Mark Riedesel <mark@klowner.com> | 2016-09-17 10:46:03 -0500 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2016-12-24 13:05:24 +0000 |
commit | be20737c8c6ca8b4ba94302f6b6c9725bc98565d (patch) | |
tree | a292a95335041a7f5936b4d38e62f016a8f0b839 | |
parent | 92801060dccf632c827867eb361396646e04ae99 (diff) | |
download | mkinitfs-be20737c8c6ca8b4ba94302f6b6c9725bc98565d.tar.bz2 mkinitfs-be20737c8c6ca8b4ba94302f6b6c9725bc98565d.tar.xz |
add zpool import capability
-rw-r--r-- | features.d/zfs.files | 2 | ||||
-rw-r--r-- | features.d/zfs.modules | 7 | ||||
-rwxr-xr-x | initramfs-init.in | 5 | ||||
-rw-r--r-- | nlplug-findfs.c | 17 |
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) |