xref: /minix/releasetools/arm_sdimage.sh (revision 7e2c8b51)
15acaa081SBen Gras#!/bin/bash
25acaa081SBen Grasset -e
38a3677deSKees Jongenburger#set -x
4149ed6cfSKees Jongenburger
55acaa081SBen Gras: ${ARCH=evbearm-el}
6149ed6cfSKees Jongenburger: ${OBJ=../obj.${ARCH}}
75acaa081SBen Gras: ${CROSS_TOOLS=${OBJ}/"tooldir.`uname -s`-`uname -r`-`uname -m`"/bin}
85acaa081SBen Gras: ${CROSS_PREFIX=${CROSS_TOOLS}/arm-elf32-minix-}
95180c3cfSLionel Sambuc: ${JOBS=-j4}
105acaa081SBen Gras: ${DESTDIR=${OBJ}/destdir.$ARCH}
115180c3cfSLionel Sambuc: ${FSTAB=${DESTDIR}/etc/fstab}
128a3677deSKees Jongenburger#
138a3677deSKees Jongenburger# Directory where to store temporary file system images
148a3677deSKees Jongenburger#
158a3677deSKees Jongenburger: ${IMG_DIR=${OBJ}/img}
165acaa081SBen Gras: ${IMG=minix_arm_sd.img}
178a3677deSKees Jongenburger: ${MLO=MLO}
188a3677deSKees Jongenburger: ${UBOOT=u-boot.img}
195acaa081SBen Gras
205acaa081SBen GrasBUILDSH=build.sh
215acaa081SBen Gras
225180c3cfSLionel Sambucif [ ! -f ${BUILDSH} ]
235180c3cfSLionel Sambucthen	echo "Please invoke me from the root source dir, where ${BUILDSH} is."
245acaa081SBen Gras	exit 1
255acaa081SBen Grasfi
265acaa081SBen Gras
274ab5b32eSKees Jongenburgerexport PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
284ab5b32eSKees Jongenburger
298a3677deSKees Jongenburgerfor needed in sfdisk mcopy dd wget mkfs.vfat
308a3677deSKees Jongenburgerdo
318a3677deSKees Jongenburger	if ! which $needed 2>&1 > /dev/null
328a3677deSKees Jongenburger	then
338a3677deSKees Jongenburger		echo "**Skipping image creation: missing tool '$needed'"
348a3677deSKees Jongenburger		exit 1
358a3677deSKees Jongenburger	fi
368a3677deSKees Jongenburgerdone
378a3677deSKees Jongenburger
388a3677deSKees Jongenburger#
398a3677deSKees Jongenburger# Artifacts from this script are stored in the IMG_DIR
408a3677deSKees Jongenburger#
418a3677deSKees Jongenburgermkdir -p $IMG_DIR
428a3677deSKees Jongenburger
438a3677deSKees Jongenburger#
448a3677deSKees Jongenburger# Download the stage 1 bootloader  and u-boot
458a3677deSKees Jongenburger#
468a3677deSKees Jongenburgerfor i in ${MLO} ${UBOOT}
478a3677deSKees Jongenburgerdo
488a3677deSKees Jongenburger	if [ ! -f ${IMG_DIR}/${i} ]
498a3677deSKees Jongenburger	then
508a3677deSKees Jongenburger		if ! wget -O ${IMG_DIR}/$i http://www.minix3.org/arm/beagleboard-xm/$i
518a3677deSKees Jongenburger		then
528a3677deSKees Jongenburger			echo "Failed to download $i"
538a3677deSKees Jongenburger			rm -f ${IMG_DIR}/$i
548a3677deSKees Jongenburger			exit 1
555acaa081SBen Gras		fi
565acaa081SBen Gras
575acaa081SBen Gras	fi
588a3677deSKees Jongenburgerdone
595acaa081SBen Gras
608a3677deSKees Jongenburger#
618a3677deSKees Jongenburger# Call build.sh using a sloppy file list so we don't need to remove the installed /etc/fstag
628a3677deSKees Jongenburger#
638a3677deSKees Jongenburgersh build.sh -V SLOPPY_FLIST=yes ${JOBS} -m ${ARCH} -O ${OBJ} -D ${DESTDIR} -U -u distribution
645acaa081SBen Gras
658a3677deSKees Jongenburger#
668a3677deSKees Jongenburger# This script creates a bootable image and should at some point in the future
678a3677deSKees Jongenburger# be replaced by makefs.
688a3677deSKees Jongenburger#
698a3677deSKees Jongenburger# All sized are written in 512 byte blocks
708a3677deSKees Jongenburger#
718a3677deSKees Jongenburger# we create a disk image of about 2 gig's
728a3677deSKees Jongenburger#
738a3677deSKees Jongenburger# The size of the extended partition where we store
748a3677deSKees Jongenburger# /root /home and /usr in separate sub partitions is
758a3677deSKees Jongenburger# about 1 gig
768a3677deSKees Jongenburger#
778a3677deSKees JongenburgerIMG_SIZE=$((2**31 / 512))
788a3677deSKees JongenburgerFAT_SIZE=$((20480))
798a3677deSKees JongenburgerEXTENDED_SIZE=$((2**30 / 512))
808a3677deSKees JongenburgerROOT_SIZE=$((2**26 / 512))
818a3677deSKees JongenburgerHOME_SIZE=$((2**27 / 512))
828a3677deSKees JongenburgerUSR_SIZE=$((2**28 / 512))
835acaa081SBen Gras
848a3677deSKees Jongenburger#
858a3677deSKees Jongenburger# create a fstab entry in /etc this is normally done during the
868a3677deSKees Jongenburger# setup phase on x86
878a3677deSKees Jongenburger#
885180c3cfSLionel Sambuccat >${FSTAB} <<END_FSTAB
895acaa081SBen Gras/dev/c0d0p1s0   /       mfs     rw                      0       1
905acaa081SBen Gras/dev/c0d0p1s1   /home   mfs     rw                      0       2
918a3677deSKees Jongenburger/dev/c0d0p1s2   /usr    mfs     rw                      0       2
925acaa081SBen GrasEND_FSTAB
935acaa081SBen Gras
945180c3cfSLionel Sambucrm -f ${DESTDIR}/SETS.*
955acaa081SBen Gras
965180c3cfSLionel Sambuc${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${DESTDIR} ${DESTDIR}/etc/master.passwd
975acaa081SBen Gras
988a3677deSKees Jongenburger
9999c52474SKees Jongenburger#
1008a3677deSKees Jongenburger# Now given the sizes above use DD to create separate files representing
1018a3677deSKees Jongenburger# the partitions we are going to use.
10299c52474SKees Jongenburger#
103*7e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/fat.img bs=512 count=1 seek=$(($FAT_SIZE -1)) 2>/dev/null
104*7e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/root.img bs=512 count=1 seek=$(($ROOT_SIZE -1)) 2>/dev/null
105*7e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/home.img bs=512 count=1 seek=$(($HOME_SIZE -1)) 2>/dev/null
106*7e2c8b51SKees Jongenburgerdd if=/dev/zero of=${IMG_DIR}/usr.img bs=512 count=1 seek=$(($USR_SIZE -1)) 2>/dev/null
1075acaa081SBen Gras
1088a3677deSKees Jongenburger#
1098a3677deSKees Jongenburger# Create the empty image where we later will but the partitions in
1108a3677deSKees Jongenburger#
1118a3677deSKees Jongenburgerdd if=/dev/zero of=${IMG} bs=512 count=1 seek=$(($IMG_SIZE -1))
1125acaa081SBen Gras
1135acaa081SBen Gras
1148a3677deSKees Jongenburger#
1158a3677deSKees Jongenburger# Do some math to determine the start addresses of the partitions.
1168a3677deSKees Jongenburger#
1178a3677deSKees JongenburgerFAT_START=2048
1188a3677deSKees JongenburgerEXTENDED_START=$(($FAT_START + $FAT_SIZE))
1198a3677deSKees JongenburgerEXTENDED_SIZE=$(($ROOT_SIZE + $HOME_SIZE + $USR_SIZE + 3))
1208a3677deSKees JongenburgerROOT_START=$(($EXTENDED_START + 1))
1218a3677deSKees JongenburgerHOME_START=$(($ROOT_START + $ROOT_SIZE + 1))
1228a3677deSKees JongenburgerUSR_START=$(($HOME_START + $HOME_SIZE + 1))
1235acaa081SBen Gras
1248a3677deSKees Jongenburger#
1258a3677deSKees Jongenburger# Generate the partitions using sfdisk to partition the
1268a3677deSKees Jongenburger#
127*7e2c8b51SKees Jongenburgersfdisk --no-reread -q ${IMG} 1>/dev/null <<END_SFDISK
1288a3677deSKees Jongenburger# partition table of test.img
1298a3677deSKees Jongenburgerunit: sectors
1305acaa081SBen Gras
1318a3677deSKees Jongenburgertest.img1 : start=     $FAT_START, size=    $FAT_SIZE, Id= c, bootable
1328a3677deSKees Jongenburgertest.img2 : start=    $EXTENDED_START, size=  $EXTENDED_SIZE, Id= 5
1338a3677deSKees Jongenburgertest.img3 : start=        0, size=        0, Id= 0
1348a3677deSKees Jongenburgertest.img4 : start=        0, size=        0, Id= 0
1358a3677deSKees Jongenburgertest.img5 : start=    $ROOT_START, size=   $ROOT_SIZE, Id=81
1368a3677deSKees Jongenburgertest.img6 : start=   $HOME_START, size=   $HOME_SIZE, Id=81
1378a3677deSKees Jongenburgertest.img7 : start=   $USR_START, size=   $USR_SIZE, Id=81
1388a3677deSKees JongenburgerEND_SFDISK
1395acaa081SBen Gras
1408a3677deSKees Jongenburger#
1418a3677deSKees Jongenburger# Format the fat partition and put the bootloaders
1428a3677deSKees Jongenburger# uEnv and the kernel command line in the FAT partition
1438a3677deSKees Jongenburger#
1448a3677deSKees Jongenburgermkfs.vfat ${IMG_DIR}/fat.img
1455180c3cfSLionel Sambuc
1468a3677deSKees Jongenburgerecho "Copying configuration kernel and boot modules"
1478a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img  ${IMG_DIR}/$MLO ::MLO
1488a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${IMG_DIR}/$UBOOT ::u-boot.img
1498a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img releasetools/uEnv.txt ::uEnv.txt
1508a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img releasetools/cmdline.txt ::cmdline.txt
1515180c3cfSLionel Sambuc
1525acaa081SBen Gras
1538a3677deSKees Jongenburger#
1548a3677deSKees Jongenburger# Do some last processing of the kernel and servers before also putting
1558a3677deSKees Jongenburger# them on the FAT
1568a3677deSKees Jongenburger#
1575acaa081SBen Gras${CROSS_PREFIX}objcopy ${OBJ}/kernel/kernel -O binary ${OBJ}/kernel.bin
1588a3677deSKees Jongenburger
1598a3677deSKees Jongenburgermcopy -bsp -i ${IMG_DIR}/fat.img ${OBJ}/kernel.bin ::kernel.bin
1605acaa081SBen Gras
1615acaa081SBen Grasfor f in vm rs pm sched vfs ds mfs pfs init
1625acaa081SBen Grasdo
1635180c3cfSLionel Sambuc    cp ${OBJ}/servers/${f}/${f} ${OBJ}/${f}.elf
1645180c3cfSLionel Sambuc    ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf
1658a3677deSKees Jongenburger    mcopy -bsp -i ${IMG_DIR}/fat.img  ${OBJ}/${f}.elf ::${f}.elf
1665acaa081SBen Grasdone
1675acaa081SBen Gras
1685acaa081SBen Grasfor f in tty memory log
1695acaa081SBen Grasdo
1705180c3cfSLionel Sambuc    cp ${OBJ}/drivers/${f}/${f} ${OBJ}/${f}.elf
1715180c3cfSLionel Sambuc    ${CROSS_PREFIX}strip -s ${OBJ}/${f}.elf
1728a3677deSKees Jongenburger    mcopy -bsp -i ${IMG_DIR}/fat.img  ${OBJ}/${f}.elf ::${f}.elf
1735acaa081SBen Grasdone
1745acaa081SBen Gras
1755acaa081SBen Gras
1768a3677deSKees Jongenburger#
1778a3677deSKees Jongenburger# make the different file system. this part is *also* hacky. We first convert
1788a3677deSKees Jongenburger# the METALOG.sanitised using mtree into a input METALOG containing uids and
1798a3677deSKees Jongenburger# gids.
1808a3677deSKees Jongenburger# Afther that we do some magic processing to add device nodes (also missing from METALOG)
1818a3677deSKees Jongenburger# and convert the METALOG into a proto file that can be used by mkfs.mfs
1828a3677deSKees Jongenburger#
1838a3677deSKees Jongenburgerecho "creating the file systems"
1848a3677deSKees Jongenburger
1858a3677deSKees Jongenburger
1868a3677deSKees Jongenburger#
1878a3677deSKees Jongenburger# read METALOG and use mtree to conver the user and group names into uid and gids
1888a3677deSKees Jongenburger# FIX put "input somwhere clean"
1898a3677deSKees Jongenburger#
1908a3677deSKees Jongenburgercat ${DESTDIR}/METALOG.sanitised | ${CROSS_TOOLS}/nbmtree -N ${DESTDIR}/etc -C > ${IMG_DIR}/input
1918a3677deSKees Jongenburger
1928a3677deSKees Jongenburger# add fstab
1938a3677deSKees Jongenburgerecho "./etc/fstab type=file uid=0 gid=0 mode=0755 size=747 time=1365060731.000000000" >> ${IMG_DIR}/input
1948a3677deSKees Jongenburger
1958a3677deSKees Jongenburger
1968a3677deSKees Jongenburger# fill root.img (skipping /usr entries while keeping the /usr directory)
1978a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep -v "^./usr/" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR} -o ${IMG_DIR}/root.in
1988a3677deSKees Jongenburger#
1998a3677deSKees Jongenburger# add device nodes somewhere in the middle of the proto file. Better would be to add the entries in the
2008a3677deSKees Jongenburger# original METALOG
2018a3677deSKees Jongenburger# grab the first part
2028a3677deSKees Jongenburgergrep -B 10000 "^ dev"  ${IMG_DIR}/root.in >  ${IMG_DIR}/root.proto
2038a3677deSKees Jongenburger# add the device nodes from the ramdisk
2048a3677deSKees Jongenburgercat  ${OBJ}/drivers/ramdisk/proto.dev >> ${IMG_DIR}/root.proto
2058a3677deSKees Jongenburger# and add the rest of the file
2068a3677deSKees Jongenburgergrep -A 10000 "^ dev"  ${IMG_DIR}/root.in | tail -n +2    >>  ${IMG_DIR}/root.proto
2078a3677deSKees Jongenburgerrm ${IMG_DIR}/root.in
2088a3677deSKees Jongenburger
2098a3677deSKees Jongenburger#
2108a3677deSKees Jongenburger# Create proto files for /usr and /home using toproto.
2118a3677deSKees Jongenburger#
2128a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep  "^\./usr/\|^. "  | sed "s,\./usr,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/usr -o ${IMG_DIR}/usr.proto
2138a3677deSKees Jongenburgercat ${IMG_DIR}/input  | grep  "^\./home/\|^. "  | sed "s,\./home,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${DESTDIR}/home -o ${IMG_DIR}/home.proto
2148a3677deSKees Jongenburger
2158a3677deSKees Jongenburger# fill /root /usr and /home the numbers here need to be tweaked to match full partitions
2168a3677deSKees Jongenburger# This part needs fixing: no more magic numbers. It should be possible to call mkfs.mfs -b $((SIZE / 8))
2178a3677deSKees Jongenburger#
2188a3677deSKees Jongenburger#${CROSS_TOOLS}/nbmkfs.mfs  -b $((102400 / 8)) -x 20 ${IMG_DIR}/root.img ${IMG_DIR}/root.proto
2198a3677deSKees Jongenburger${CROSS_TOOLS}/nbmkfs.mfs -x 30 ${IMG_DIR}/root.img ${IMG_DIR}/root.proto
2208a3677deSKees Jongenburger${CROSS_TOOLS}/nbmkfs.mfs -x 30  ${IMG_DIR}/usr.img ${IMG_DIR}/usr.proto
2218a3677deSKees Jongenburger${CROSS_TOOLS}/nbmkfs.mfs -x 30  ${IMG_DIR}/home.img ${IMG_DIR}/home.proto
2228a3677deSKees Jongenburger
2238a3677deSKees Jongenburger#
2248a3677deSKees Jongenburger# Merge the partitions into a single image.
2258a3677deSKees Jongenburger#
2268a3677deSKees Jongenburgerecho "Merging file systems"
2278a3677deSKees Jongenburgerdd if=${IMG_DIR}/fat.img of=${IMG} seek=$FAT_START conv=notrunc
2288a3677deSKees Jongenburgerdd if=${IMG_DIR}/root.img of=${IMG} seek=$ROOT_START conv=notrunc
2298a3677deSKees Jongenburgerdd if=${IMG_DIR}/home.img of=${IMG} seek=$HOME_START conv=notrunc
2308a3677deSKees Jongenburgerdd if=${IMG_DIR}/usr.img of=${IMG} seek=$USR_START conv=notrunc
231