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