diff options
author | Mathieu Othacehe <othacehe@gnu.org> | 2022-12-08 13:24:02 +0100 |
---|---|---|
committer | Mathieu Othacehe <othacehe@gnu.org> | 2022-12-10 11:23:27 +0100 |
commit | 1ab48edb1674e0454d4368fdbed16cbbdfd9bf06 (patch) | |
tree | 4c946fc8edaef59ea40f21715f7e4acf7c5fbd04 | |
parent | b129026e2e242e9068158ae6e6fcd8d7c5ea092e (diff) | |
download | guix-1ab48edb1674e0454d4368fdbed16cbbdfd9bf06.tar.gz |
installer: Detect mapped installation devices.
Fixes: <https://issues.guix.gnu.org/59823> * gnu/installer/parted.scm (mapped-device?, mapped-device-parent-partition): New procedures. (eligible-devices): Detect mapped installation devices using the new procedures.
-rw-r--r-- | gnu/installer/parted.scm | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/gnu/installer/parted.scm b/gnu/installer/parted.scm index 82375d29e3..51fa7cf9d9 100644 --- a/gnu/installer/parted.scm +++ b/gnu/installer/parted.scm @@ -379,12 +379,44 @@ fail. See rereadpt function in wipefs.c of util-linux for an explanation." (define %min-device-size (* 2 GIBIBYTE-SIZE)) ;2GiB +(define (mapped-device? device) + "Return #true if DEVICE is a mapped device, false otherwise." + (string-prefix? "/dev/dm-" device)) + +;; TODO: Use DM_TABLE_DEPS ioctl instead of dmsetup. +(define (mapped-device-parent-partition device) + "Return the parent partition path of the mapped DEVICE." + (let* ((command `("dmsetup" "deps" ,device "-o" "devname")) + (parent #f) + (handler + (lambda (input) + ;; We are parsing an output that should look like: + ;; 1 dependencies : (sda2) + (let ((result + (string-match "\\(([^\\)]+)\\)" + (get-string-all input)))) + (and result + (set! parent + (format #f "/dev/~a" + (match:substring result 1)))))))) + (run-external-command-with-handler handler command) + parent)) + (define (eligible-devices) "Return all the available devices except the install device and the devices which are smaller than %MIN-DEVICE-SIZE." (define the-installer-root-partition-path - (installer-root-partition-path)) + (let ((root (installer-root-partition-path))) + (cond + ((mapped-device? root) + ;; If the partition is a mapped device (/dev/dm-X), locate the parent + ;; partition. It is the case when Ventoy is used to host the + ;; installation image. + (let ((parent (mapped-device-parent-partition root))) + (installer-log-line "mapped device ~a -> ~a" parent root) + parent)) + (else root)))) (define (small-device? device) (let ((length (device-length device)) |