From f4b2c9dfe7cb63edc8059c6caeaa9de015068628 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Thu, 3 Sep 2020 04:51:36 -0700 Subject: [PATCH] cryptsetup, lvm2, systemd: Break cyclic dependency at a different point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cyclic dependency of systemd → cryptsetup → lvm2 → udev=systemd needs to be broken somewhere. The previous strategy of building cryptsetup with an lvm2 built without udev (#66856) caused the installer.luksroot test to fail. Instead, build lvm2 with a udev built without cryptsetup. Fixes #96479. Signed-off-by: Anders Kaseorg --- nixos/modules/system/boot/stage-1.nix | 8 +++----- nixos/tests/installer.nix | 1 - pkgs/top-level/all-packages.nix | 13 +++++++------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix index 1b2f22a039c..6823e12847c 100644 --- a/nixos/modules/system/boot/stage-1.nix +++ b/nixos/modules/system/boot/stage-1.nix @@ -87,9 +87,7 @@ let # copy what we need. Instead of using statically linked binaries, # we just copy what we need from Glibc and use patchelf to make it # work. - extraUtils = let - # Use lvm2 without udev support, which is the same lvm2 we already have in the closure anyways - lvm2 = pkgs.lvm2.override { udev = null; }; in pkgs.runCommandCC "extra-utils" + extraUtils = pkgs.runCommandCC "extra-utils" { nativeBuildInputs = [pkgs.buildPackages.nukeReferences]; allowedReferences = [ "out" ]; # prevent accidents like glibc being included in the initrd } @@ -113,8 +111,8 @@ let copy_bin_and_libs ${pkgs.utillinux}/sbin/blkid # Copy dmsetup and lvm. - copy_bin_and_libs ${getBin lvm2}/bin/dmsetup - copy_bin_and_libs ${getBin lvm2}/bin/lvm + copy_bin_and_libs ${getBin pkgs.lvm2}/bin/dmsetup + copy_bin_and_libs ${getBin pkgs.lvm2}/bin/lvm # Add RAID mdadm tool. copy_bin_and_libs ${pkgs.mdadm}/sbin/mdadm diff --git a/nixos/tests/installer.nix b/nixos/tests/installer.nix index f64e4101d45..bd1bf733153 100644 --- a/nixos/tests/installer.nix +++ b/nixos/tests/installer.nix @@ -317,7 +317,6 @@ let texinfo unionfs-fuse xorg.lndir - (lvm2.override { udev = null; }) # for initrd (extra-utils) # add curl so that rather than seeing the test attempt to download # curl's tarball, we see what it's trying to download diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index dffd32e9bc3..879fd4bd832 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -17246,11 +17246,7 @@ in criu = callPackage ../os-specific/linux/criu { }; - cryptsetup = callPackage ../os-specific/linux/cryptsetup { - # cryptsetup only really needs the devmapper component of cryptsetup - # but itself is used as a library in systemd (=udev) - lvm2 = lvm2.override { udev = null; }; - }; + cryptsetup = callPackage ../os-specific/linux/cryptsetup { }; cramfsprogs = callPackage ../os-specific/linux/cramfsprogs { }; @@ -18032,7 +18028,12 @@ in lsscsi = callPackage ../os-specific/linux/lsscsi { }; - lvm2 = callPackage ../os-specific/linux/lvm2 { }; + lvm2 = callPackage ../os-specific/linux/lvm2 { + # udev is the same package as systemd which depends on cryptsetup + # which depends on lvm2 again. But we only need the libudev part + # which does not depend on cryptsetup. + udev = udev.override { cryptsetup = null; }; + }; lvm2_dmeventd = callPackage ../os-specific/linux/lvm2 { enableDmeventd = true; enableCmdlib = true;