From c8289690365887ca1dd122645e479a89cf7cd969 Mon Sep 17 00:00:00 2001
From: Hartmut Goebel <h.goebel@crazy-compilers.com>
Date: Wed, 25 Oct 2017 18:13:15 +0200
Subject: build: Use overlayfs instead of unionfs.

Overlayfs is part of the kernel, while unionfs needs FUSE.  This also reduces
the size of the initrd by ca. 4.3% (487K).

* gnu/build/linux-boot.scm (mount-root-file-system): Remove optional parameter
  "unionfs"; mount using overlayfs instead of unionfs; new directory layout
  requied by overlayfs; update documentation.
  [mark-as-not-killable]: Remove now unused function

* gnu/system/linux-initrd.scm (file-system-packages): Remove now unused
  packages "unionfs-fuse/static" and thus unused related 'if'.
  (linux-modules): Replace "fuse" by "overlay".
---
 gnu/build/linux-boot.scm    | 43 +++++++++++++------------------------------
 gnu/system/linux-initrd.scm |  5 +----
 2 files changed, 14 insertions(+), 34 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 3712abe910..a1ff4dd1ea 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -241,20 +241,10 @@ (define (pidof program)
           (filter-map string->number (scandir "/proc")))))
 
 (define* (mount-root-file-system root type
-                                 #:key volatile-root? (unionfs "unionfs"))
+                                 #:key volatile-root?)
   "Mount the root file system of type TYPE at device ROOT.  If VOLATILE-ROOT?
-is true, mount ROOT read-only and make it a union with a writable tmpfs using
-UNIONFS."
-  (define (mark-as-not-killable pid)
-    ;; Tell the 'user-processes' shepherd service that PID must be kept alive
-    ;; when shutting down.
-    (mkdir-p "/root/etc/shepherd")
-    (let ((port (open-file "/root/etc/shepherd/do-not-kill" "a")))
-      (chmod port #o600)
-      (write pid port)
-      (newline port)
-      (close-port port)))
-
+is true, mount ROOT read-only and make it a overlay with a writable tmpfs
+using the kernel build-in overlayfs."
   (if volatile-root?
       (begin
         (mkdir-p "/real-root")
@@ -262,24 +252,17 @@ (define (mark-as-not-killable pid)
         (mkdir-p "/rw-root")
         (mount "none" "/rw-root" "tmpfs")
 
+        ;; Create the upperdir and the workdir of the overlayfs
+        (mkdir-p "/rw-root/upper")
+        (mkdir-p "/rw-root/work")
+
         ;; We want read-write /dev nodes.
-        (mkdir-p "/rw-root/dev")
-        (mount "none" "/rw-root/dev" "devtmpfs")
-
-        ;; Make /root a union of the tmpfs and the actual root.  Use
-        ;; 'max_files' to set a high RLIMIT_NOFILE for the unionfs process
-        ;; itself.  Failing to do that, we quickly run out of file
-        ;; descriptors; see <http://bugs.gnu.org/17827>.
-        (unless (zero? (system* unionfs "-o"
-                                "cow,allow_other,use_ino,suid,dev,max_files=65536"
-                                "/rw-root=RW:/real-root=RO"
-                                "/root"))
-          (error "unionfs failed"))
-
-        ;; Make sure unionfs remains alive till the end.  Because
-        ;; 'fuse_daemonize' doesn't tell the PID of the forked daemon, we
-        ;; have to resort to 'pidof' here.
-        (mark-as-not-killable (pidof unionfs)))
+        (mkdir-p "/rw-root/upper/dev")
+        (mount "none" "/rw-root/upper/dev" "devtmpfs")
+
+        ;; Make /root an overlay of the tmpfs and the actual root.
+        (mount "none" "/root" "overlay" 0
+               "lowerdir=/real-root,upperdir=/rw-root/upper,workdir=/rw-root/work"))
       (begin
         (check-file-system root type)
         (mount root "/root" type)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 948c543a15..b592defa45 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -234,9 +234,6 @@ (define* (file-system-packages file-systems #:key (volatile-root? #f))
           '())
     ,@(if (find (file-system-type-predicate "btrfs") file-systems)
           (list btrfs-progs/static)
-          '())
-    ,@(if volatile-root?
-          (list unionfs-fuse/static)
           '())))
 
 (define* (base-initrd file-systems
@@ -308,7 +305,7 @@ (define linux-modules
             '("isofs")
             '())
       ,@(if volatile-root?
-            '("fuse")
+            '("overlay")
             '())
       ,@extra-modules))
 
-- 
cgit v1.2.3