unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH] Add mdadm to the installation image.
@ 2016-07-14 13:13 Andreas Enge
  2016-07-14 14:53 ` Mathieu Lirzin
  2016-07-15 14:25 ` myglc2
  0 siblings, 2 replies; 19+ messages in thread
From: Andreas Enge @ 2016-07-14 13:13 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 352 bytes --]

Hello,

the hydra replacement comes with two hard disks, which we would like to set
up as a raid10. For this, one needs mdadm. While it can be pulled in during
installation via "guix package -I mdadm", I think it is preferable that it
already be around, the same as cryptsetup, for instance. The attached patch
does this.

What do you think?

Andreas


[-- Attachment #2: 0001-install-Add-mdadm-to-the-image.patch --]
[-- Type: text/plain, Size: 1194 bytes --]

From eda9d6e5814c0e53f481599d0efd09d5237444d6 Mon Sep 17 00:00:00 2001
From: Andreas Enge <andreas@enge.fr>
Date: Thu, 14 Jul 2016 15:07:49 +0200
Subject: [PATCH] install: Add mdadm to the image.

* gnu/system/install.scm (installation-os)[packages]: Add mdadm.
---
 gnu/system/install.scm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gnu/system/install.scm b/gnu/system/install.scm
index 329c7ab..734a361 100644
--- a/gnu/system/install.scm
+++ b/gnu/system/install.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -392,6 +393,7 @@ Use Alt-F2 for documentation.
                      parted ddrescue
                      grub                  ;mostly so xrefs to its manual work
                      cryptsetup
+                     mdadm
                      btrfs-progs
                      wireless-tools iw wpa-supplicant-minimal iproute
                      ;; XXX: We used to have GNU fdisk here, but as of version
-- 
2.8.4


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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-14 13:13 [PATCH] Add mdadm to the installation image Andreas Enge
@ 2016-07-14 14:53 ` Mathieu Lirzin
  2016-07-14 19:21   ` Efraim Flashner
  2016-07-15 14:25 ` myglc2
  1 sibling, 1 reply; 19+ messages in thread
From: Mathieu Lirzin @ 2016-07-14 14:53 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

Hello,

Andreas Enge <andreas@enge.fr> writes:

> the hydra replacement comes with two hard disks, which we would like to set
> up as a raid10. For this, one needs mdadm. While it can be pulled in during
> installation via "guix package -I mdadm", I think it is preferable that it
> already be around, the same as cryptsetup, for instance. The attached patch
> does this.
>
> What do you think?

I fully agree that mdadm should be directly available.

> From eda9d6e5814c0e53f481599d0efd09d5237444d6 Mon Sep 17 00:00:00 2001
> From: Andreas Enge <andreas@enge.fr>
> Date: Thu, 14 Jul 2016 15:07:49 +0200
> Subject: [PATCH] install: Add mdadm to the image.
>
> * gnu/system/install.scm (installation-os)[packages]: Add mdadm.
> ---
>  gnu/system/install.scm | 2 ++
>  1 file changed, 2 insertions(+)
>

-- 
Mathieu Lirzin

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-14 14:53 ` Mathieu Lirzin
@ 2016-07-14 19:21   ` Efraim Flashner
  2016-07-14 21:42     ` Andreas Enge
  0 siblings, 1 reply; 19+ messages in thread
From: Efraim Flashner @ 2016-07-14 19:21 UTC (permalink / raw)
  To: Mathieu Lirzin; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 868 bytes --]

On Thu, Jul 14, 2016 at 04:53:06PM +0200, Mathieu Lirzin wrote:
> Hello,
> 
> Andreas Enge <andreas@enge.fr> writes:
> 
> > the hydra replacement comes with two hard disks, which we would like to set
> > up as a raid10. For this, one needs mdadm. While it can be pulled in during
> > installation via "guix package -I mdadm", I think it is preferable that it
> > already be around, the same as cryptsetup, for instance. The attached patch
> > does this.
> >
> > What do you think?
> 
> I fully agree that mdadm should be directly available.
> 
> -- 
> Mathieu Lirzin
> 

How much does it add to the size?

also, raid10 with 2 disks?

-- 
Efraim Flashner   <efraim@flashner.co.il>   אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-14 19:21   ` Efraim Flashner
@ 2016-07-14 21:42     ` Andreas Enge
  2016-07-15 13:27       ` Ludovic Courtès
  0 siblings, 1 reply; 19+ messages in thread
From: Andreas Enge @ 2016-07-14 21:42 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: guix-devel

On Thu, Jul 14, 2016 at 10:21:25PM +0300, Efraim Flashner wrote:
> How much does it add to the size?

$ guix size mdadm
store item                                                       total    self
/gnu/store/k2hlwyzfs1v5xj1v6475n52jljd9q89x-mdadm-3.4               79.7     1.1   1.4%
/gnu/store/lpvkjic9dhj55plc29jhq8l39irvqm4f-coreutils-8.25          78.6    14.3  17.9%
/gnu/store/g6704rf6gk8w1czvj24d5sbh9zvhf50i-gmp-6.1.0               63.5     2.6   3.2%
/gnu/store/cny25x3kx0z7c93dsnd9vsxasjgln76d-acl-2.2.52              61.6     0.4   0.5%
/gnu/store/m92xmqp7skc233s867bg3gab860sikwl-libcap-2.24             61.3     0.1   0.2%
/gnu/store/zv5x1g1p4kail830r9aw6n49kw0gk92f-attr-2.4.47             61.2     0.2   0.3%
/gnu/store/9nifwk709wajpyfwa0jzaa3p6mf10vxs-gcc-4.9.3-lib           60.9    22.9  28.7%
/gnu/store/m9vxvhdj691bq1f85lpflvnhcvrdilih-glibc-2.23              38.1    36.7  46.1%
/gnu/store/0010wvgs40kdq8chzsh403qm7la9jxq7-bash-static-4.3.42       1.4     1.4   1.7%
total: 79.7 MiB

But I think that most of these are already there anyway, and only the "self"
part of 1.1MB actually comes extra.

> also, raid10 with 2 disks?

Yes. With the "far" layout, the second disk is a mirror of the first one,
but with the blocks in a different order. So the second disk creates a
backup, and large sequential reads should become close to twice as fast.

Andreas

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-14 21:42     ` Andreas Enge
@ 2016-07-15 13:27       ` Ludovic Courtès
  2016-07-15 17:10         ` Andreas Enge
  0 siblings, 1 reply; 19+ messages in thread
From: Ludovic Courtès @ 2016-07-15 13:27 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

Andreas Enge <andreas@enge.fr> skribis:

> On Thu, Jul 14, 2016 at 10:21:25PM +0300, Efraim Flashner wrote:
>> How much does it add to the size?
>
> $ guix size mdadm

You should check the size of the whole system:

  guix size $(guix system build gnu/system/install.scm)

Ludo’.

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-14 13:13 [PATCH] Add mdadm to the installation image Andreas Enge
  2016-07-14 14:53 ` Mathieu Lirzin
@ 2016-07-15 14:25 ` myglc2
  2016-07-23 14:07   ` [PATCH} Add RAID devices Andreas Enge
  1 sibling, 1 reply; 19+ messages in thread
From: myglc2 @ 2016-07-15 14:25 UTC (permalink / raw)
  To: guix-devel

Andreas Enge <andreas@enge.fr> writes:

> Hello,
>
> the hydra replacement comes with two hard disks, which we would like to set
> up as a raid10. For this, one needs mdadm. While it can be pulled in during
> installation via "guix package -I mdadm", I think it is preferable that it
> already be around, the same as cryptsetup, for instance. The attached patch
> does this.
>
> What do you think?
>
> Andreas

I want to do this on my own servers, so I am wondering ...

How do you plan to address mdadm and grub config?

Will you be booting from RAID?

TIA - George

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-15 13:27       ` Ludovic Courtès
@ 2016-07-15 17:10         ` Andreas Enge
  2016-07-16 10:50           ` Ludovic Courtès
  0 siblings, 1 reply; 19+ messages in thread
From: Andreas Enge @ 2016-07-15 17:10 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Fri, Jul 15, 2016 at 03:27:29PM +0200, Ludovic Courtès wrote:
> You should check the size of the whole system:
>   guix size $(guix system build gnu/system/install.scm)

Good point! Here we are. Before:
/gnu/store/q62mdc418pr2wm9160a7qp3dhc8ii1d8-system                 824.8     0.0   0.0%

After:
/gnu/store/inv57icbw0dp7s4d33r37l1yjdv3sp2n-system                 825.9     0.0   0.0%

:-)


For good measure, here the size after adding also lm-sensors:
/gnu/store/v6nlhanbhcabk2vvqmi4xsgividq1060-system                 904.0     0.0   0.0%

:-|
Not great, but not as bad as I had feared; probably because perl is
unavoidable anyway.

Andreas

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-15 17:10         ` Andreas Enge
@ 2016-07-16 10:50           ` Ludovic Courtès
  2016-07-16 12:44             ` Andreas Enge
  0 siblings, 1 reply; 19+ messages in thread
From: Ludovic Courtès @ 2016-07-16 10:50 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel

Andreas Enge <andreas@enge.fr> skribis:

> On Fri, Jul 15, 2016 at 03:27:29PM +0200, Ludovic Courtès wrote:
>> You should check the size of the whole system:
>>   guix size $(guix system build gnu/system/install.scm)
>
> Good point! Here we are. Before:
> /gnu/store/q62mdc418pr2wm9160a7qp3dhc8ii1d8-system                 824.8     0.0   0.0%
>
> After:
> /gnu/store/inv57icbw0dp7s4d33r37l1yjdv3sp2n-system                 825.9     0.0   0.0%
>
> :-)

Perfect.  :-)

> For good measure, here the size after adding also lm-sensors:
> /gnu/store/v6nlhanbhcabk2vvqmi4xsgividq1060-system                 904.0     0.0   0.0%

Then we should avoid it IMO.  My understanding is that not having
lm-sensors is at worst annoying, but not critical, right?  WDYT?

Thanks,
Ludo’.

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

* Re: [PATCH] Add mdadm to the installation image.
  2016-07-16 10:50           ` Ludovic Courtès
@ 2016-07-16 12:44             ` Andreas Enge
  0 siblings, 0 replies; 19+ messages in thread
From: Andreas Enge @ 2016-07-16 12:44 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

On Sat, Jul 16, 2016 at 12:50:41PM +0200, Ludovic Courtès wrote:
> > For good measure, here the size after adding also lm-sensors:
> > /gnu/store/v6nlhanbhcabk2vvqmi4xsgividq1060-system                 904.0     0.0   0.0%
> Then we should avoid it IMO.  My understanding is that not having
> lm-sensors is at worst annoying, but not critical, right?  WDYT?

The comment was just a follow-up to my previous messages about lm-sensors
and my complaint about its size. Indeed I do not mean to imply we should
add it.

Andreas

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

* [PATCH} Add RAID devices.
  2016-07-15 14:25 ` myglc2
@ 2016-07-23 14:07   ` Andreas Enge
  2016-07-24  5:43     ` Chris Marusich
  2016-07-30 23:05     ` myglc2
  0 siblings, 2 replies; 19+ messages in thread
From: Andreas Enge @ 2016-07-23 14:07 UTC (permalink / raw)
  To: myglc2; +Cc: guix-devel

[-- Attachment #1: Type: text/plain, Size: 1062 bytes --]

Hello,

On Fri, Jul 15, 2016 at 10:25:47AM -0400, myglc2 wrote:
> How do you plan to address mdadm and grub config?
> Will you be booting from RAID?

the attached patch adds RAID support to our mapped device mechanism.

To give more explanation:
Like for LUKS devices or file systems, the RAID itself needs to be created
during installation, after booting from the USB key:
   mdadm --create /dev/md0 --level=raid10 --layout=f2 \
      --raid-devices=2 /dev/sda2 /dev/sdb2
   (wait 12 hours or so for 4 TB disks)
   mkfs.ext4 /dev/md0

Then one adds a mapped-device of type raid-device-mapping, adds the
raid10 kernel module to the initrd and can boot from the RAID device.
The mapped-device mechanism calls "mdadm --assemble" and "mdadm --stop".

I might write a more detailed blog post about this; there is a little
subtlety with the non-automatic determination of dependencies between
devices, so one needs to make sure that the partitions to be assembled
are present before the mdadm command is executed.

Looking forward to comments on the patch,

Andreas


[-- Attachment #2: 0001-system-Add-mapped-devices-for-RAID.patch --]
[-- Type: text/plain, Size: 8094 bytes --]

From fc2d8dc30c04677ebf553b02227dc10b0be49665 Mon Sep 17 00:00:00 2001
From: Andreas Enge <andreas@enge.fr>
Date: Thu, 14 Jul 2016 15:51:59 +0200
Subject: [PATCH] system: Add mapped devices for RAID.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* gnu/system/mapped-devices.scm (raid-device-mapping, open-raid-device,
close-raid-device): New variables.
* doc/guix.texi (Mapped Devices): Add documentation for RAID devices,
reorganize documentation for LUKS devices.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
---
 doc/guix.texi                 | 113 +++++++++++++++++++++++++++---------------
 gnu/system/mapped-devices.scm |  29 ++++++++++-
 2 files changed, 102 insertions(+), 40 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 393efab..ddeeb71 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -6946,6 +6946,7 @@ and unmount user-space FUSE file systems.  This requires the
 @cindex mapped devices
 The Linux kernel has a notion of @dfn{device mapping}: a block device,
 such as a hard disk partition, can be @dfn{mapped} into another device,
+usually in @code{/dev/mapper/},
 with additional processing over the data that flows through
 it@footnote{Note that the GNU@tie{}Hurd makes no difference between the
 concept of a ``mapped device'' and that of a file system: both boil down
@@ -6955,42 +6956,14 @@ devices, like file systems, using the generic @dfn{translator} mechanism
 (@pxref{Translators,,, hurd, The GNU Hurd Reference Manual}).}.  A
 typical example is encryption device mapping: all writes to the mapped
 device are encrypted, and all reads are deciphered, transparently.
+Guix extends this notion by considering any device or set of devices that
+are @dfn{transformed} in some way to create a new device; for instance,
+RAID devices are obtained by @dfn{assembling} several other devices, such
+as hard disks or partitions, into a new one that behaves as one partition.
+Other examples, not yet implemented, are LVM logical volumes.
 
-Mapped devices are declared using the @code{mapped-device} form:
-
-@example
-(mapped-device
-  (source "/dev/sda3")
-  (target "home")
-  (type luks-device-mapping))
-@end example
-
-Or, better yet, like this:
-
-@example
-(mapped-device
-  (source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
-  (target "home")
-  (type luks-device-mapping))
-@end example
-
-@cindex disk encryption
-@cindex LUKS
-This example specifies a mapping from @file{/dev/sda3} to
-@file{/dev/mapper/home} using LUKS---the
-@url{http://code.google.com/p/cryptsetup,Linux Unified Key Setup}, a
-standard mechanism for disk encryption.  In the second example, the UUID
-(unique identifier) is the LUKS UUID returned for the device by a
-command like:
-
-@example
-cryptsetup luksUUID /dev/sdx9
-@end example
-
-The @file{/dev/mapper/home}
-device can then be used as the @code{device} of a @code{file-system}
-declaration (@pxref{File Systems}).  The @code{mapped-device} form is
-detailed below.
+Mapped devices are declared using the @code{mapped-device} form,
+defined as follows; for examples, see below.
 
 @deftp {Data Type} mapped-device
 Objects of this type represent device mappings that will be made when
@@ -6998,13 +6971,17 @@ the system boots up.
 
 @table @code
 @item source
-This string specifies the name of the block device to be mapped, such as
-@code{"/dev/sda3"}.
+This is either a string specifying the name of the block device to be mapped,
+such as @code{"/dev/sda3"}, or a list of such strings when several devices
+need to be assembled for creating a new one.
 
 @item target
-This string specifies the name of the mapping to be established.  For
-example, specifying @code{"my-partition"} will lead to the creation of
+This string specifies the name of the resulting mapped device.  For
+kernel mappers such as encrypted devices of type @code{luks-device-mapping},
+specifying @code{"my-partition"} leads to the creation of
 the @code{"/dev/mapper/my-partition"} device.
+For RAID devices of type @code{raid-device-mapping}, the full device name
+such as @code{"/dev/md0"} needs to be given.
 
 @item type
 This must be a @code{mapped-device-kind} object, which specifies how
@@ -7018,6 +6995,64 @@ command from the package with the same name.  It relies on the
 @code{dm-crypt} Linux kernel module.
 @end defvr
 
+@defvr {Scheme Variable} raid-device-mapping
+This defines a RAID device, which is assembled using the @code{mdadm}
+command from the package with the same name.  It requires a Linux kernel
+module for the appropriate RAID level to be loaded, such as @code{raid456}
+for RAID-4, RAID-5 or RAID-6, or @code{raid10} for RAID-10.
+@end defvr
+
+@cindex disk encryption
+@cindex LUKS
+The following example specifies a mapping from @file{/dev/sda3} to
+@file{/dev/mapper/home} using LUKS---the
+@url{http://code.google.com/p/cryptsetup,Linux Unified Key Setup}, a
+standard mechanism for disk encryption.
+The @file{/dev/mapper/home}
+device can then be used as the @code{device} of a @code{file-system}
+declaration (@pxref{File Systems}).
+
+@example
+(mapped-device
+  (source "/dev/sda3")
+  (target "home")
+  (type luks-device-mapping))
+@end example
+
+Alternatively, to become independent of device numbering, one may obtain
+the LUKS UUID (@dfn{unique identifier}) of the source device by a
+command like:
+
+@example
+cryptsetup luksUUID /dev/sda3
+@end example
+
+and use it as follows:
+
+@example
+(mapped-device
+  (source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
+  (target "home")
+  (type luks-device-mapping))
+@end example
+
+A RAID device formed of the partitions @file{/dev/sda1} and @file{/dev/sdb1}
+may be declared as follows:
+
+@example
+(mapped-device
+  (source (list "/dev/sda1" "/dev/sdb1"))
+  (target "/dev/md0")
+  (type raid-device-mapping))
+@end example
+
+The @file{/dev/md0} device can then be used as the @code{device} of a
+@code{file-system} declaration (@pxref{File Systems}).
+Note that the RAID level need not be given; it is chosen during the
+initial creation and formatting of the RAID device and is determined
+automatically later.
+
+
 @node User Accounts
 @subsection User Accounts
 
diff --git a/gnu/system/mapped-devices.scm b/gnu/system/mapped-devices.scm
index 732f73c..d0a9f02 100644
--- a/gnu/system/mapped-devices.scm
+++ b/gnu/system/mapped-devices.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,6 +23,7 @@
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
   #:autoload   (gnu packages cryptsetup) (cryptsetup)
+  #:autoload   (gnu packages linux) (mdadm)
   #:use-module (srfi srfi-1)
   #:use-module (ice-9 match)
   #:export (mapped-device
@@ -38,7 +40,8 @@
             device-mapping-service-type
             device-mapping-service
 
-            luks-device-mapping))
+            luks-device-mapping
+            raid-device-mapping))
 
 ;;; Commentary:
 ;;;
@@ -127,4 +130,28 @@
    (open open-luks-device)
    (close close-luks-device)))
 
+(define (open-raid-device source target)
+  "Return a gexp that assembles SOURCE (a list of devices) to the RAID device
+TARGET, using 'mdadm'."
+  #~(let ((every (@ (srfi srfi-1) every)))
+      (let loop ()
+        (unless (every file-exists? '#$source)
+          (format #t "waiting a bit...~%")
+          (sleep 1)
+          (loop)))
+       (zero? (system* (string-append #$mdadm "/sbin/mdadm")
+                                      "--assemble" #$target
+                                      #$@source))))
+
+(define (close-raid-device source target)
+  "Return a gexp that stops the RAID device TARGET."
+  #~(zero? (system* (string-append #$mdadm "/sbin/mdadm")
+                    "--stop" #$target)))
+
+(define raid-device-mapping
+  ;; The type of RAID mapped devices.
+  (mapped-device-kind
+   (open open-raid-device)
+   (close close-raid-device)))
+
 ;;; mapped-devices.scm ends here
-- 
2.9.0


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

* Re: [PATCH} Add RAID devices.
  2016-07-23 14:07   ` [PATCH} Add RAID devices Andreas Enge
@ 2016-07-24  5:43     ` Chris Marusich
  2016-07-25 20:59       ` Ludovic Courtès
  2016-07-25 21:17       ` Andreas Enge
  2016-07-30 23:05     ` myglc2
  1 sibling, 2 replies; 19+ messages in thread
From: Chris Marusich @ 2016-07-24  5:43 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel, myglc2

[-- Attachment #1: Type: text/plain, Size: 2055 bytes --]

Andreas Enge <andreas@enge.fr> writes:

>> How do you plan to address mdadm and grub config?
>> Will you be booting from RAID?
>
> the attached patch adds RAID support to our mapped device mechanism.

Cool!  Is it possible to use them in combination?  Using the example
From the documentation, would it possible to use LUKS to create an
encrypted /dev/mapper/home which uses /dev/md0 instead of /dev/sda3?

> +Alternatively, to become independent of device numbering, one may obtain
> +the LUKS UUID (@dfn{unique identifier}) of the source device by a
> +command like:

How difficult would it be to add support for specifying the sources
using UUIDs?  I know we could use use the device files in
/dev/disk/by-uuid/, but "(guix) File Systems" (footnote 2) recommends
against that: "Note that, while it is tempting to use
‘/dev/disk/by-uuid’ and similar device names to achieve the same result,
this is not recommended: These special device nodes are created by the
udev daemon and may be unavailable at the time the device is mounted."

> +The @file{/dev/md0} device can then be used as the @code{device} of a
> +@code{file-system} declaration (@pxref{File Systems}).
> +Note that the RAID level need not be given; it is chosen during the
> +initial creation and formatting of the RAID device and is determined
> +automatically later.

I understand that in Linux, the device file names (e.g., /dev/sda3) can
sometimes change unexpectedly.  If they change later on, will anything
bad happen?

> +  #~(let ((every (@ (srfi srfi-1) every)))

Can't you just use "every" on its own?  It looks like you've imported
the srfi-1 module earlier on.

> +        (unless (every file-exists? '#$source)
> +          (format #t "waiting a bit...~%")
> +          (sleep 1)
> +          (loop)))

Does the code in this gexp get invoked every time the system starts up?
Why is a loop better here than an error?  What if the source device
files never show up?

Also, will that string be properly localized?

-- 
Chris

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

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

* Re: [PATCH} Add RAID devices.
  2016-07-24  5:43     ` Chris Marusich
@ 2016-07-25 20:59       ` Ludovic Courtès
  2016-07-25 21:17       ` Andreas Enge
  1 sibling, 0 replies; 19+ messages in thread
From: Ludovic Courtès @ 2016-07-25 20:59 UTC (permalink / raw)
  To: Chris Marusich; +Cc: guix-devel, myglc2

Hello,

Chris Marusich <cmmarusich@gmail.com> skribis:

> Andreas Enge <andreas@enge.fr> writes:

[...]

>> +  #~(let ((every (@ (srfi srfi-1) every)))
>
> Can't you just use "every" on its own?  It looks like you've imported
> the srfi-1 module earlier on.

I’m the one who suggested it as a “temporary hack”, as we call such
things.  ;-)

The story is that this expression here gets stages in non-top-level
position, where it cannot directly do ‘use-modules’, hence this hack.

This should be fixed eventually, possibly in gexp themselves.

>> +        (unless (every file-exists? '#$source)
>> +          (format #t "waiting a bit...~%")
>> +          (sleep 1)
>> +          (loop)))
>
> Does the code in this gexp get invoked every time the system starts up?
> Why is a loop better here than an error?  What if the source device
> files never show up?

Right, another super-temporary hack.  The right thing would be to do
like ‘canonicalize-device-spec’ in (gnu build file-systems) does, which
is to error out after a few iterations, with the effect of spawning an
emergency REPL.

The mechanism to wait for devices should be factorized.

> Also, will that string be properly localized?

No it won’t, indeed.  Currently message catalogs and locales are
unavailable in the initrd, and it would probably make the initrd pretty
big to add them, so I’d be tempted to ignore i18n for early boot
messages that hopefully few people will notice.

Thanks,
Ludo’.

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

* Re: [PATCH} Add RAID devices.
  2016-07-24  5:43     ` Chris Marusich
  2016-07-25 20:59       ` Ludovic Courtès
@ 2016-07-25 21:17       ` Andreas Enge
  2016-07-26  7:43         ` Chris Marusich
  1 sibling, 1 reply; 19+ messages in thread
From: Andreas Enge @ 2016-07-25 21:17 UTC (permalink / raw)
  To: Chris Marusich; +Cc: guix-devel, myglc2

Hello!

On Sat, Jul 23, 2016 at 10:43:58PM -0700, Chris Marusich wrote:
> Cool!  Is it possible to use them in combination?  Using the example
> From the documentation, would it possible to use LUKS to create an
> encrypted /dev/mapper/home which uses /dev/md0 instead of /dev/sda3?

unfortunately not. This is an area where some work should be invested.
It would require to do things properly in order also. LVM support also
comes to mind. I think these devices can be staged in an arbitrarily
complex way, no? Encrypting a RAID device, or creating a RAID device
from encrypted partitions, for instance (of which the former sounds more
reasonable to me).

> I understand that in Linux, the device file names (e.g., /dev/sda3) can
> sometimes change unexpectedly.  If they change later on, will anything
> bad happen?

Yes, the RAID could not be assembled, and then the machine could not boot
up. But I have never experienced this kind of problem for hard disks.

> Does the code in this gexp get invoked every time the system starts up?
> Why is a loop better here than an error?

Yes. An error is too harsh: When I tried things out, my RAID assembling
was (tried to be) carried out before the hard disks were visible, so this
failed. Waiting a little solved the problem.

Andreas

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

* Re: [PATCH} Add RAID devices.
  2016-07-25 21:17       ` Andreas Enge
@ 2016-07-26  7:43         ` Chris Marusich
  0 siblings, 0 replies; 19+ messages in thread
From: Chris Marusich @ 2016-07-26  7:43 UTC (permalink / raw)
  To: Andreas Enge; +Cc: guix-devel, myglc2

[-- Attachment #1: Type: text/plain, Size: 2286 bytes --]

Hi Andreas,

Ludo's response clarified a lot of things for me.  The only remaining
feedback I have is that (1) to aid the reader, you should consider
adding a cross-reference from "(guix) Mapped Devices" (in the part where
you mention that certain modules must be added) to "(guix) Initial RAM
Disk", and (2) you might want to look into using the "Auto Assembly"
feature of mdadm (see below).

If you've tested the changes, though, and it works, I see no reason not
to commit this and enable everyone to enjoy the use of RAID arrays! :)

Andreas Enge <andreas@enge.fr> writes:

> On Sat, Jul 23, 2016 at 10:43:58PM -0700, Chris Marusich wrote:
>> Cool!  Is it possible to use them in combination?  Using the example
>> From the documentation, would it possible to use LUKS to create an
>> encrypted /dev/mapper/home which uses /dev/md0 instead of /dev/sda3?
>
> unfortunately not. This is an area where some work should be invested.
> It would require to do things properly in order also. LVM support also
> comes to mind. I think these devices can be staged in an arbitrarily
> complex way, no? Encrypting a RAID device, or creating a RAID device
> from encrypted partitions, for instance (of which the former sounds more
> reasonable to me).

I agree it would be a nice feature, but if your patch is working right
now to enable the use of RAID, then I think it would be fine to submit
your patch now and add such a feature later.

>> I understand that in Linux, the device file names (e.g., /dev/sda3) can
>> sometimes change unexpectedly.  If they change later on, will anything
>> bad happen?
>
> Yes, the RAID could not be assembled, and then the machine could not boot
> up. But I have never experienced this kind of problem for hard disks.

It occurs occasionally [1], but the fewer disks you have, the less
likely you are to observe it.  I wonder if you can use mdadm's "Auto
Assembly" feature (see "man 8 mdadm" for details) to avoid this issue
entirely?  It sounds like you might not even need to specify a source
device list, if the description of "Auto Assembly" is to be believed.

[1] For example: https://serverfault.com/questions/140071/hard-drive-device-names-are-different-from-one-reboot-to-another-in-ubuntu

-- 
Chris

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

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

* Re: [PATCH} Add RAID devices.
  2016-07-23 14:07   ` [PATCH} Add RAID devices Andreas Enge
  2016-07-24  5:43     ` Chris Marusich
@ 2016-07-30 23:05     ` myglc2
  2016-07-31  8:52       ` Andreas Enge
  1 sibling, 1 reply; 19+ messages in thread
From: myglc2 @ 2016-07-30 23:05 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 2105 bytes --]

Andreas Enge <andreas@enge.fr> writes:

> the attached patch adds RAID support to our mapped device mechanism.
>
> To give more explanation:
> Like for LUKS devices or file systems, the RAID itself needs to be created
> during installation, after booting from the USB key:
>    mdadm --create /dev/md0 --level=raid10 --layout=f2 \
>       --raid-devices=2 /dev/sda2 /dev/sdb2
>    (wait 12 hours or so for 4 TB disks)
>    mkfs.ext4 /dev/md0
>
> Then one adds a mapped-device of type raid-device-mapping, adds the
> raid10 kernel module to the initrd and can boot from the RAID device.
> The mapped-device mechanism calls "mdadm --assemble" and "mdadm --stop".
>
> I might write a more detailed blog post about this; there is a little
> subtlety with the non-automatic determination of dependencies between
> devices, so one needs to make sure that the partitions to be assembled
> are present before the mdadm command is executed.

Thanks. Starting with baby steps, I am running GuixSD system from a
separate drive and adding raid1 array with 2 new disks. I created an
array that will assemble like so...

g1@g1 ~$ sudo mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1
mdadm: /dev/md0 has been started with 2 drives.

g1@g1 ~$ cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[0] sdb1[1]
      239809536 blocks super 1.2 [2/2] [UU]
      bitmap: 0/2 pages [0KB], 65536KB chunk

I added this to my config (system25.scm attached) ...

(operating-system
[...]
  (initrd (lambda (fs . args)
	    (apply base-initrd fs
		   #:extra-modules '("raid1")
		   #:mapped-devices '((mapped-device
				       (source (list "/dev/sdb1" "/dev/sdc1"))
				       (target "/dev/md0")
				       (type raid-device-mapping)))				      
		   args)))
[...]

I rebooted and the array is not assembled ;-(

g1@g1 ~$ cat /proc/mdstat
Personalities : [raid1] 
unused devices: <none>

/var/log/messages contains ...
[...]
Jul 30 18:09:59 localhost vmunix: [    1.872801] md: raid1 personality registered for level 1
[...]

Any suggestions, corrections or a sample working config would be most welcome.

TIA - George


[-- Attachment #2: system25.scm --]
[-- Type: application/octet-stream, Size: 2038 bytes --]

;;; g1 system config
(use-modules (gnu))
(use-service-modules networking ssh)
(use-package-modules
 base
 admin
 disk
 linux                 ; mdadm
 package-management    ; guix
 screen
 ghostscript           ; gs-fonts
 fonts                 ; font-dejavu font-gnu-freefont-ttf
 curl                  ; lpaste
 ssh
 xorg certs
 rsync
 wget
 version-control       ; git
 aspell
 emacs
 cups
 graphviz
 qemu
 )
(operating-system
  (host-name "g1")
  (timezone "America/New_York")
  (locale "en_US.utf8")
  (bootloader (grub-configuration (device "/dev/sda")))
  (initrd (lambda (fs . args)
	    (apply base-initrd fs
		   #:extra-modules '("raid1")
		   #:mapped-devices '((mapped-device
				       (source (list "/dev/sdb1" "/dev/sdc1"))
				       (target "/dev/md0")
				       (type raid-device-mapping)))				      
		   args)))
  (file-systems (cons (file-system
			(device "ssd-root")
			(title 'label)
			(mount-point "/")
			(type "ext4"))
		      %base-file-systems))
  (users (cons* (user-account
		 (name "glc")
		 (group "users")
		 (supplementary-groups '("wheel"))
		 (home-directory "/home/glc"))
		(user-account
		 (name "g1")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/g1"))
		(user-account
		 (name "g1x")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/g1x"))
		(user-account
		 (name "gx")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/gx"))
		%base-user-accounts))
  (packages
   (cons*
    glibc-utf8-locales
    parted
    mdadm
    qemu
    guix
    screen
    openssh nss-certs xauth
    rsync wget
    curl                                                     ;lpaste
    git git-manpages
    gs-fonts font-dejavu font-gnu-freefont-ttf
    aspell
    emacs
    flycheck paredit magit
    emacs-zenburn-theme emacs-markdown-mode emacs-web-mode
    cups
    graphviz
    %base-packages))
  (services (cons* (dhcp-client-service)
		   (lsh-service #:port-number 22)
		   %base-services)))

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

* Re: [PATCH} Add RAID devices.
  2016-07-30 23:05     ` myglc2
@ 2016-07-31  8:52       ` Andreas Enge
  2016-07-31 16:12         ` myglc2
  0 siblings, 1 reply; 19+ messages in thread
From: Andreas Enge @ 2016-07-31  8:52 UTC (permalink / raw)
  To: myglc2; +Cc: guix-devel

On Sat, Jul 30, 2016 at 07:05:25PM -0400, myglc2 wrote:
> > I might write a more detailed blog post about this; there is a little
> > subtlety with the non-automatic determination of dependencies between
> > devices, so one needs to make sure that the partitions to be assembled
> > are present before the mdadm command is executed.
> I rebooted and the array is not assembled ;-(

Strange! But I will also tell you the subtlety ;-)  Here is a trick to use
(thanks to Ludovic):
(define md0
  (mapped-device
    (source (list "/dev/sda2" "/dev/sdb2"))
      (target "/dev/md0")
      (type raid-device-mapping)))
(operating-system
...
  (mapped-devices (list md0))
  (file-systems (cons (file-system
                        (title 'device)
                        (device "/dev/md0")
                        (dependencies (list md0))
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))

The "dependencies" field makes sure that the file system is only mounted
after the array is assembled; I am not sure that this is your problem,
but you might want to give it a try.

In the long run, this should be reprogrammed: Devices and file systems
should wait until all their "inputs" are present, or at least wait for
a reasonable time.


Andreas

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

* Re: [PATCH} Add RAID devices.
  2016-07-31  8:52       ` Andreas Enge
@ 2016-07-31 16:12         ` myglc2
  2016-07-31 16:25           ` Andreas Enge
  0 siblings, 1 reply; 19+ messages in thread
From: myglc2 @ 2016-07-31 16:12 UTC (permalink / raw)
  To: guix-devel

[-- Attachment #1: Type: text/plain, Size: 1612 bytes --]

Andreas Enge <andreas@enge.fr> writes:

> On Sat, Jul 30, 2016 at 07:05:25PM -0400, myglc2 wrote:
>> > I might write a more detailed blog post about this; there is a little
>> > subtlety with the non-automatic determination of dependencies between
>> > devices, so one needs to make sure that the partitions to be assembled
>> > are present before the mdadm command is executed.
>> I rebooted and the array is not assembled ;-(
>
> Strange! But I will also tell you the subtlety ;-)  Here is a trick to use
> (thanks to Ludovic):
> (define md0
>   (mapped-device
>     (source (list "/dev/sda2" "/dev/sdb2"))
>       (target "/dev/md0")
>       (type raid-device-mapping)))
> (operating-system
> ...
>   (mapped-devices (list md0))
>   (file-systems (cons (file-system
>                         (title 'device)
>                         (device "/dev/md0")
>                         (dependencies (list md0))
>                         (mount-point "/")
>                         (type "ext4"))
>                       %base-file-systems))
>
> The "dependencies" field makes sure that the file system is only mounted
> after the array is assembled; I am not sure that this is your problem,
> but you might want to give it a try.
>
> In the long run, this should be reprogrammed: Devices and file systems
> should wait until all their "inputs" are present, or at least wait for
> a reasonable time.

Thanks, I tried that. the 'guix system reconfigure' succeeds and starts
the raid array (please see system35.scm & system35.log, attached).

But the reboot hangs at:

[...] clocksource: Switched to clocksource tsc


[-- Attachment #2: system35.log --]
[-- Type: application/octet-stream, Size: 1418 bytes --]

root@g1 ~# cat /proc/mdstat
Personalities : [raid1] 
unused devices: <none>
root@g1 ~# rm -fr /mnt/md0
root@g1 ~# ls /mnt
root@g1 ~# guix system reconfigure system35.scm
substitute: updating list of substitutes from 'https://mirror.hydra.gnu.org'... 100.0%
The following derivation will be built:
   /gnu/store/rd6m57pga9ddf9lsvfja6jybb1vnrj7d-grub.cfg.drv
/gnu/store/l1mpwaxlf2nhm18vzxir9npdi2inis7j-system
/gnu/store/s6x0j9cy0vgfnzc6xybrgcx0k327brrf-grub.cfg
/gnu/store/7p3pc22s5ap4smm6habggjcgj83aaidv-grub-2.02beta3
activating system...
setting up setuid programs in '/run/setuid-programs'...
populating /etc from /gnu/store/7v9p4s8hkx8k58vsz6zk1q58hws9dmbz-etc...
usermod: no changes
usermod: no changes
usermod: no changes
making '/gnu/store/l1mpwaxlf2nhm18vzxir9npdi2inis7j-system' the current system...
guix system: loading new services: device-mapping-/dev/md0 file-system-/mnt/md0...
shepherd: Evaluating user expression (register-services (primitive-load "/gn...") #).
shepherd: Service device-mapping-/dev/md0 has been started.
shepherd: Service file-system-/mnt/md0 has been started.
Installing for i386-pc platform.
Installation finished. No error reported.
root@g1 ~# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sdc1[0] sdb1[1]
      239809536 blocks super 1.2 [2/2] [UU]
      bitmap: 1/2 pages [4KB], 65536KB chunk

unused devices: <none>
root@g1 ~# exit
exit

Process shell finished

[-- Attachment #3: system35.scm --]
[-- Type: application/octet-stream, Size: 2375 bytes --]

;;; g1 system config
(use-modules (gnu))
(use-service-modules networking ssh)
(use-package-modules
 base
 admin
 disk
 linux                 ; mdadm
 package-management    ; guix
 screen
 ghostscript           ; gs-fonts
 fonts                 ; font-dejavu font-gnu-freefont-ttf
 curl                  ; lpaste
 ssh
 xorg certs
 rsync
 wget
 version-control       ; git
 aspell
 emacs
 cups
 graphviz
 qemu
 )
(define md0
  (mapped-device
   (source (list "/dev/sdb1" "/dev/sdc1"))
   (target "/dev/md0")
   (type raid-device-mapping)))
(operating-system
  (host-name "g1")
  (timezone "America/New_York")
  (locale "en_US.utf8")
  (bootloader (grub-configuration (device "/dev/sda")))
  (mapped-devices (list md0))
  (initrd (lambda (fs . args)
	    (apply base-initrd fs
		   #:extra-modules '("raid1")
		   #:mapped-devices '((mapped-device
				       (source (list "/dev/sdb1" "/dev/sdc1"))
				       (target "/dev/md0")
				       (type raid-device-mapping)))				      
		   args)))
  (file-systems (cons*
		 (file-system
		   (device "ssd-root")
		   (title 'label)
		   (mount-point "/")
		   (type "ext4"))
		 (file-system
		   (title 'device)
		   (device "/dev/md0")
		   (dependencies (list md0))
		   (mount-point "/mnt/md0")
		   (create-mount-point? #t)
		   (type "ext4"))
		 %base-file-systems))
  (users (cons* (user-account
		 (name "glc")
		 (group "users")
		 (supplementary-groups '("wheel"))
		 (home-directory "/home/glc"))
		(user-account
		 (name "g1")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/g1"))
		(user-account
		 (name "g1x")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/g1x"))
		(user-account
		 (name "gx")
		 (group "users")
		 (supplementary-groups '("wheel" "kvm"))
		 (home-directory "/home/gx"))
		%base-user-accounts))
  (packages
   (cons*
    glibc-utf8-locales
    parted
    mdadm
    qemu
    guix
    screen
    openssh nss-certs xauth
    rsync wget
    curl                                                     ;lpaste
    git git-manpages
    gs-fonts font-dejavu font-gnu-freefont-ttf
    aspell
    emacs
    flycheck paredit magit
    emacs-zenburn-theme emacs-markdown-mode emacs-web-mode
    cups
    graphviz
    %base-packages))
  (services (cons* (dhcp-client-service)
		   (lsh-service #:port-number 22)
		   %base-services)))

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

* Re: [PATCH} Add RAID devices.
  2016-07-31 16:12         ` myglc2
@ 2016-07-31 16:25           ` Andreas Enge
  2016-08-02  1:05             ` myglc2
  0 siblings, 1 reply; 19+ messages in thread
From: Andreas Enge @ 2016-07-31 16:25 UTC (permalink / raw)
  To: myglc2; +Cc: guix-devel

On Sun, Jul 31, 2016 at 12:12:02PM -0400, myglc2 wrote:
> Thanks, I tried that. the 'guix system reconfigure' succeeds and starts
> the raid array (please see system35.scm & system35.log, attached).
> 
> But the reboot hangs at:
> 
> [...] clocksource: Switched to clocksource tsc

No idea. The only difference I saw with my setup is that you have the
#:mapped-devices clause in the initrd; I am just using this:

  ;; Add a kernel module for RAID-10.
  (initrd (lambda (file-systems . rest)
            (apply base-initrd file-systems
                   #:extra-modules '("raid10")
                                   rest)))

Andreas

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

* Re: [PATCH} Add RAID devices.
  2016-07-31 16:25           ` Andreas Enge
@ 2016-08-02  1:05             ` myglc2
  0 siblings, 0 replies; 19+ messages in thread
From: myglc2 @ 2016-08-02  1:05 UTC (permalink / raw)
  To: guix-devel

Andreas Enge <andreas@enge.fr> writes:

>
> No idea. The only difference I saw with my setup is that you have the
> #:mapped-devices clause in the initrd; I am just using this:
>
>   ;; Add a kernel module for RAID-10.
>   (initrd (lambda (file-systems . rest)
>             (apply base-initrd file-systems
>                    #:extra-modules '("raid10")
>                                    rest)))
>
> Andreas

Unfortunately w/ this change the boot still hangs, so ... I will post it
to bug-guix. Thanks again! - George

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

end of thread, other threads:[~2016-08-02  7:04 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-14 13:13 [PATCH] Add mdadm to the installation image Andreas Enge
2016-07-14 14:53 ` Mathieu Lirzin
2016-07-14 19:21   ` Efraim Flashner
2016-07-14 21:42     ` Andreas Enge
2016-07-15 13:27       ` Ludovic Courtès
2016-07-15 17:10         ` Andreas Enge
2016-07-16 10:50           ` Ludovic Courtès
2016-07-16 12:44             ` Andreas Enge
2016-07-15 14:25 ` myglc2
2016-07-23 14:07   ` [PATCH} Add RAID devices Andreas Enge
2016-07-24  5:43     ` Chris Marusich
2016-07-25 20:59       ` Ludovic Courtès
2016-07-25 21:17       ` Andreas Enge
2016-07-26  7:43         ` Chris Marusich
2016-07-30 23:05     ` myglc2
2016-07-31  8:52       ` Andreas Enge
2016-07-31 16:12         ` myglc2
2016-07-31 16:25           ` Andreas Enge
2016-08-02  1:05             ` myglc2

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).