[elbe-devel] [PATCH v2 4/9] hdimg: implement partition filles with binary data from file

Torben Hohn torben.hohn at linutronix.de
Tue Dec 15 17:33:14 CET 2020


Allow generating a raw partition, that contains a bootloader or
the kernel.

Signed-off-by: Torben Hohn <torben.hohn at linutronix.de>
Reviewed-by: Bastian Germann <bage at linutronix.de>
---
 elbepack/hdimg.py | 27 ++++++++++++++++++++++++---
 schema/dbsfed.xsd |  9 +++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/elbepack/hdimg.py b/elbepack/hdimg.py
index 965fff856..ccd1ef86f 100644
--- a/elbepack/hdimg.py
+++ b/elbepack/hdimg.py
@@ -13,7 +13,7 @@ import os
 import parted
 import _ped
 
-from elbepack.fstab import fstabentry, mountpoint_dict
+from elbepack.fstab import fstabentry, mountpoint_dict, hdpart
 from elbepack.filesystem import Filesystem, size_to_int
 from elbepack.shellhelper import do, CommandError, chroot, get_command_out
 
@@ -370,6 +370,23 @@ def create_label(disk, part, ppart, fslabel, target, grub):
 
     return ppart
 
+def create_binary(disk, part, ppart, target):
+
+    entry = hdpart()
+    entry.set_geometry(ppart, disk)
+
+    loopdev = entry.losetup()
+
+    # copy from buildenv if path starts with /
+    if part.text("binary")[0] == '/':
+        tmp = target + "/" + "chroot" + part.text("binary")
+    # copy from project directory
+    else:
+        tmp = target + "/" + part.text("binary")
+
+    do(f'dd if="{tmp}" of="{loopdev}"')
+
+    do(f'losetup -d "{loopdev}"')
 
 def create_logical_partitions(disk,
                               extended,
@@ -395,7 +412,9 @@ def create_logical_partitions(disk,
             fslabel,
             size_in_sectors,
             current_sector)
-        if logical.has("label") and logical.text("label") in fslabel:
+        if logical.has('binary'):
+            create_binary(disk, logical, lpart, target)
+        elif logical.has("label") and logical.text("label") in fslabel:
             create_label(disk, logical, lpart, fslabel, target, grub)
 
         current_sector += lpart.getLength()
@@ -443,7 +462,9 @@ def do_image_hd(hd, fslabel, target, grub_version, grub_fw_type=None):
                 fslabel,
                 size_in_sectors,
                 current_sector)
-            if part.text("label") in fslabel:
+            if part.has("binary"):
+                create_binary(disk, part, ppart, target)
+            elif part.text("label") in fslabel:
                 create_label(disk, part, ppart, fslabel, target, grub)
         elif part.tag == "extended":
             ppart = create_partition(
diff --git a/schema/dbsfed.xsd b/schema/dbsfed.xsd
index 88d26a75c..d6ca98bb4 100644
--- a/schema/dbsfed.xsd
+++ b/schema/dbsfed.xsd
@@ -1770,6 +1770,15 @@
           </documentation>
         </annotation>
       </element>
+      <element name="binary" type="rfs:string" minOccurs="0">
+        <annotation>
+          <documentation>
+            path and filename of a binary image which will be used as a source
+	    for this volume; this can be used for example to store a bootloader
+	    in a partition.
+          </documentation>
+        </annotation>
+      </element>
       <element name="bootable" type="rfs:string" minOccurs="0">
         <annotation>
           <documentation>
-- 
2.20.1



More information about the elbe-devel mailing list