Reread partition table after installing MBR to ensure devices exist
authorMichael Prokop <mika@grml.org>
Wed, 3 Jun 2020 11:45:54 +0000 (13:45 +0200)
committerMichael Prokop <mika@grml.org>
Wed, 3 Jun 2020 12:03:59 +0000 (14:03 +0200)
We need to execute blockdev after installing the MBR, otherwise
the devices might not exist yet as expected and executing syslinux
can fail therefore.

While at it remove duplicate mbrtemplate python docstring in install_mbr

Closes: grml/grml2usb#33
Thanks: Darshaka Pathirana for debugging

grml2usb

index fdc0cac..867bea0 100755 (executable)
--- a/grml2usb
+++ b/grml2usb
@@ -748,16 +748,14 @@ def install_mbr(mbrtemplate, device, partition, ismirbsdmbr=True):
     "mbrtemplate" file, set the "partition" (0..3) active, and install the
     result back to "device".
 
-    @mbrtemplate: default MBR file
+    @mbrtemplate: default MBR file (must be a valid MBR file of at least 440
+    (or 439 if ismirbsdmbr) bytes)
 
     @device: name of a file assumed to be a hard disc (or USB stick) image, or
     something like "/dev/sdb"
 
     @partition: must be a number between 0 and 3, inclusive
 
-    @mbrtemplate: must be a valid MBR file of at least 440 (or 439 if
-    ismirbsdmbr) bytes.
-
     @ismirbsdmbr: if true then ignore the active flag, set the mirbsdmbr
     specific flag to 0/1/2/3 and set the MBR's default value accordingly. If
     false then leave the mirbsdmbr specific flag set to FFh, set all
@@ -875,6 +873,14 @@ def install_mbr(mbrtemplate, device, partition, ismirbsdmbr=True):
     proc = subprocess.Popen(["sync"])
     proc.wait()
 
+    logging.debug("Probing device via 'blockdev --rereadpt %s'", device)
+    proc = subprocess.Popen(["blockdev", "--rereadpt", device])
+    proc.wait()
+    if proc.returncode != 0:
+        raise Exception(
+            "Couldn't execute blockdev on '%s' (install util-linux?)", device
+        )
+
     set_rw(device)