From 6004973264d7cd61f75b1a4479bf825be1c15669 Mon Sep 17 00:00:00 2001 From: Chris Wedgwood Date: Wed, 22 May 2019 22:56:37 -0700 Subject: [PATCH] [RFC] 'Fixes' for initramfs creation *** INCOMPLETE *** This is not entirely correct, it works in some cases for me, though not reliably, it seems I have to ./autogen.sh twice to get the files in etc/init.d/ created and put in place for the initramfs Makefile. zfs-functions is required, copy to /etc/zfs/ The zfs hook that copies files will error on critical files. The argument for this is we do not want to create a non-functional initramfs. Some files are optional, those we do silently ignore. --- contrib/initramfs/Makefile.am | 23 +++++++++++++++-------- contrib/initramfs/hooks/zfs.in | 20 +++++++++++++++++--- rpm/generic/zfs.spec.in | 2 ++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/contrib/initramfs/Makefile.am b/contrib/initramfs/Makefile.am index 87ec7a86f5ac..119fb64d77fb 100644 --- a/contrib/initramfs/Makefile.am +++ b/contrib/initramfs/Makefile.am @@ -3,21 +3,28 @@ initrddir = $(datarootdir)/initramfs-tools initrd_SCRIPTS = \ conf.d/zfs conf-hooks.d/zfs hooks/zfs scripts/zfs scripts/local-top/zfs -SUBDIRS = hooks scripts +SUBDIRS = hooks scripts ../../etc EXTRA_DIST = \ + $(top_srcdir)/etc/init.d/zfs \ + $(top_srcdir)/etc/init.d/zfs-functions \ $(top_srcdir)/contrib/initramfs/conf.d/zfs \ $(top_srcdir)/contrib/initramfs/conf-hooks.d/zfs \ $(top_srcdir)/contrib/initramfs/README.initramfs.markdown install-initrdSCRIPTS: $(EXTRA_DIST) for d in conf.d conf-hooks.d hooks scripts scripts/local-top; do \ - $(MKDIR_P) $(DESTDIR)$(initrddir)/$$d; \ - cp $(top_srcdir)/contrib/initramfs/$$d/zfs \ + $(MKDIR_P) -v $(DESTDIR)$(initrddir)/$$d; \ + cp -v $(top_srcdir)/contrib/initramfs/$$d/zfs \ $(DESTDIR)$(initrddir)/$$d/; \ done - if [ -f etc/init.d/zfs ]; then \ - $(MKDIR_P) $(DESTDIR)$(DEFAULT_INITCONF_DIR); \ - cp $(top_srcdir)/etc/init.d/zfs \ - $(DESTDIR)$(DEFAULT_INITCONF_DIR)/; \ - fi + + $(MKDIR_P) -v $(DESTDIR)$(DEFAULT_INITCONF_DIR) $(DESTDIR)/etc/zfs/ + + cp -v $(top_srcdir)/etc/init.d/zfs \ + $(DESTDIR)$(DEFAULT_INITCONF_DIR)/ + + $(MKDIR_P) -v $(DESTDIR)/etc/init.d/ + + cp -v $(top_srcdir)/etc/init.d/zfs-functions \ + $(DESTDIR)/etc/init.d/ diff --git a/contrib/initramfs/hooks/zfs.in b/contrib/initramfs/hooks/zfs.in index e35354141d81..ff896e4cb28b 100755 --- a/contrib/initramfs/hooks/zfs.in +++ b/contrib/initramfs/hooks/zfs.in @@ -3,6 +3,11 @@ # Add ZoL filesystem capabilities to an initrd, usually for a native ZFS root. # +# fail on errors; this might be annoying but for now it's more +# important to fail during initramfs creation where we can do +# something about it, vs after a boot when we can't +set -eu + # This hook installs udev rules for ZoL. PREREQ="zdev" @@ -10,12 +15,12 @@ PREREQ="zdev" # not strictly required, but it can be useful at the initramfs recovery prompt. COPY_EXEC_LIST="@sbindir@/zdb @sbindir@/zpool @sbindir@/zfs" COPY_EXEC_LIST="$COPY_EXEC_LIST @mounthelperdir@/mount.zfs @udevdir@/vdev_id" -COPY_FILE_LIST="/etc/hostid @sysconfdir@/zfs/zpool.cache" -COPY_FILE_LIST="$COPY_FILE_LIST @sysconfdir@/default/zfs" COPY_FILE_LIST="$COPY_FILE_LIST @sysconfdir@/zfs/zfs-functions" -COPY_FILE_LIST="$COPY_FILE_LIST @sysconfdir@/zfs/vdev_id.conf" COPY_FILE_LIST="$COPY_FILE_LIST @udevruledir@/69-vdev.rules" +# These are not required +OPTIONAL_FILE_LIST="/etc/hostid @sysconfdir@/default/zfs @sysconfdir@/zfs/vdev_id.conf" + # These prerequisites are provided by the base system. COPY_EXEC_LIST="$COPY_EXEC_LIST /usr/bin/dirname /bin/hostname /sbin/blkid" COPY_EXEC_LIST="$COPY_EXEC_LIST /usr/bin/env" @@ -66,6 +71,15 @@ do done for ii in $COPY_FILE_LIST +do + dir=$(dirname "$ii") + [ -d "$dir" ] && mkdir -p "$DESTDIR/$dir" + [ -f "$ii" ] && cp -p "$ii" "$DESTDIR/$ii" + # error if missing + [ -e "$ii" ] +done + +for ii in $OPTIONAL_FILE_LIST do dir=$(dirname "$ii") [ -d "$dir" ] && mkdir -p "$DESTDIR/$dir" diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in index 9faa3ba771a1..08c158935507 100644 --- a/rpm/generic/zfs.spec.in +++ b/rpm/generic/zfs.spec.in @@ -480,6 +480,8 @@ systemctl --system daemon-reload >/dev/null || true %if 0%{?_initramfs} %files initramfs %doc contrib/initramfs/README.initramfs.markdown +/etc/default/zfs +/etc/init.d/zfs-functions /usr/share/initramfs-tools/* %else # Since we're not building the initramfs package,