diff --git a/target/linux/bcm27xx/image/gen_rpi_sdcard_img.sh b/target/linux/bcm27xx/image/gen_rpi_sdcard_img.sh index 8d33e4f54c..492347a61e 100755 --- a/target/linux/bcm27xx/image/gen_rpi_sdcard_img.sh +++ b/target/linux/bcm27xx/image/gen_rpi_sdcard_img.sh @@ -24,5 +24,34 @@ set $(ptgen -o $OUTPUT -h $head -s $sect -l $align -t $kernel_type -p ${BOOTFSSI BOOTOFFSET="$(($1 / 512))" ROOTFSOFFSET="$(($3 / 512))" +# In most cases, the rootfs image size is smaller than the total space +# available in the rootfs. OpenWrt will use the remaining space for storing +# the fs backing the overlayfs which holds configuration changes etc. +# To avoid that OpenWrt incorrectly detects a filesystem in the case +# there is remaining data from a previous installation, we need to clear +# the first N bytes directly after the rootfs image, to make sure +# that any initial bytes that are or look like fs superblocks are cleared +# out. +ROOTFSSIZE="$(($4 / 512))" +ROOTFSIMGSIZE="$((($(wc -c < $ROOTFS) + 511) / 512))" +ROOTFSPADDINGSIZE="$(($ROOTFSSIZE - $ROOTFSIMGSIZE))" +ROOTFSPADDINGOFFSET="$(($ROOTFSOFFSET + $ROOTFSIMGSIZE))" + +# Reduce padding to max 1MB, which is enough to clear out any superblocks +# of previous file-systems or any data that might look like fs superblocks. +if [ "$ROOTFSPADDINGSIZE" -gt 2048 ]; then + ROOTFSPADDINGSIZE="2048" +fi + +# Write the bootfs. dd bs=512 if="$BOOTFS" of="$OUTPUT" seek="$BOOTOFFSET" conv=notrunc -dd bs=512 if="$ROOTFS" of="$OUTPUT" seek="$ROOTFSOFFSET" conv=notrunc + +# Write the rootfs. +# The `sync` is important, as in case $ROOTFS is not a multiple of bs, it will +# assure that remaining bytes are set to 0x00. +dd bs=512 if="$ROOTFS" of="$OUTPUT" seek="$ROOTFSOFFSET" conv=notrunc,sync + +# Add padding after rootfs. +if [ "$ROOTFSPADDINGSIZE" -gt 0 ]; then + dd bs=512 if=/dev/zero of="$OUTPUT" seek="$ROOTFSPADDINGOFFSET" count="$ROOTFSPADDINGSIZE" conv=notrunc +fi