From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp11.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms9.migadu.com with LMTPS id wCiaDhhQlmSixgAASxT56A (envelope-from ) for ; Sat, 24 Jun 2023 04:08:24 +0200 Received: from aspmx1.migadu.com ([2001:41d0:8:6d80::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp11.migadu.com with LMTPS id UBytDhhQlmSiYgEA9RJhRA (envelope-from ) for ; Sat, 24 Jun 2023 04:08:24 +0200 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id DE57D3CCB8 for ; Sat, 24 Jun 2023 04:08:23 +0200 (CEST) Authentication-Results: aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=lease-up.com header.s=2017 header.b=a5VtM+pf; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Seal: i=1; s=key1; d=yhetil.org; t=1687572504; a=rsa-sha256; cv=none; b=aR8ahjUhkJyQF8k6azmQ2XGHFW+tg5vpJJ5Sni2lMQ/FScTis26NB1/wCB/wM5MJAKD3fE RvuWr76IKFfz8VzFCH159/3KPeZ01BOG5kkvSZ8mAHtpmuUeQSgl52mGmEv+tg8EdLi9AW 8+8Xhdn5DTDVU3zEyp/NuLlJw+BjjnPopVAXUYLYYlYFfA+1uzFJZ4L1ad7GDBar+jY8Kx ZrV+dEbzRB1Y9wP7KeK3GIbYSRIN9G4jBKx0OT8th3EZrcT5nmHS3PtU+dNYzhHG/q1jJ8 BOhgOudLqLEhk4JIw9lmLE0XUL1z31dEW/iLJarWxbVgkJovS83B7Yz4OGnWdg== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=fail ("headers rsa verify failed") header.d=lease-up.com header.s=2017 header.b=a5VtM+pf; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1687572504; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding:resent-cc: resent-from:resent-sender:resent-message-id:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=O5E4ubxRbbAarYkR4P/WJBTbgK/4t3Ng3yqPv7ipUFw=; b=jVIh0NaGN1H82Ag/yxVJlTaS4uIOMvcbDiyYqbUoHtv8CpiKnl/FbciaJxlt+70qkPjjwv UpJGPqlT8nTtqZtrvpr8xvIEAFwJ/LcXi4Ik4o0dhfGkXDpLVY3n4G4JtDMaGQKag7IRv9 yNcnxJDVEHqzCQ9Mll6g8wnlDIw3EaeNWLtzBd/eAk+Tj5Cu8qjEHi/LuHhRxHlMOrfuW2 PtBw2eIDqBluRrFsRNi50pzcPJ4ZqQaoNKKKmPpGWeHrgUFGKEEpiZ5aVLIyHYf2mpvWjV mZ1+QEvLgQKnETmMLgnKhVtHbncPP0duqIRNTBb+6ZgI8f+ACT+C6f7jygklpA== Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qCsh2-0004Rd-Qv; Fri, 23 Jun 2023 22:08:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qCsh1-0004Po-1z for guix-patches@gnu.org; Fri, 23 Jun 2023 22:08:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qCsh0-0006SH-Pt for guix-patches@gnu.org; Fri, 23 Jun 2023 22:08:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qCsh0-0002mc-L6 for guix-patches@gnu.org; Fri, 23 Jun 2023 22:08:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#64259] [PATCH 2/2] Provide md-array-device-mapping to start MD arrays via UUID or name. Resent-From: Felix Lechner Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sat, 24 Jun 2023 02:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64259 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 64259@debbugs.gnu.org Cc: Felix Lechner Received: via spool by 64259-submit@debbugs.gnu.org id=B64259.168757245210651 (code B ref 64259); Sat, 24 Jun 2023 02:08:02 +0000 Received: (at 64259) by debbugs.gnu.org; 24 Jun 2023 02:07:32 +0000 Received: from localhost ([127.0.0.1]:39729 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qCsgW-0002li-0x for submit@debbugs.gnu.org; Fri, 23 Jun 2023 22:07:32 -0400 Received: from sail-ipv4.us-core.com ([208.82.101.137]:40014) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qCsgS-0002lK-Bj for 64259@debbugs.gnu.org; Fri, 23 Jun 2023 22:07:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; s=2017; bh=KOtBn5jGD+v4lQ4 avqQTJ9M2SOqc2YekIJ9XsZtcNu8=; h=references:in-reply-to:date:subject: cc:to:from; d=lease-up.com; b=a5VtM+pfFaMuez8BzP8MFF7f2OykEdM4YJcHtrzw O+GObCENEJEBEEC1hXqqDctQl1gfTZl7KHRIKmu0QCWMsbx3R6cKT/9VL1KfkXMm1ROUbS 5LXMSuFqVZEmkmGjM3z5w38tPngeasxOonkL0dz3bFPqZROPNROE6WjYgb4fc= Received: by sail-ipv4.us-core.com (OpenSMTPD) with ESMTPSA id 42987ceb (TLSv1.3:TLS_CHACHA20_POLY1305_SHA256:256:NO); Sat, 24 Jun 2023 02:07:26 +0000 (UTC) Received: from localhost (localhost [local]) by localhost (OpenSMTPD) with ESMTPA id 8cc111eb; Sat, 24 Jun 2023 02:07:25 +0000 (UTC) Date: Fri, 23 Jun 2023 19:07:23 -0700 Message-Id: <4e7eab10caeacfb1f8a0736cdab7154c517b9e36.1687571974.git.felix.lechner@lease-up.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-to: Felix Lechner X-ACL-Warn: , Felix Lechner via Guix-patches From: Felix Lechner via Guix-patches via Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Scanner: scn1.migadu.com X-Migadu-Spam-Score: -3.25 X-Migadu-Queue-Id: DE57D3CCB8 X-Spam-Score: -3.25 X-TUID: gcuJHE6UnVHl This commit cures the most precipitous danger for users of MD arrays in GNU Guix, namely that their equipment may not boot after a drive failure. That behavior likely contradicts their primary expectation for having such a disk arrangments. In order to facilitate a smooth transition from raid-device-mapping to md-array-device-mapping, this commit introduces a new mapping rather than repurpose the old one. The new mapping here is also incompatible with raid-device-mapping in the sense that a plain string is now interpreted as the array name from the MD superblock. For details, please consult the mdadm manual page. Personally, the author prefers UUIDs over array names when identifying array components, but either will work. The system test uses the name. The name for the new device mapping was chosen instead of the traditional RAID to account for the fact that some modern technologies (like SSDs) and some array configurations, such as striping, are neither redundant nor inexpensive. Adjusts the documentation by erasing any mention of the obsolete raid-device-mapping. No one should use that any longer. Ideally, users would be a deprecation warning, but I was unable to adapt 'define-deprecated' to this use case. Please feel free to make further changes. This commit includes an updated system test for the root file system on an-md-array. More details for the motivation of these changes may be available here: https://lists.gnu.org/archive/html/guix-devel/2023-04/msg00010.html The author of this commit used to maintain mdadm in Debian. Please feel free to insert better changelog messages. I had some difficulty meeting the likely expectations of any reviewer. Please also feel free to make any other adjustments as needed without checking with me. Thanks! * gnu/system/mapped-devices.scm: New variable md-array-device-mapping. * doc/guix.texi: Mention md-array-device-mapping in the documentation.. * gnu/tests/install.scm: Adjust test for root-on-md-array. --- doc/guix.texi | 28 ++++++++++++++------------ gnu/system/mapped-devices.scm | 38 ++++++++++++++++++++++++++++++++++- gnu/tests/install.scm | 32 ++++++++++++++--------------- 3 files changed, 68 insertions(+), 30 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index c961f706ec..91125479b1 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -17513,18 +17513,19 @@ the system boots up. @table @code @item source -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. In case of LVM this is a -string specifying name of the volume group to be mapped. +This is either a string specifying the name of the block device to be +mapped, such as @code{"/dev/sda3"}. For MD array devices it is either +the UUID of the array or a string that is interpreted as the array name +(see Mdadm documentation). In case of LVM it is a string specifying +name of the volume group to be mapped. @item target 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. +For MD array devices of type @code{md-array-device-mapping}, the full device +name such as @code{"/dev/md18"} needs to be given. LVM logical volumes of type @code{lvm-device-mapping} need to be specified as @code{"VGNAME-LVNAME"}. @@ -17544,11 +17545,12 @@ command from the package with the same name. It relies on the @code{dm-crypt} Linux kernel module. @end defvar -@defvar raid-device-mapping +@defvar md-array-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. +command from the package with the same name. It requires the Linux kernel +module for the appropriate RAID level to be loaded, such as @code{raid1} +for mirroring, @code{raid456} for the checksum-based RAID levels 4, 5 or 6, +or @code{raid10} for RAID-10. @end defvar @cindex LVM, logical volume manager @@ -17606,9 +17608,9 @@ may be declared as follows: @lisp (mapped-device - (source (list "/dev/sda1" "/dev/sdb1")) - (target "/dev/md0") - (type raid-device-mapping)) + (source (uuid "33cf3e31:8e33d75b:517d64b9:0a8f7623" 'mdadm)) + (target "/dev/md17") + (type md-array-device-mapping)) @end lisp The @file{/dev/md0} device can then be used as the @code{device} of a diff --git a/gnu/system/mapped-devices.scm b/gnu/system/mapped-devices.scm index e6b8970c12..ffe5bc00f4 100644 --- a/gnu/system/mapped-devices.scm +++ b/gnu/system/mapped-devices.scm @@ -64,6 +64,7 @@ (define-module (gnu system mapped-devices) check-device-initrd-modules ;XXX: needs a better place luks-device-mapping + md-array-device-mapping raid-device-mapping lvm-device-mapping)) @@ -317,11 +318,46 @@ (define raid-device-mapping (open open-raid-device) (close close-raid-device))) +(define (open-md-array-device source targets) + "Return a gexp that assembles SOURCE to the MD device +TARGET (e.g., \"/dev/md0\"), using 'mdadm'." + (let ((array-selector + (match source + ((? uuid?) + (string-append "--uuid=" (uuid->string source))) + ((? string?) + (string-append "--name=" source)))) + (md-device + (match targets + ((target) + target)))) + (if (and array-selector md-device) + ;; Use 'mdadm-static' rather than 'mdadm' to avoid pulling its whole + ;; closure (80 MiB) in the initrd when an MD device is needed for boot. + #~(zero? (system* #$(file-append mdadm-static "/sbin/mdadm") + "--assemble" #$md-device + "--run" + #$array-selector)) + #f))) + +(define (close-md-array-device source targets) + "Return a gexp that stops the MD device TARGET." + (match targets + ((target) + #~(zero? (system* #$(file-append mdadm-static "/sbin/mdadm") + "--stop" #$target))))) + +(define md-array-device-mapping + ;; The type of MD mapped device. + (mapped-device-kind + (open open-md-array-device) + (close close-md-array-device))) + (define (open-lvm-device source targets) #~(and (zero? (system* #$(file-append lvm2-static "/sbin/lvm") "vgchange" "--activate" "ay" #$source)) - ; /dev/mapper nodes are usually created by udev, but udev may be unavailable at the time we run this. So we create them here. + ; /dev/mapper nodes are usually created by udev, but udev may be unavailable at the time we run this. So we create them here. (zero? (system* #$(file-append lvm2-static "/sbin/lvm") "vgscan" "--mknodes")) (every file-exists? (map (lambda (file) (string-append "/dev/mapper/" file)) diff --git a/gnu/tests/install.scm b/gnu/tests/install.scm index 0f4204d1a6..061365fd87 100644 --- a/gnu/tests/install.scm +++ b/gnu/tests/install.scm @@ -64,7 +64,7 @@ (define-module (gnu tests install) %test-iso-image-installer %test-separate-store-os %test-separate-home-os - %test-raid-root-os + %test-md-array-root-os %test-encrypted-root-os %test-encrypted-home-os %test-encrypted-root-not-boot-os @@ -612,11 +612,11 @@ (define %test-separate-store-os ;;; -;;; RAID root device. +;;; MD root device. ;;; -(define-os-with-source (%raid-root-os %raid-root-os-source) - ;; An OS whose root partition is a RAID partition. +(define-os-with-source (%md-array-root-os %md-array-root-os-source) + ;; An OS whose root partition is a MD partition. (use-modules (gnu) (gnu tests)) (operating-system @@ -633,9 +633,9 @@ (define-os-with-source (%raid-root-os %raid-root-os-source) (initrd-modules (cons "raid1" %base-initrd-modules)) (mapped-devices (list (mapped-device - (source (list "/dev/vda2" "/dev/vda3")) + (source "marionette:mirror0") (target "/dev/md0") - (type raid-device-mapping)))) + (type md-array-device-mapping)))) (file-systems (cons (file-system (device (file-system-label "root-fs")) (mount-point "/") @@ -649,7 +649,7 @@ (define-os-with-source (%raid-root-os %raid-root-os-source) (guix combinators))))) %base-services)))) -(define %raid-root-installation-script +(define %md-array-root-installation-script ;; Installation with a separate /gnu partition. See ;; for more on RAID and ;; mdadm. @@ -665,8 +665,8 @@ (define %raid-root-installation-script mkpart primary ext2 1.6G 3.2G \\ set 1 boot on \\ set 1 bios_grub on -yes | mdadm --create /dev/md0 --verbose --level=mirror --raid-devices=2 \\ - /dev/vdb2 /dev/vdb3 +yes | mdadm --create /dev/md0 --verbose --homehost=marionette --name=mirror0 \\ + --level=mirror --raid-devices=2 /dev/vdb2 /dev/vdb3 mkfs.ext4 -L root-fs /dev/md0 mount /dev/md0 /mnt df -h /mnt @@ -677,21 +677,21 @@ (define %raid-root-installation-script sync reboot\n") -(define %test-raid-root-os +(define %test-md-array-root-os (system-test - (name "raid-root-os") + (name "md-array-root-os") (description "Test functionality of an OS installed with a RAID root partition managed by 'mdadm'.") (value - (mlet* %store-monad ((images (run-install %raid-root-os - %raid-root-os-source + (mlet* %store-monad ((images (run-install %md-array-root-os + %md-array-root-os-source #:script - %raid-root-installation-script + %md-array-root-installation-script #:target-size (* 3200 MiB))) (command (qemu-command* images))) - (run-basic-test %raid-root-os - `(,@command) "raid-root-os"))))) + (run-basic-test %md-array-root-os + `(,@command) "md-array-root-os"))))) ;;; -- 2.40.1