unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / Atom feed
* [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
@ 2021-01-01 12:34 raid5atemyhomework via Guix-patches via
  2021-01-01 18:28 ` raid5atemyhomework via Guix-patches via
  2021-01-08 15:51 ` bug#45592: " raid5atemyhomework via Guix-patches via
  0 siblings, 2 replies; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-01 12:34 UTC (permalink / raw)
  To: 45592

Fixes: https://issues.guix.gnu.org/45401

As suggested in https://issues.guix.gnu.org/45403#3 this instead exposes a specific `make-zfs-package` procedure that can be combined in the system configuration file in order to create a ZFS package that is intended for the specific system.
It also gives a basic documentation on how to create a ZFS package for your system.

I have not tested the ZFS *yet*, but this actually lets me compile ZFS for various kernel versions, which is an improvement over the current situation where installing ZFS is not possible at all.

From 56e108591c65ed3aed1872290133d51962acb4a2 Mon Sep 17 00:00:00 2001
From: raid5atemyhomework <raid5atemyhomework@protonmail.com>
Date: Fri, 1 Jan 2021 20:26:42 +0800
Subject: [PATCH] gnu, doc: Create and document procedure to compile ZFS for
 specific kernel.

---
 doc/guix.texi                 | 61 +++++++++++++++++++++++++++++++++++
 gnu/packages/file-systems.scm | 22 ++++++++++++-
 2 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 1081ed26a3..1f874b4ee0 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13885,6 +13885,67 @@ a file system declaration such as:
 compress-force=zstd,space_cache=v2"))
 @end lisp

+@node ZFS file system
+@subsection ZFS file system
+
+The ZFS on Linux file system cannot legally be downloaded as part of the
+Linux kernel, but you as a user can do anything on hardware you own,
+including download ZFS as source code, compile ZFS as a kernel module,
+and link it into Linux.
+
+As a large and complex kernel module, ZFS has to be compiled for a
+specific version of Linux. Often the latest ZFS package available in Guix
+cannot be compiled with the latest Linux kernel available in Guix, so
+installing the @code{zfs} package in your system configuration file will
+fail.
+
+Instead, you have to check the
+@url{https://github.com/openzfs/zfs/releases,OpenZFS release notes} for
+the specific version of ZFS that Guix has packaged to determine what
+Linux kernels you can use, then check the @code{linux-libre} packages
+that Guix has packaged, and select one you can use on your system.
+
+Then, you have to modify your system configuration file, and create a
+ZFS package that compiles using the specific Linux version you chose.
+Below is a sketch of how you would modify your @code{operating-system}
+declaration in order to set up ZFS:
+
+@lisp
+(use-modules (gnu))
+;; @dots{}
+(use-package-modules
+  ; @dots{}
+  linux
+  file-systems)
+
+;; @dots{}
+
+;; ZFS 0.8.5 is known to compile with Linux 5.9 series
+(define system-kernel linux-libre-5.9)
+(define system-zfs (make-zfs-package system-kernel))
+
+;; @dots{}
+
+(operating-system
+  (kernel system-kernel)
+  (kernel-loadable-modules (list system-zfs))
+  ;; @dots{}
+  (packages
+    (cons* system-zfs
+           ; @dots{}
+           %base-packages))
+  ;; @dots{}
+  )
+@end lisp
+
+@deffn (Scheme Procedure) make-zfs-package @var{kernel}
+This procedure creates a package which, when included as a package
+in your system, can be loaded as a kernel module for the specified
+@var{kernel}, a Linux kernel package.
+It is intended to create a system-specific ZFS kernel module for
+the Linux kernel you will use in your system.
+@end deffn
+
 @node Mapped Devices
 @section Mapped Devices

diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index 895ad069c5..ebc4bc87c1 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -951,9 +951,29 @@ APFS.")
     (description
      "ZFS on Linux is an advanced file system and volume manager which was
 originally developed for Solaris and is now maintained by the OpenZFS
-community.")
+community.
+
+DO NOT INSTALL THIS PACKAGE. Instead, refer to the 'ZFS file system' section
+of the Guix info manual for how to install ZFS.")
     (license license:cddl1.0)))

+(define-public (make-zfs-package kernel)
+  (package
+    (inherit zfs)
+    (name (string-append "zfs-for-"
+                         (package-name kernel)
+                         "-"
+                         (package-version kernel)
+                         "-version"))
+    (arguments
+      (cons* #:linux kernel (package-arguments zfs)))
+    (description
+     "ZFS on Linux is an advanced file system and volume manager which was
+originally developed for Solaris and is now maintained by the OpenZFS
+community.
+
+This package has been compiled for a specific Linux kernel.")))
+
 (define-public mergerfs
   (package
     (name "mergerfs")
--
2.29.2





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
  2021-01-01 12:34 [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel raid5atemyhomework via Guix-patches via
@ 2021-01-01 18:28 ` raid5atemyhomework via Guix-patches via
  2021-01-02 10:22   ` raid5atemyhomework via Guix-patches via
  2021-01-08 15:51 ` bug#45592: " raid5atemyhomework via Guix-patches via
  1 sibling, 1 reply; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-01 18:28 UTC (permalink / raw)
  To: 45592

The previous patch had an incorrect documentation, this patch now has more correct documentation.

I've tried this out in a QEMU image, but haven't tried formatting a ZFS device yet, however this does run `zpool list` and `zfs version` apparently correctly.


From 2e1ee359395d6d6a29f872a5452e750f0b2f8312 Mon Sep 17 00:00:00 2001
From: raid5atemyhomework <raid5atemyhomework@protonmail.com>
Date: Fri, 1 Jan 2021 20:26:42 +0800
Subject: [PATCH] gnu, doc: Create and document procedure to compile ZFS for
 specific kernel.

---
 doc/guix.texi                 | 81 +++++++++++++++++++++++++++++++++++
 gnu/packages/file-systems.scm | 22 +++++++++-
 2 files changed, 102 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 1081ed26a3..aebcf8c6cb 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13885,6 +13885,87 @@ a file system declaration such as:
 compress-force=zstd,space_cache=v2"))
 @end lisp

+@node ZFS file system
+@subsection ZFS file system
+
+The ZFS on Linux file system cannot legally be downloaded as part of the
+Linux kernel, but you as a user can do anything on hardware you own,
+including download ZFS as source code, compile ZFS as a kernel module,
+and link it into Linux.
+
+As a large and complex kernel module, ZFS has to be compiled for a
+specific version of Linux. Often the latest ZFS package available in Guix
+cannot be compiled with the latest Linux kernel available in Guix, so
+installing the @code{zfs} package in your system configuration file will
+fail.
+
+Instead, you have to check the
+@url{https://github.com/openzfs/zfs/releases,OpenZFS release notes} for
+the specific version of ZFS that Guix has packaged to determine what
+Linux kernels you can use, then check the @code{linux-libre} packages
+that Guix has packaged, and select one you can use on your system.
+
+Then, you have to modify your system configuration file, and create a
+ZFS package that compiles using the specific Linux version you chose.
+Below is a sketch of how you would modify your @code{operating-system}
+declaration in order to set up ZFS:
+
+@lisp
+(use-modules (gnu))
+;; @dots{}
+(use-service-modules
+  ; @dots{}
+  linux)
+(use-package-modules
+  ; @dots{}
+  linux
+  file-systems)
+
+;; @dots{}
+
+;;; (1) Select a specific kernel.
+(define system-kernel linux-libre-5.9)
+;;; (2) Define a ZFS package for your kernel.
+(define system-zfs (make-zfs-package system-kernel))
+
+;; @dots{}
+
+(operating-system
+  ;;; (3) Specify your selected kernel.
+  (kernel system-kernel)
+  ;;; (4) Add the "module" output of the system ZFS package to
+  ;;; the kernel-loadable modules.
+  (kernel-loadable-modules (list (list system-zfs "module")))
+
+  ;; @dots{}
+
+  (packages
+    ;;; (5) Add the system ZFS package to global packages so that
+    ;;; "zfs", "zpool" etc. commands are available.
+    (cons* system-zfs
+           ; @dots{}
+           %base-packages))
+
+  ;; @dots{}
+
+  (services
+    ;;; (6) Add a service that loads ZFS at bootup.
+    (cons* (service kernel-module-loader-service-type
+                    '("zfs"))
+           ; @dots{}
+           %base-services))
+  ;; @dots{}
+  )
+@end lisp
+
+@deffn (Scheme Procedure) make-zfs-package @var{kernel}
+This procedure creates a package which, when included as a package
+in your system, can be loaded as a kernel module for the specified
+@var{kernel}, a Linux kernel package.
+It is intended to create a system-specific ZFS kernel module for
+the Linux kernel you will use in your system.
+@end deffn
+
 @node Mapped Devices
 @section Mapped Devices

diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index 895ad069c5..ebc4bc87c1 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -951,9 +951,29 @@ APFS.")
     (description
      "ZFS on Linux is an advanced file system and volume manager which was
 originally developed for Solaris and is now maintained by the OpenZFS
-community.")
+community.
+
+DO NOT INSTALL THIS PACKAGE. Instead, refer to the 'ZFS file system' section
+of the Guix info manual for how to install ZFS.")
     (license license:cddl1.0)))

+(define-public (make-zfs-package kernel)
+  (package
+    (inherit zfs)
+    (name (string-append "zfs-for-"
+                         (package-name kernel)
+                         "-"
+                         (package-version kernel)
+                         "-version"))
+    (arguments
+      (cons* #:linux kernel (package-arguments zfs)))
+    (description
+     "ZFS on Linux is an advanced file system and volume manager which was
+originally developed for Solaris and is now maintained by the OpenZFS
+community.
+
+This package has been compiled for a specific Linux kernel.")))
+
 (define-public mergerfs
   (package
     (name "mergerfs")
--
2.29.2





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
  2021-01-01 18:28 ` raid5atemyhomework via Guix-patches via
@ 2021-01-02 10:22   ` raid5atemyhomework via Guix-patches via
  2021-01-02 18:32     ` raid5atemyhomework via Guix-patches via
  0 siblings, 1 reply; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-02 10:22 UTC (permalink / raw)
  To: 45592

Did some more testing and finally got ZFS working inside a VM!

Turns out the `zfs` package definition was buggy --- it was using `util-linux:lib`, but trying to execute `mount` and `umount` from it.  So I modified the package definition as well to include `util-linux:lib` as `"util-linux-lib"` and gave it `util-linux` directly as well.

I also created a new service to load ZFS kernel module *and* import all ZFS pools at boot and mount them, which is the behavior ZFS has on other distros and platforms, so we should emulate it as well.

ZFS as root is not supported yet. I presume it requires `initrd` hacking, plus it also has to be supported somehow in the installer or something as well.

Here's the patch!

----

From d02b9a69ad8c261e7f7c7bf145117327d1217d1c Mon Sep 17 00:00:00 2001
From: raid5atemyhomework <raid5atemyhomework@protonmail.com>
Date: Fri, 1 Jan 2021 20:26:42 +0800
Subject: [PATCH] gnu, doc: Create and document procedure to compile ZFS for
 specific kernel.

---
 doc/guix.texi                 | 98 +++++++++++++++++++++++++++++++++++
 gnu/packages/file-systems.scm | 25 ++++++++-
 gnu/services/file-systems.scm | 65 +++++++++++++++++++++++
 3 files changed, 186 insertions(+), 2 deletions(-)
 create mode 100644 gnu/services/file-systems.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 1081ed26a3..620dc48ff5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13885,6 +13885,104 @@ a file system declaration such as:
 compress-force=zstd,space_cache=v2"))
 @end lisp

+@node ZFS file system
+@subsection ZFS file system
+
+The ZFS on Linux file system cannot legally be downloaded as part of the
+Linux kernel, but you as a user can do anything on hardware you own,
+including download ZFS as source code, compile ZFS as a kernel module,
+and link it into Linux.
+
+As a large and complex kernel module, ZFS has to be compiled for a
+specific version of Linux. Often the latest ZFS package available in Guix
+cannot be compiled with the latest Linux kernel available in Guix, so
+installing the @code{zfs} package in your system configuration file will
+fail.
+
+Instead, you have to check the
+@url{https://github.com/openzfs/zfs/releases,OpenZFS release notes} for
+the specific version of ZFS that Guix has packaged to determine what
+Linux kernels you can use, then check the @code{linux-libre} packages
+that Guix has packaged, and select one you can use on your system.
+
+Then, you have to modify your system configuration file, and create a
+ZFS package that compiles using the specific Linux version you chose.
+Below is a sketch of how you would modify your @code{operating-system}
+declaration in order to set up ZFS:
+
+@lisp
+(use-modules (gnu))
+;; @dots{}
+(use-service-modules
+  ; @dots{}
+  linux
+  file-systems)
+(use-package-modules
+  ; @dots{}
+  linux
+  file-systems)
+
+;; @dots{}
+
+;;; (1) Select a specific kernel.
+(define system-kernel linux-libre-5.4)
+;;; (2) Define a ZFS package for your kernel.
+(define system-zfs (make-zfs-package system-kernel))
+
+;; @dots{}
+
+(operating-system
+  ;;; (3) Specify your selected kernel.
+  (kernel system-kernel)
+  ;;; (4) Add the "module" output of the system ZFS package to
+  ;;; the kernel-loadable modules.
+  (kernel-loadable-modules (list (list system-zfs "module")))
+
+  ;; @dots{}
+
+  (packages
+    ;;; (5) Add the system ZFS package to global packages so that
+    ;;; "zfs", "zpool" etc. commands are available.
+    (cons* system-zfs
+           ; @dots{}
+           %base-packages))
+
+  ;; @dots{}
+
+  (services
+    ;;; (6) Add a service that loads ZFS and all ZFS pools at boot.
+    (cons* (service zfs-loader-service-type
+                    system-zfs)
+           ; @dots{}
+           %base-services))
+  ;; @dots{}
+  )
+@end lisp
+
+@deffn (Scheme Procedure) make-zfs-package @var{kernel}
+This procedure creates a package which, when included as a package
+in your system, can be loaded as a kernel module for the specified
+@var{kernel}, a Linux kernel package.
+It is intended to create a system-specific ZFS kernel module for
+the Linux kernel you will use in your system.
+@end deffn
+
+@deffn (Scheme Variable) zfs-loader-service-type
+This is the service that loads the ZFS kernel module and imports all
+ZFS pools. The value.associated with @code{zfs-loader-servie-type}
+services must be the ZFS package you defined for your system, and
+whose @code{"module"} output you have included as a loadable kernel
+module.
+@end deffn
+
+When you have modified your @code{operating-system} to include ZFS
+as in the above and reconfigured and rebooted, you will now be able
+to create, mount, and manage ZFS pools. At each boot, ZFS will
+automatically open any ZFS pools it detects in your system, and will
+mount ZFS pools that have a non-@code{legacy} mountpoint.
+
+ZFS as root filesystem is not supported yet.
+
 @node Mapped Devices
 @section Mapped Devices

diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index 895ad069c5..e8f49a59fa 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -944,16 +944,37 @@ APFS.")
        ("openssl" ,openssl)
        ("python" ,python)
        ("python-cffi" ,python-cffi)
-       ("util-linux" ,util-linux "lib")
+       ("util-linux" ,util-linux)
+       ("util-linux-lib" ,util-linux "lib")
        ("zlib" ,zlib)))
     (home-page "https://zfsonlinux.org/")
     (synopsis "Native ZFS on Linux")
     (description
      "ZFS on Linux is an advanced file system and volume manager which was
 originally developed for Solaris and is now maintained by the OpenZFS
-community.")
+community.
+
+DO NOT INSTALL THIS PACKAGE. Instead, refer to the 'ZFS file system' section
+of the Guix info manual for how to install ZFS.")
     (license license:cddl1.0)))

+(define-public (make-zfs-package kernel)
+  (package
+    (inherit zfs)
+    (name (string-append "zfs-for-"
+                         (package-name kernel)
+                         "-"
+                         (package-version kernel)
+                         "-version"))
+    (arguments
+      (cons* #:linux kernel (package-arguments zfs)))
+    (description
+     "ZFS on Linux is an advanced file system and volume manager which was
+originally developed for Solaris and is now maintained by the OpenZFS
+community.
+
+This package has been compiled for a specific Linux kernel.")))
+
 (define-public mergerfs
   (package
     (name "mergerfs")
diff --git a/gnu/services/file-systems.scm b/gnu/services/file-systems.scm
new file mode 100644
index 0000000000..97132cc53d
--- /dev/null
+++ b/gnu/services/file-systems.scm
@@ -0,0 +1,65 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services file-systems)
+  #:use-module (guix gexp)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd))
+
+;;; ZFS
+(define (zfs-loader-shepherd-service system-zfs)
+  (let* ((zpool (file-append system-zfs "/sbin/zpool")))
+    (list
+      (shepherd-service
+       (documentation "Load ZFS kernel module and import ZFS pools.")
+       (provision '(zfs))
+       (requirement '(file-systems))
+       (one-shot? #t)
+       (modules `((srfi srfi-1)
+                  (srfi srfi-34)
+                  (srfi srfi-35)
+                  (rnrs io ports)
+                  ,@%default-modules))
+       (start #~(lambda _
+                  (if (not (file-exists? "/proc/sys/kernel/modprobe"))
+                      (begin (format (current-error-port) "error: ~a~%"
+                                     "Kernel is missing loadable module support.")
+                             #f)
+                      (and
+                        (let ((modprobe (call-with-input-file
+                                          "/proc/sys/kernel/modprobe" get-line)))
+                          (guard (c ((message-condition? c)
+                                     (format (current-error-port)
+                                             "error loading 'zfs' kernel module: ~a~%"
+                                             (condition-message c))
+                                     #f))
+                            (invoke/quiet modprobe "--" "zfs")))
+                        (guard (c ((message-condition? c)
+                                   (format (current-error-port)
+                                           "error importing zpools: ~a~%"
+                                           (condition-message c))
+                                   #f))
+                          (invoke/quiet #$zpool "import" "-a"))))))))))
+
+(define-public zfs-loader-service-type
+  (service-type
+   (name 'zfs-loader)
+   (description "Load ZFS kernel module and import ZFS pools.")
+   (extensions
+    (list (service-extension shepherd-root-service-type zfs-loader-shepherd-service)))))
+
--
2.29.2





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
  2021-01-02 10:22   ` raid5atemyhomework via Guix-patches via
@ 2021-01-02 18:32     ` raid5atemyhomework via Guix-patches via
  2021-01-02 19:08       ` raid5atemyhomework via Guix-patches via
  0 siblings, 1 reply; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-02 18:32 UTC (permalink / raw)
  To: 45592

Yet another version!

This time we now prompt the user at bootup for passphrases to decrypt ZFS encrypted filesystems.  IF there aren't any, we just import any pools and mount what we can.

Hope somebody actually reviews this........................



From 3c3014e31375ee0a59c7ad67b0f4ce9875325e47 Mon Sep 17 00:00:00 2001
From: raid5atemyhomework <raid5atemyhomework@protonmail.com>
Date: Fri, 1 Jan 2021 20:26:42 +0800
Subject: [PATCH] gnu, doc: Create and document procedure to compile ZFS for
 specific kernel.

---
 doc/guix.texi                 | 100 ++++++++++++++++++++++++++++++++++
 gnu/packages/file-systems.scm |  25 ++++++++-
 gnu/services/file-systems.scm |  72 ++++++++++++++++++++++++
 3 files changed, 195 insertions(+), 2 deletions(-)
 create mode 100644 gnu/services/file-systems.scm

diff --git a/doc/guix.texi b/doc/guix.texi
index 1081ed26a3..edf950c9b5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13885,6 +13885,106 @@ a file system declaration such as:
 compress-force=zstd,space_cache=v2"))
 @end lisp

+@node ZFS file system
+@subsection ZFS file system
+
+The ZFS on Linux file system cannot legally be downloaded as part of the
+Linux kernel, but you as a user can do anything on hardware you own,
+including download ZFS as source code, compile ZFS as a kernel module,
+and link it into Linux.
+
+As a large and complex kernel module, ZFS has to be compiled for a
+specific version of Linux. Often the latest ZFS package available in Guix
+cannot be compiled with the latest Linux kernel available in Guix, so
+installing the @code{zfs} package in your system configuration file will
+fail.
+
+Instead, you have to check the
+@url{https://github.com/openzfs/zfs/releases,OpenZFS release notes} for
+the specific version of ZFS that Guix has packaged to determine what
+Linux kernels you can use, then check the @code{linux-libre} packages
+that Guix has packaged, and select one you can use on your system.
+
+Then, you have to modify your system configuration file, and create a
+ZFS package that compiles using the specific Linux version you chose.
+Below is a sketch of how you would modify your @code{operating-system}
+declaration in order to set up ZFS:
+
+@lisp
+(use-modules (gnu))
+;; @dots{}
+(use-service-modules
+  ; @dots{}
+  file-systems)
+(use-package-modules
+  ; @dots{}
+  linux
+  file-systems)
+
+;; @dots{}
+
+;;; (1) Select a specific kernel.
+(define system-kernel linux-libre-5.4)
+;;; (2) Define a ZFS package for your kernel.
+(define system-zfs (make-zfs-package system-kernel))
+
+;; @dots{}
+
+(operating-system
+  ;;; (3) Specify your selected kernel.
+  (kernel system-kernel)
+  ;;; (4) Add the "module" output of the system ZFS package to
+  ;;; the kernel-loadable modules.
+  (kernel-loadable-modules (list (list system-zfs "module")))
+
+  ;; @dots{}
+
+  (packages
+    ;;; (5) Add the system ZFS package to global packages so that
+    ;;; "zfs", "zpool" etc. commands are available.
+    (cons* system-zfs
+           ; @dots{}
+           %base-packages))
+
+  ;; @dots{}
+
+  (services
+    ;;; (6) Add a service that loads ZFS and all ZFS pools at boot.
+    (cons* (service zfs-loader-service-type
+                    system-zfs)
+           ; @dots{}
+           %base-services))
+  ;; @dots{}
+  )
+@end lisp
+
+@deffn (Scheme Procedure) make-zfs-package @var{kernel}
+This procedure creates a package which, when included as a package
+in your system, can be loaded as a kernel module for the specified
+@var{kernel}, a Linux kernel package.
+It is intended to create a system-specific ZFS kernel module for
+the Linux kernel you will use in your system.
+@end deffn
+
+@deffn (Scheme Variable) zfs-loader-service-type
+This is the service that loads the ZFS kernel module and imports all
+ZFS pools. The value.associated with @code{zfs-loader-servie-type}
+services must be the ZFS package you defined for your system, and
+whose @code{"module"} output you have included as a loadable kernel
+module.
+@end deffn
+
+When you have modified your @code{operating-system} to include ZFS
+as in the above and reconfigured and rebooted, you will now be able
+to create, mount, and manage ZFS pools. At each boot, ZFS will
+automatically open any ZFS pools it detects in your system, and will
+mount ZFS pools that have a non-@code{legacy} mountpoint. If ZFS
+finds mountable ZFS filesystems that are encrypted by passphrase, it
+will prompt for passphrases on the console.
+
+ZFS as root filesystem is not supported yet. ZFS for @code{/home} is
+also probably not easily doable yet.
+
 @node Mapped Devices
 @section Mapped Devices

diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index 895ad069c5..e8f49a59fa 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -944,16 +944,37 @@ APFS.")
        ("openssl" ,openssl)
        ("python" ,python)
        ("python-cffi" ,python-cffi)
-       ("util-linux" ,util-linux "lib")
+       ("util-linux" ,util-linux)
+       ("util-linux-lib" ,util-linux "lib")
        ("zlib" ,zlib)))
     (home-page "https://zfsonlinux.org/")
     (synopsis "Native ZFS on Linux")
     (description
      "ZFS on Linux is an advanced file system and volume manager which was
 originally developed for Solaris and is now maintained by the OpenZFS
-community.")
+community.
+
+DO NOT INSTALL THIS PACKAGE. Instead, refer to the 'ZFS file system' section
+of the Guix info manual for how to install ZFS.")
     (license license:cddl1.0)))

+(define-public (make-zfs-package kernel)
+  (package
+    (inherit zfs)
+    (name (string-append "zfs-for-"
+                         (package-name kernel)
+                         "-"
+                         (package-version kernel)
+                         "-version"))
+    (arguments
+      (cons* #:linux kernel (package-arguments zfs)))
+    (description
+     "ZFS on Linux is an advanced file system and volume manager which was
+originally developed for Solaris and is now maintained by the OpenZFS
+community.
+
+This package has been compiled for a specific Linux kernel.")))
+
 (define-public mergerfs
   (package
     (name "mergerfs")
diff --git a/gnu/services/file-systems.scm b/gnu/services/file-systems.scm
new file mode 100644
index 0000000000..bdc33f4028
--- /dev/null
+++ b/gnu/services/file-systems.scm
@@ -0,0 +1,72 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 raid5atemyhomework <raid5atemyhomework@protonmail.com>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services file-systems)
+  #:use-module (guix gexp)
+  #:use-module (gnu services)
+  #:use-module (gnu services shepherd))
+
+;;; ZFS
+(define (zfs-loader-shepherd-service system-zfs)
+  (let* ((zpool (file-append system-zfs "/sbin/zpool")))
+    (list
+      (shepherd-service
+       (documentation "Load ZFS kernel module and import ZFS pools.")
+       (provision '(zfs-loader))
+       (requirement '(file-systems))
+       (one-shot? #t)
+       (modules `((srfi srfi-1)
+                  (srfi srfi-34)
+                  (srfi srfi-35)
+                  (rnrs io ports)
+                  ,@%default-modules))
+       (start #~(lambda _
+                  (if (not (file-exists? "/proc/sys/kernel/modprobe"))
+                      (begin (format (current-error-port) "error: ~a~%"
+                                     "Kernel is missing loadable module support.")
+                             #f)
+                      (and
+                        (let ((modprobe (call-with-input-file
+                                          "/proc/sys/kernel/modprobe" get-line)))
+                          (guard (c ((message-condition? c)
+                                     (format (current-error-port)
+                                             "error loading 'zfs' kernel module: ~a~%"
+                                             (condition-message c))
+                                     #f))
+                            (invoke/quiet modprobe "--" "zfs")))
+                        (guard (c ((message-condition? c)
+                                   (format (current-error-port)
+                                           "error importing zpools: ~a~%"
+                                           (condition-message c))
+                                   #f))
+                          ;; 'current-output-port' is typically connected to /dev/klog
+                          ;; in PID 1, so redirect it to the console so we are talking
+                          ;; to the user if zpool sees an encrpyted fs that needs a
+                          ;; passphrase.
+                          (with-output-to-port (current-error-port)
+                            (lambda ()
+                              (invoke #$zpool "import" "-a" "-l"))))))))))))
+
+(define-public zfs-loader-service-type
+  (service-type
+   (name 'zfs-loader)
+   (description "Load ZFS kernel module and import ZFS pools.")
+   (extensions
+    (list (service-extension shepherd-root-service-type zfs-loader-shepherd-service)
+          (service-extension user-processes-service-type (const '(zfs-loader)))))))
+
--
2.29.2





^ permalink raw reply	[flat|nested] 6+ messages in thread

* [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
  2021-01-02 18:32     ` raid5atemyhomework via Guix-patches via
@ 2021-01-02 19:08       ` raid5atemyhomework via Guix-patches via
  0 siblings, 0 replies; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-02 19:08 UTC (permalink / raw)
  To: 45592

An alternative interface for installing ZFS would be something like this:

@deffn (Scheme Procedure) install-zfs-on-operating-system @var{kernel} @var{base-operating-system}
Modifies the given @code{base-operating-system} to include support for ZFS pools and filesystems.
The operating system kernel will be forced to the given @code{kernel}, and a kernel-specific
version of the @code{zfs} package will be compiled and loaded into the operating system at startup.
The userland tools for ZFS will also be globally installed.
@end deffn

@lisp
(use-package-modules
  ; @dots{}
  linux
  file-systems)

;; @dots{}

(install-zfs-on-operating-system
  linux-libre-5.4
  (operating-system
    ;; @dots{}
    ))
@end lisp

This reduces the number of modifications that the end-user has to make in the configuration file, but at the cost of requiring an extra layer of indents.

Here;s a sketch of what it would be like:

```scheme
(define-public (install-zfs-on-operating-system kernel base-operating-system)

  (define system-zfs (make-zfs-package kernel))

  (operating-system
    (inherit base-operating-system)
    (kernel kernel)
    (kernel-loadable-modules (cons (list system-zfs "module")
                                   (operating-system-kernel-loadable-modules base-operating-system)))
    (packages (cons system-zfs (operating-system-packages base-operating-system)))
    (services (cons (service zfs-loader-service-type system-zfs)
                    (operating-system-services base-operating-system)))
    (location (operating-system-location base-operating-system))))
```




^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#45592: [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
  2021-01-01 12:34 [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel raid5atemyhomework via Guix-patches via
  2021-01-01 18:28 ` raid5atemyhomework via Guix-patches via
@ 2021-01-08 15:51 ` raid5atemyhomework via Guix-patches via
  1 sibling, 0 replies; 6+ messages in thread
From: raid5atemyhomework via Guix-patches via @ 2021-01-08 15:51 UTC (permalink / raw)
  To: 45592-done

Close in favor of 45692




^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-08 15:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-01 12:34 [bug#45592] [PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel raid5atemyhomework via Guix-patches via
2021-01-01 18:28 ` raid5atemyhomework via Guix-patches via
2021-01-02 10:22   ` raid5atemyhomework via Guix-patches via
2021-01-02 18:32     ` raid5atemyhomework via Guix-patches via
2021-01-02 19:08       ` raid5atemyhomework via Guix-patches via
2021-01-08 15:51 ` bug#45592: " raid5atemyhomework via Guix-patches via

unofficial mirror of guix-patches@gnu.org 

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://yhetil.org/guix-patches/1 guix-patches/git/1.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 guix-patches guix-patches/ https://yhetil.org/guix-patches \
		guix-patches@gnu.org
	public-inbox-index guix-patches

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://news.yhetil.org/yhetil.gnu.guix.patches


AGPL code for this site: git clone http://ou63pmih66umazou.onion/public-inbox.git