From 5629a7a4a027bc78a5426bedefb3f9e803b49004 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Thu, 8 Apr 2021 17:23:15 -0700 Subject: 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 Signed-off-by: Brian Woods Reviewed-by: Brian Woods --- README.md | 18 +++++-- scripts/disk_image | 137 +++++++++++++++++++++++++++++++++-------------- scripts/uboot-script-gen | 12 +++-- 3 files changed, 119 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index f7da514..eaa7431 100644 --- a/README.md +++ b/README.md @@ -106,10 +106,20 @@ Where:\ ## scripts/disk\_image -The ImageBuilder script that generates a disk image file to load on a -SD or SATA drive. This creates 2 partitions: boot partition where the -boot files from working directory (-c option) are, and the dom0 ramdisk -uncompressed into the root FS partition. +The ImageBuilder script that generates a disk image file to load on a SD +or SATA drive. This creates multiple partitions: 1 boot partition where +the boot files from working directory (-c option) are, and 1 additional +partition for each Dom0/DomU cpio archive to write to disk. + +disk\_image will write to disk as separate partition each file specified +as follows: + +- DOM0_ROOTFS specifies the Dom0 rootfs to use. Note that the file to + write should be a regular cpio.gz file, not a u-boot binary. + +- DOMU_ROOTFS[number] specifies the DomU rootfs to use. Note that it + should be a regular cpio.gz file, not a u-boot binary. + After you've generated the u-boot scripts using the uboot-script-gen script, disk_image is run as follows: 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 diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen index bc41d1f..d878bf6 100755 --- a/scripts/uboot-script-gen +++ b/scripts/uboot-script-gen @@ -66,7 +66,7 @@ function device_tree_editing() echo "fdt mknod /chosen dom0" >> $UBOOT_SOURCE echo "fdt set /chosen/dom0 compatible \"xen,linux-zimage\" \"xen,multiboot-module\"" >> $UBOOT_SOURCE echo "fdt set /chosen/dom0 reg <0x0 "$dom0_kernel_addr" 0x0 "$dom0_kernel_size">" >> $UBOOT_SOURCE - if test "$LOAD_CMD" = "tftpb" + if test "$DOM0_RAMDISK" then echo "fdt set /chosen xen,dom0-bootargs \"$DOM0_CMD\"" >> $UBOOT_SOURCE if test $dom0_ramdisk_addr != "-" @@ -276,7 +276,7 @@ then fi if [[ ! $DOM0_CMD =~ root= ]] then - if test "$LOAD_CMD" = "tftpb" + if test -z "$DOM0_ROOTFS" then DOM0_CMD="$DOM0_CMD root=/dev/ram0" else @@ -323,6 +323,12 @@ do then DOMU_VCPUS[$i]=1 fi + if test "${DOMU_ROOTFS[$i]}" + then + echo "Cannot handle non-ramdisk rootfses for dom0less VMs." + echo "DomUs with rootfses on disk need to be created from dom0 using xl." + exit 1 + fi i=$(( $i + 1 )) done @@ -352,7 +358,7 @@ dom0_kernel_addr=$memaddr load_file $DOM0_KERNEL dom0_kernel_size=$filesize -if test "$DOM0_RAMDISK" && [[ $LOAD_CMD = "tftpb" ]] +if test "$DOM0_RAMDISK" then check_compressed_file_type $DOM0_RAMDISK "cpio archive" dom0_ramdisk_addr=$memaddr -- cgit v1.2.3