diff options
-rw-r--r-- | README.md | 18 | ||||
-rwxr-xr-x | scripts/disk_image | 137 | ||||
-rwxr-xr-x | scripts/uboot-script-gen | 12 |
3 files changed, 119 insertions, 48 deletions
@@ -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 |