diff options
author | Stefano Stabellini | 2021-04-08 17:23:15 -0700 |
---|---|---|
committer | Stefano Stabellini | 2021-05-17 14:49:53 -0700 |
commit | 5629a7a4a027bc78a5426bedefb3f9e803b49004 (patch) | |
tree | f4a955409903c55ed1479708a3cb6073a82d74d7 /scripts/disk_image | |
parent | 6f1950c30cfec0fee35a6c977166148274f037dd (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-x | scripts/disk_image | 137 |
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 |