aboutsummaryrefslogtreecommitdiff
path: root/scripts/disk_image
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/disk_image')
-rwxr-xr-xscripts/disk_image134
1 files changed, 134 insertions, 0 deletions
diff --git a/scripts/disk_image b/scripts/disk_image
new file mode 100755
index 0000000..57b933f
--- /dev/null
+++ b/scripts/disk_image
@@ -0,0 +1,134 @@
+#!/bin/bash
+
+# This helps to see what is going on
+set -e -x
+
+# Used to maintain intermediary state. (Not currently used)
+DESTDIR="$(mktemp -d /tmp/imagebuilder-zynqmp.XXXXXX)"
+UBOOT_OUT="/tmp/output"
+OUTDIR="/tmp/img"
+mkdir ${OUTDIR}
+
+IMG="${OUTDIR}/zynqmp.img"
+
+. config
+
+offset=$((2*1024*1024))
+_part1_size=`stat --printf="%s" $UBOOT_OUT/$XEN`
+_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DOM0_KERNEL` ))
+_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DEVICE_TREE` ))
+i=0
+while test $i -lt $NUM_DOMUS
+do
+ _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_KERNEL[$i]}` ))
+ if test "${DOMU_RAMDISK[$i]}"
+ then
+ _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_RAMDISK[$i]}` ))
+ fi
+ if test "${DOMU_PASSTHROUGH_DTB[$i]}"
+ then
+ _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_PASSTHROUGH_DTB[$i]}` ))
+ fi
+ i=$(( $i + 1 ))
+done
+
+# add 16 MB slack
+_part1_size=$(( $_part1_size + 16777216 ))
+_part1_size=$(( $_part1_size + $offset - 1))
+_part1_size=$(( $_part1_size & ~($offset - 1) ))
+_part1_size=$(( $_part1_size / 1024 / 1024 ))
+echo PART1 size: "$_part1_size"MB
+
+if test "$DOM0_RAMDISK"
+then
+ _part2_size=`stat --printf="%s" $UBOOT_OUT/$DOM0_RAMDISK`
+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 ))
+
+# NOTE: Increase vos_a to 256 to accomodate rootfs
+# 528 MiB (256 + 256 + 16)
+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
+
+# find the first available loop device
+_loop_dev=$(losetup -f)
+
+# attach loopback device to $IMG
+losetup $_loop_dev $IMG
+
+_disksize=$(blockdev --getsize $_loop_dev)
+
+dmsetup create diskimage --table "0 $_disksize linear $_loop_dev 0"
+
+# ensure that /dev/mapper/diskimage exists
+while [ ! -b /dev/mapper/diskimage ]
+do
+ sleep 2
+done
+
+kpartx -a /dev/mapper/diskimage
+
+# ensure that /dev/mapper/{diskimage1,diskimage2} exists
+while [ ! -b /dev/mapper/diskimage1 ] || [ ! -b /dev/mapper/diskimage2 ]
+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}/dom0-ramdisk.cpio | gunzip | cpio -id
+mv ${UBOOT_OUT}/dom0-ramdisk.cpio* /tmp
+
+# umount
+sync
+cd /
+umount $DESTDIR/part/disk2
+
+# create mount point and mount disk1
+mkdir -p ${DESTDIR}/part/disk1
+mount -t ext4 /dev/mapper/diskimage1 $DESTDIR/part/disk1
+
+# copy over files needed
+cp -r $UBOOT_OUT/* ${DESTDIR}/part/disk1/
+
+# unmount
+sync
+# This fails for some reason. It could work now because we are not using qemu-user
+# fstrim $DESTDIR/part/disk1
+umount $DESTDIR/part/disk1
+
+kpartx -d /dev/mapper/diskimage
+dmsetup remove diskimage
+losetup -d $_loop_dev