From c54eb790633c85bc22c4328e0f035cfa0be06780 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 21 May 2014 15:19:01 +0200 Subject: [PATCH] Don't kill unionfs-fuse during shutdown Killing the daemon backing /nix/store prevents a clean shutdown. See http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/ --- nixos/modules/system/boot/stage-1-init.sh | 5 +++-- pkgs/tools/filesystems/unionfs-fuse/default.nix | 8 ++++++++ .../unionfs-fuse/prevent-kill-on-shutdown.patch | 14 ++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 pkgs/tools/filesystems/unionfs-fuse/prevent-kill-on-shutdown.patch diff --git a/nixos/modules/system/boot/stage-1-init.sh b/nixos/modules/system/boot/stage-1-init.sh index c4a21b02cac3..15586e68e7e5 100644 --- a/nixos/modules/system/boot/stage-1-init.sh +++ b/nixos/modules/system/boot/stage-1-init.sh @@ -58,6 +58,7 @@ echo mkdir -p /etc touch /etc/fstab # to shut up mount touch /etc/mtab # to shut up mke2fs +touch /etc/initrd-release mkdir -p /proc mount -t proc none /proc mkdir -p /sys @@ -345,8 +346,8 @@ exec 3>&- udevadm control --exit || true # Kill any remaining processes, just to be sure we're not taking any -# with us into stage 2. unionfs-fuse mounts require the unionfs process. -pkill -9 -v '(1|unionfs)' +# with us into stage 2. But keep storage daemons like unionfs-fuse. +pkill -9 -v -f '@' if test -n "$debug1mounts"; then fail; fi diff --git a/pkgs/tools/filesystems/unionfs-fuse/default.nix b/pkgs/tools/filesystems/unionfs-fuse/default.nix index 4da1a84e937a..bff5aaf242ba 100644 --- a/pkgs/tools/filesystems/unionfs-fuse/default.nix +++ b/pkgs/tools/filesystems/unionfs-fuse/default.nix @@ -8,6 +8,14 @@ stdenv.mkDerivation rec { sha256 = "0qpnr4czgc62vsfnmv933w62nq3xwcbnvqch72qakfgca75rsp4d"; }; + patches = + [ # Prevent the unionfs daemon from being killed during + # shutdown. See + # http://www.freedesktop.org/wiki/Software/systemd/RootStorageDaemons/ + # for details. + ./prevent-kill-on-shutdown.patch + ]; + buildInputs = [ cmake fuse ]; # Put the unionfs mount helper in place as mount.unionfs-fuse. This makes it diff --git a/pkgs/tools/filesystems/unionfs-fuse/prevent-kill-on-shutdown.patch b/pkgs/tools/filesystems/unionfs-fuse/prevent-kill-on-shutdown.patch new file mode 100644 index 000000000000..0a98b83282b6 --- /dev/null +++ b/pkgs/tools/filesystems/unionfs-fuse/prevent-kill-on-shutdown.patch @@ -0,0 +1,14 @@ +diff -ru -x '*~' unionfs-fuse-0.26-orig/src/unionfs.c unionfs-fuse-0.26/src/unionfs.c +--- unionfs-fuse-0.26-orig/src/unionfs.c 2012-09-11 00:06:32.000000000 +0200 ++++ unionfs-fuse-0.26/src/unionfs.c 2014-05-21 14:22:03.597861805 +0200 +@@ -831,6 +831,10 @@ + } + #endif + ++ /* Prevent systemd's shutdown from killing us. */ ++ if (access("/etc/initrd-release", F_OK) >= 0) ++ argv[0][0] = '@'; ++ + umask(0); + int res = fuse_main(args.argc, args.argv, &unionfs_oper, NULL); + RETURN(uopt.doexit ? uopt.retval : res);