scripts: add ubinize-image.sh to generate ubi images

This is a wrapper for the ubinize tool which integrates auto-generation
of the ubinize.cfg for common volume layouts with and without a kernel
volume.
It supports auto-detecting the rootfs-type and decides whether or not
to include a rootfs_data volume based on whether the rootfs is ubifs
or not (and thus is read-only and needs rootfs_data ubifs overlay).
The script allows to create layouts as found in all current
ubinize{,-overlay}.cfg files using

ubinize-image.sh --no-kernel root.{ubifs,squashfs} output.ubi $UBI_OPTS

It also includes support for adding ubootenv and ubootenv2 volumes
typically used by U-Boot for storing its environment in UBI using the
"--uboot-env" parameter.
See also
https://gitorious.org/openwrt-oxnas/openwrt-oxnas/source/target/linux/
oxnas/image/Makefile

Signed-off-by: Daniel Golle <daniel@makrotopia.org>

 create mode 100755 scripts/ubinize-image.sh

SVN-Revision: 41121
This commit is contained in:
John Crispin 2014-06-11 12:59:19 +00:00
parent c8d472c37f
commit 28a563dec3

113
scripts/ubinize-image.sh Executable file
View File

@ -0,0 +1,113 @@
#!/bin/sh
ubootenv=""
nokernel=""
ubinize_param=""
kernel=""
rootfs=""
outfile=""
err=""
get_magic_word() {
dd if=$1 bs=2 count=1 2>/dev/null | hexdump -v -n 2 -e '1/1 "%02x"'
}
is_ubifs() {
if [ "$( get_magic_word $1 )" = "3118" ]; then
echo "1"
fi
}
ubivol() {
volid=$1
name=$2
image=$3
autoresize=$4
echo "[$name]"
echo "mode=ubi"
echo "vol_id=$volid"
echo "vol_type=dynamic"
echo "vol_name=$name"
if [ "$image" ]; then
echo "image=$image"
else
echo "vol_size=1MiB"
fi
if [ "$autoresize" ]; then
echo "vol_flags=autoresize"
fi
}
ubilayout() {
local vol_id=0
local root_is_ubifs="$( is_ubifs "$2" )"
if [ "$1" = "ubootenv" ]; then
ubivol $vol_id ubootenv
vol_id=$(( $vol_id + 1 ))
ubivol $vol_id ubootenv2
vol_id=$(( $vol_id + 1 ))
fi
if [ "$3" ]; then
ubivol $vol_id kernel "$3"
vol_id=$(( $vol_id + 1 ))
fi
ubivol $vol_id rootfs "$2" $root_is_ubifs
vol_id=$(( $vol_id + 1 ))
[ "$root_is_ubifs" ] || ubivol $vol_id rootfs_data "" 1
}
while [ "$1" ]; do
if [ "$1" = "--uboot-env" ]; then
ubootenv="ubootenv"
shift
continue
fi
if [ "$1" = "--no-kernel" ]; then
nokernel="nokernel"
shift
continue
fi
if [ ! "$kernel" -a ! "$nokernel" ]; then
[ "${1:0:1}" = "-" ] && break
kernel=$1
shift
continue
fi
if [ ! "$rootfs" ]; then
[ "${1:0:1}" = "-" ] && break
rootfs=$1
shift
continue
fi
if [ ! "$outfile" ]; then
[ "${1:0:1}" = "-" ] && break
outfile=$1
shift
continue
fi
ubinize_param="$@"
break
done
if [ ! -r "$rootfs" -o ! -r "$kernel" -a ! "$nokernel" -o ! "$outfile" ]; then
echo "syntax: $0 [--no-kernel] [--uboot-env] rootfs [kernel] out [ubinize opts]"
exit 1
fi
ubinize="$( which ubinize )"
if [ ! -x "$ubinize" ]; then
echo "ubinize tool not found or not usable"
exit 1
fi
ubinizecfg="$( mktemp )"
ubilayout "$ubootenv" "$rootfs" "$kernel" > "$ubinizecfg"
cat "$ubinizecfg"
ubinize -o "$outfile" $ubinize_param "$ubinizecfg"
err="$?"
[ ! -e "$outfile" ] && err=2
rm "$ubinizecfg"
exit $err