From b7bde6942c2db1c213c09fd0bcf85d44c27afe0d Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Mon, 21 Oct 2019 15:32:21 -0700 Subject: Rename docker-extras to scripts Signed-off-by: Stefano Stabellini --- scripts/disk_image | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100755 scripts/disk_image (limited to 'scripts/disk_image') 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 -- cgit v1.2.3