public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Reiter <s.reiter@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup-restore-image 2/5] build custom ZFS tools without udev requirement
Date: Wed, 16 Jun 2021 12:55:49 +0200	[thread overview]
Message-ID: <20210616105552.2594536-3-s.reiter@proxmox.com> (raw)
In-Reply-To: <20210616105552.2594536-1-s.reiter@proxmox.com>

We already include the required sources with the zfsonlinux submodule,
so apply a patch to disable linking against libudev (as I couldn't find
a working configure flag for it?) and build the user space part as well.

Includes dependencies as well as 'strace' for the debug initramfs, which
proved quite useful for debugging.

The init-shim automatically creates the necessary /dev/zfs device node,
and additionally /dev/null to make rust's std::process::Command happy.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---
 src/Makefile                                  | 21 +++++++-
 src/build_initramfs.sh                        | 19 ++++++-
 src/init-shim-rs/src/main.rs                  | 10 ++++
 .../0001-remove-reference-to-libudev.patch    | 52 +++++++++++++++++++
 4 files changed, 100 insertions(+), 2 deletions(-)
 create mode 100644 src/patches/zfs/0001-remove-reference-to-libudev.patch

diff --git a/src/Makefile b/src/Makefile
index a398ea1..053be5f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -11,6 +11,8 @@ KERNEL_IMG=${BUILDDIR}/bzImage
 INITRAMFS_IMG=${INITRAMFS_BUILDDIR}/initramfs.img
 INITRAMFS_IMG_DBG=${INITRAMFS_BUILDDIR}/initramfs-debug.img
 
+ZFS_TOOLS=${BUILDDIR}/zfstools
+
 CONFIG=config-base
 
 RUST_SRC=$(wildcard ${SHIM_DIR}/**/*.rs) ${SHIM_DIR}/Cargo.toml
@@ -35,6 +37,10 @@ kernel.prepared: ${BUILDDIR}.prepared
 	touch $@
 
 zfs.prepared: kernel.prepared
+	cd ${BUILDDIR}/${ZFSONLINUX_SUBMODULE}; \
+	    for p in ../../patches/zfs/*.patch; do \
+	        patch -Np1 < $$p; \
+	    done
 	cd ${BUILDDIR}/${ZFSONLINUX_SUBMODULE}; \
 	    sh autogen.sh && \
 	    ./configure \
@@ -51,7 +57,20 @@ ${KERNEL_IMG}: zfs.prepared
 	cd ${BUILDDIR}/${KERNEL_SUBMODULE}; $(MAKE)
 	mv ${BUILDDIR}/${KERNEL_SUBMODULE}/arch/x86/boot/bzImage ${KERNEL_IMG}
 
-${INITRAMFS_IMG}: ${BUILDDIR}.prepared ${RUST_SRC} build_initramfs.sh
+${ZFS_TOOLS}: zfs.prepared
+	cd ${BUILDDIR}/${ZFSONLINUX_SUBMODULE}; \
+	    ./configure \
+	        --bindir=/usr/bin \
+	        --sbindir=/sbin \
+	        --libdir=/lib/"$(DEB_HOST_MULTIARCH)" \
+	        --with-zfsexecdir=/usr/lib/zfs-linux \
+	        --disable-systemd \
+	        --disable-pyzfs \
+	        --with-config=user
+	# absolute path required for 'make install'
+	$(MAKE) -C ${BUILDDIR}/${ZFSONLINUX_SUBMODULE} install DESTDIR=${PWD}/${ZFS_TOOLS}
+
+${INITRAMFS_IMG}: ${BUILDDIR}.prepared ${RUST_SRC} build_initramfs.sh ${ZFS_TOOLS}
 	cd ${SHIM_DIR}; cargo build --release
 	sh build_initramfs.sh
 
diff --git a/src/build_initramfs.sh b/src/build_initramfs.sh
index c4ee95c..29eeedb 100755
--- a/src/build_initramfs.sh
+++ b/src/build_initramfs.sh
@@ -19,9 +19,10 @@ add_pkgs() {
         LOCAL_DEPS=$(apt-rdepends -f Depends -s Depends "$pkg" | grep -v '^ ')
         DEPS="$DEPS $LOCAL_DEPS"
     done
-    # debconf and gcc are unnecessary
+    # debconf and gcc are unnecessary, libboost-regex doesn't install on bullseye
     DEPS=$(echo "$DEPS" |\
         sed -E 's/debconf(-2\.0)?//' |\
+        sed -E 's/libboost-regex//' |\
         sed -E 's/gcc-.{1,2}-base//')
     apt-get download $DEPS
     for deb in ./*.deb; do
@@ -47,8 +48,23 @@ add_pkgs "
     libstdc++6:amd64 \
     libssl1.1:amd64 \
     libacl1:amd64 \
+    libblkid1:amd64 \
+    libuuid1:amd64 \
+    zlib1g:amd64 \
 "
+
+# install custom ZFS tools (built without libudev)
+mkdir -p "$ROOT/sbin"
+cp -a ../zfstools/sbin/* "$ROOT/sbin/"
+cp -a ../zfstools/etc/* "$ROOT/etc/"
+cp -a ../zfstools/lib/* "$ROOT/lib/"
+cp -a ../zfstools/usr/* "$ROOT/usr/"
+
 rm -rf ${ROOT:?}/usr/share # contains only docs and debian stuff
+rm -rf ${ROOT:?}/usr/local/include # header files
+rm -rf ${ROOT:?}/usr/local/share # mostly ZFS tests
+rm -f ${ROOT:?}/lib/x86_64-linux-gnu/*.a # static libraries
+
 make_cpio "initramfs.img"
 
 # add debug helpers for debug initramfs, packages from above are included too
@@ -56,6 +72,7 @@ add_pkgs "
     util-linux:amd64 \
     busybox-static:amd64 \
     gdb:amd64 \
+    strace:amd64 \
 "
 # leave /usr/share here, it contains necessary stuff for gdb
 make_cpio "initramfs-debug.img"
diff --git a/src/init-shim-rs/src/main.rs b/src/init-shim-rs/src/main.rs
index 641218f..62d7e99 100644
--- a/src/init-shim-rs/src/main.rs
+++ b/src/init-shim-rs/src/main.rs
@@ -6,6 +6,10 @@ use std::process::Command;
 
 const URANDOM_MAJ: u64 = 1;
 const URANDOM_MIN: u64 = 9;
+const ZFS_MAJ: u64 = 10;
+const ZFS_MIN: u64 = 249;
+const NULL_MAJ: u64 = 1;
+const NULL_MIN: u64 = 3;
 
 /// Set up a somewhat normal linux userspace environment before starting the restore daemon, and
 /// provide error messages to the user if doing so fails.
@@ -22,6 +26,12 @@ fn main() {
     wrap_err("mknod /dev/urandom", || {
         do_mknod("/dev/urandom", URANDOM_MAJ, URANDOM_MIN)
     });
+    wrap_err("mknod /dev/zfs", || {
+        do_mknod("/dev/zfs", ZFS_MAJ, ZFS_MIN)
+    });
+    wrap_err("mknod /dev/null", || {
+        do_mknod("/dev/null", NULL_MAJ, NULL_MIN)
+    });
 
     if let Err(err) = run_agetty() {
         // not fatal
diff --git a/src/patches/zfs/0001-remove-reference-to-libudev.patch b/src/patches/zfs/0001-remove-reference-to-libudev.patch
new file mode 100644
index 0000000..467d9b5
--- /dev/null
+++ b/src/patches/zfs/0001-remove-reference-to-libudev.patch
@@ -0,0 +1,52 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Stefan Reiter <s.reiter@proxmox.com>
+Date: Thu, 10 Jun 2021 10:50:22 +0200
+Subject: [PATCH] remove reference to libudev
+
+since there's no command line flag I can see...
+
+Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
+---
+ config/user-libudev.m4 | 17 -----------------
+ config/user.m4         |  1 -
+ 2 files changed, 18 deletions(-)
+ delete mode 100644 config/user-libudev.m4
+
+diff --git a/config/user-libudev.m4 b/config/user-libudev.m4
+deleted file mode 100644
+index 8c3c1d7e0..000000000
+--- a/config/user-libudev.m4
++++ /dev/null
+@@ -1,17 +0,0 @@
+-dnl #
+-dnl # Check for libudev - needed for vdev auto-online and auto-replace
+-dnl #
+-AC_DEFUN([ZFS_AC_CONFIG_USER_LIBUDEV], [
+-	ZFS_AC_FIND_SYSTEM_LIBRARY(LIBUDEV, [libudev], [libudev.h], [], [udev], [], [user_libudev=yes], [user_libudev=no])
+-
+-	AS_IF([test "x$user_libudev" = xyes], [
+-	    AX_SAVE_FLAGS
+-
+-	    CFLAGS="$CFLAGS $LIBUDEV_CFLAGS"
+-	    LIBS="$LIBUDEV_LIBS $LIBS"
+-
+-	    AC_CHECK_FUNCS([udev_device_get_is_initialized])
+-
+-	    AX_RESTORE_FLAGS
+-	])
+-])
+diff --git a/config/user.m4 b/config/user.m4
+index c22067551..1b6d3a24e 100644
+--- a/config/user.m4
++++ b/config/user.m4
+@@ -18,7 +18,6 @@ AC_DEFUN([ZFS_AC_CONFIG_USER], [
+ 		ZFS_AC_CONFIG_USER_LIBBLKID
+ 	])
+ 	ZFS_AC_CONFIG_USER_LIBTIRPC
+-	ZFS_AC_CONFIG_USER_LIBUDEV
+ 	ZFS_AC_CONFIG_USER_LIBCRYPTO
+ 	ZFS_AC_CONFIG_USER_LIBAIO
+ 	ZFS_AC_CONFIG_USER_CLOCK_GETTIME
+-- 
+2.30.2
+
-- 
2.30.2





  parent reply	other threads:[~2021-06-16 10:56 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-16 10:55 [pbs-devel] [PATCH 0/5] ZFS support for single file restore Stefan Reiter
2021-06-16 10:55 ` [pbs-devel] [PATCH proxmox-backup-restore-image 1/5] debian: update control for bullseye Stefan Reiter
2021-06-16 10:55 ` Stefan Reiter [this message]
2021-06-16 10:55 ` [pbs-devel] [PATCH proxmox-backup 3/5] file-restore: increase RAM for ZFS and disable ARC Stefan Reiter
2021-06-16 10:55 ` [pbs-devel] [PATCH proxmox-backup 4/5] file-restore/disk: support ZFS pools Stefan Reiter
2021-06-16 10:55 ` [pbs-devel] [PATCH proxmox-backup 5/5] file-restore/disk: support ZFS subvols with mountpoint=legacy Stefan Reiter
2021-06-28 12:26 ` [pbs-devel] applied-series: [PATCH 0/5] ZFS support for single file restore Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210616105552.2594536-3-s.reiter@proxmox.com \
    --to=s.reiter@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal