[PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.

  • Done
  • quality assurance status badge
Details
One participant
  • raid5atemyhomework
Owner
unassigned
Submitted by
raid5atemyhomework
Severity
normal
R
R
raid5atemyhomework wrote on 1 Jan 2021 13:34
(name . guix-patches@gnu.org)(address . guix-patches@gnu.org)
rP_q9FTeS9oP2-Lwjn6zkwTA2pnugY3OybWeMij4_nFfcKDv1gxQOn-w2vzj3dSmF9CI6eu9plAEdwQXr7Pdk4ZQP4X6mQZ_c6kbgPd7qbY=@protonmail.com

As suggested in https://issues.guix.gnu.org/45403#3this 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(-)

Toggle diff (107 lines)
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
R
R
raid5atemyhomework wrote on 1 Jan 2021 19:28
(name . 45592@debbugs.gnu.org)(address . 45592@debbugs.gnu.org)
TH45GnK3eU6lNAYIcSSff_lUyHhMSdE99digtDkFmG8Qdbe2O1Wl5y6BdWIWORaLO0pzgi2xK5LjwAnKDT6eGnjyU2oTgBwracuResc20DM=@protonmail.com
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(-)

Toggle diff (127 lines)
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
R
R
raid5atemyhomework wrote on 2 Jan 2021 11:22
(name . 45592@debbugs.gnu.org)(address . 45592@debbugs.gnu.org)
ozkBj2MlPOF0UQWbUZU6FI1i3pEaOROEY2TNCs2QpynJD-OG2gEqYLLT7bf5OwJTYTFSeHmc7tE8X5zSY6qvnn47HUayOjr71ihMkWFEHKU=@protonmail.com
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

Toggle diff (224 lines)
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
R
R
raid5atemyhomework wrote on 2 Jan 2021 19:32
(name . 45592@debbugs.gnu.org)(address . 45592@debbugs.gnu.org)
csLixSpvfTY-vs3RfQNdknB_I-C_czObIMePUaUwpH3SJ_5YMi2LxZk2WDVk7WSvmz4uF9jGKV9JNtAcfd477nVjosEM110HvkcWYMkElsA=@protonmail.com
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

Toggle diff (233 lines)
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
R
R
raid5atemyhomework wrote on 2 Jan 2021 20:08
(name . 45592@debbugs.gnu.org)(address . 45592@debbugs.gnu.org)
iw61nsbA5zgH5y3Y-Nd57Ksi7WjFLfcikt4RyBpoPqKZtRQzunGdOF1ncaYvotX0M0ZKDyMK1ZdMMxBJ8uJzSj7NT9FHSjCJ0V3umMf-iu8=@protonmail.com
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))))
```
R
R
raid5atemyhomework wrote on 7 Jan 2021 10:16
Re: kernel-module-configuration-service for configuring kernel parameters
5bC3wYco2_hQFFuoBgIXEzu8nw1EJSACCaM1vnewD14AEQqQ-y32uoIWX1a5rJJxVvsSmWxI05fY0IKIjem5TyznqxZahm8v1F_fkEF7AeE=@protonmail.com
Hi Danny and Brice,

Cross-posting to 42193 as well.

Toggle quote (3 lines)
> > > See also https://issues.guix.info/issue/42193for an earlier attempt (which
> > > is already very far--but it has a bug somewhere).

I think what 42193 WIP 2/6 is missing is this hunk from my own 45592 PATCH 1/4:

```diff
Toggle diff (38 lines)
diff --git a/gnu/system.scm b/gnu/system.scm
index c284a18379..5c530f176e 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm@@ -625,26 +616,10 @@ possible (that is if there's a LINUX keyword argument in the build system)."
"Return the basic entries of the 'system' directory of OS for use as the
value of the SYSTEM-SERVICE-TYPE service."
(let* ((locale (operating-system-locale-directory os))
- (kernel (operating-system-kernel os))
(hurd (operating-system-hurd os))
- (modules (operating-system-kernel-loadable-modules os))
- (kernel (if hurd
- kernel
- (profile
- (content (packages->manifest
- (cons kernel
- (map (lambda (module)
- (if (package? module)
- (package-for-kernel kernel
- module)
- module))
- modules))))
- (hooks (list linux-module-database)))))
(initrd (and (not hurd) (operating-system-initrd-file os)))
(params (operating-system-boot-parameters-file os)))
- `(("kernel" ,kernel)
- ,@(if hurd `(("hurd" ,hurd)) '())
- ("parameters" ,params)
+ `(("parameters" ,params)
,@(if initrd `(("initrd" ,initrd)) '())
("locale" ,locale)))) ;used by libc
```



I hope we can progress this towards a workable ZFS-on-Guix.

Thanks
raid5atemyhomework
R
R
raid5atemyhomework wrote on 8 Jan 2021 16:51
[PATCH] gnu, doc: Create and document procedure to compile ZFS for specific kernel.
(name . 45592-done@debbugs.gnu.org)(address . 45592-done@debbugs.gnu.org)
tKV9CFrKjiJkdWX4_Lp9Siv-5IJB_EbYKNbAp7Ijqp6nbrP5anUTrXIus642pq0jG3jP3EhoaqUVtioJXKRuEiqCy0-H54tE4Wozf-UdIh0=@protonmail.com
Close in favor of 45692
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 45592@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 45592
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch