aboutsummaryrefslogtreecommitdiff
path: root/scripts/disk_image
diff options
context:
space:
mode:
authorStefano Stabellini2021-04-08 17:23:15 -0700
committerStefano Stabellini2021-05-17 14:49:53 -0700
commit5629a7a4a027bc78a5426bedefb3f9e803b49004 (patch)
treef4a955409903c55ed1479708a3cb6073a82d74d7 /scripts/disk_image
parent6f1950c30cfec0fee35a6c977166148274f037dd (diff)
Introduce multiple partitions support to disk_image
Rootfses that should be written to disk as their own partition are called *_ROOTFS instead of *_RAMDISK. This change makes the config file clearer and more consistent. However it changes the current behavior as the Dom0 RAMDISK (not ROOTFS) was written to disk as its own partition before, and now it is not. In the case of uboot-script-gen, dom0less guests cannot access disk partitions yet (missing PV drivers support). Hence, if one or more domU ROOTFSes are specified, print an error and exit. For dom0, base the root= parameter generation on the presence of DOM0_ROOTFS. Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com> Signed-off-by: Brian Woods <brian.woods@xilinx.com> Reviewed-by: Brian Woods <brian.woods@xilinx.com>
Diffstat (limited to 'scripts/disk_image')
-rwxr-xr-xscripts/disk_image137
1 files changed, 96 insertions, 41 deletions
diff --git a/scripts/disk_image b/scripts/disk_image
index 892056d..6f5f3e2 100755
--- a/scripts/disk_image
+++ b/scripts/disk_image
@@ -17,6 +17,46 @@ function check_depends()
done
}
+function add_partition()
+{
+ local rootfs="$1"
+ _part_size=`stat -L --printf="%s" $rootfs`
+ _part_size=$(( $_part_size + $offset - 1))
+ _part_size=$(( $_part_size & ~($offset - 1) ))
+ # account for gzip compression
+ _part_size=$(( $_part_size * 2 ))
+ # add some slack
+ _part_size=$(( 128*1024*1024 + $_part_size ))
+ _part_size=$(( $_part_size / 1024 / 1024 ))
+ echo PART size: "$_part_size"MB
+
+ prev=$(( $_npart - 1 ))
+ _sector_start[$_npart]=$(( ${_sector_end[$prev]} + 1 ))
+ _sector_end[$_npart]=$(( $_part_size * 1024 * 1024 / $_sector_size + ${_sector_start[$_npart]} - 1))
+
+ _tot_size=$(( $_tot_size + $_part_size ))
+ _npart=$(( $_npart + 1 ))
+}
+
+function write_cpio()
+{
+ local j=$1
+ local rootfs=$2
+
+ # create mount point and mount diskn
+ mkdir -p ${DESTDIR}/part/disk$j
+ mount -t ext4 /dev/mapper/diskimage$j $DESTDIR/part/disk$j
+
+ # Extract rootfs cpio archive into `.../part/vos_$j`
+ cd ${DESTDIR}/part/disk$j
+ cat "${UBOOT_OUT_ABS}/$rootfs" | gunzip | cpio -id
+ cd -
+
+ # umount
+ sync
+ umount $DESTDIR/part/disk$j
+}
+
function print_help
{
echo "usage:"
@@ -115,27 +155,28 @@ _part1_size=$(( $_part1_size & ~($offset - 1) ))
_part1_size=$(( $_part1_size / 1024 / 1024 ))
echo PART1 size: "$_part1_size"MB
-if test "$DOM0_RAMDISK"
+_sector_size=512
+# _sector_start[0] needs to be aligned to 2048
+_sector_start[0]=2048
+_sector_end[0]=$(( $_part1_size * 1024 * 1024 / $_sector_size + ${_sector_start[0]} - 1))
+_tot_size=$(( $_part1_size ))
+_npart=1
+
+if test "$DOM0_ROOTFS"
then
- _part2_size=`stat -L --printf="%s" $UBOOT_OUT/$DOM0_RAMDISK`
+ add_partition "$UBOOT_OUT/$DOM0_ROOTFS"
fi
-_part2_size=$(( $_part2_size + $offset - 1))
-_part2_size=$(( $_part2_size & ~($offset - 1) ))
-# account for gzip compression
-_part2_size=$(( $_part2_size * 2 ))
-# add some slack
-_part2_size=$(( 128*1024*1024 + $_part2_size ))
-_part2_size=$(( $_part2_size / 1024 / 1024 ))
-echo PART2 size: "$_part2_size"MB
-
-_sector_size=512
-# _sector_first_start needs to be aligned to 2048
-_sector_first_start=2048
-_sector_first_end=$(( $_part1_size * 1024 * 1024 / $_sector_size + $_sector_first_start - 1))
-_sector_second_start=$(( $_sector_first_end + 1 ))
-_sector_second_end=$(( $_part2_size * 1024 * 1024 / $_sector_size + $_sector_second_start - 1))
-_tot_size=$(( $_part1_size + $_part2_size + 16 ))
+i=0
+while test $i -lt $NUM_DOMUS
+do
+ if test "${DOMU_ROOTFS[$i]}"
+ then
+ add_partition "$UBOOT_OUT/${DOMU_ROOTFS[$i]}"
+ fi
+ i=$(( $i + 1 ))
+done
+_tot_size=$(( $_tot_size + 16 ))
# NOTE: Increase vos_a to 256 to accomodate rootfs
# 528 MiB (256 + 256 + 16)
@@ -144,8 +185,14 @@ truncate $IMG -s "$_tot_size"M
# create GPT partition table
sgdisk -og $IMG
-sgdisk -n 1:$_sector_first_start:$_sector_first_end -c 1:"Linux1" -t 1:8300 $IMG
-sgdisk -n 2:$_sector_second_start:$_sector_second_end -c 2:"Linux2" -t 2:8300 $IMG
+i=0
+j=1
+while test $i -lt $_npart
+do
+ sgdisk -n $j:${_sector_start[$i]}:${_sector_end[$i]} -c $j:"Linux""$j" -t $j:8300 $IMG
+ i=$(( $i + 1 ))
+ j=$(( $j + 1 ))
+done
# find the first available loop device
_loop_dev=$(losetup -f)
@@ -165,31 +212,20 @@ done
kpartx -a /dev/mapper/diskimage
-# ensure that /dev/mapper/{diskimage1,diskimage2} exists
-while [ ! -b /dev/mapper/diskimage1 ] || [ ! -b /dev/mapper/diskimage2 ]
+# ensure that /dev/mapperdiskimage1 exists
+while [ ! -b /dev/mapper/diskimage1 ]
do
sleep 2
done
-# format vos_a partition
-mkfs.ext4 -L vos_a -F /dev/mapper/diskimage1
-
-# format vos_b partition
-mkfs.ext4 -L vos_b -F /dev/mapper/diskimage2
-
-
-# create mount point and mount disk2
-mkdir -p ${DESTDIR}/part/disk2
-mount -t ext4 /dev/mapper/diskimage2 $DESTDIR/part/disk2
-
-# Extract rootfs cpio archive into `.../part/vos_a`
-cd ${DESTDIR}/part/disk2
-cat "${UBOOT_OUT_ABS}/${DOM0_RAMDISK}" | gunzip | cpio -id
-cd -
-
-# umount
-sync
-umount $DESTDIR/part/disk2
+i=0
+j=1
+while test $i -lt $_npart
+do
+ mkfs.ext4 -L vos_$j -F /dev/mapper/diskimage$j
+ i=$(( $i + 1 ))
+ j=$(( $j + 1 ))
+done
# create mount point and mount disk1
mkdir -p ${DESTDIR}/part/disk1
@@ -224,6 +260,25 @@ sync
# fstrim $DESTDIR/part/disk1
umount $DESTDIR/part/disk1
+j=2
+if test "$DOM0_ROOTFS"
+then
+ write_cpio 2 "$DOM0_ROOTFS"
+ j=$(( $j + 1 ))
+fi
+
+i=0
+while test $i -lt $NUM_DOMUS
+do
+ if test "${DOMU_ROOTFS[$i]}"
+ then
+ write_cpio $j "${DOMU_ROOTFS[$i]}"
+ j=$(( $j + 1 ))
+ fi
+ i=$(( $i + 1 ))
+done
+
+
kpartx -d /dev/mapper/diskimage
dmsetup remove diskimage
losetup -d $_loop_dev