1#!/usr/bin/env bash 2set -e 3 4# 5# This script creates a bootable image and should at some point in the future 6# be replaced by the proper NetBSD infrastructure. 7# 8 9: ${ARCH=i386} 10: ${OBJ=../obj.${ARCH}} 11: ${TOOLCHAIN_TRIPLET=i586-elf32-minix-} 12: ${BUILDSH=build.sh} 13 14: ${SETS="minix-base minix-comp minix-games minix-man minix-tests tests"} 15: ${IMG=minix_x86.img} 16 17if [ ! -f ${BUILDSH} ] 18then 19 echo "Please invoke me from the root source dir, where ${BUILDSH} is." 20 exit 1 21fi 22 23# we create a disk image of about 2 gig's 24# for alignment reasons, prefer sizes which are multiples of 4096 bytes 25: ${BOOTXX_SECS=32} 26: ${ROOT_SIZE=$(( 128*(2**20) - ${BOOTXX_SECS} * 512 ))} 27: ${HOME_SIZE=$(( 128*(2**20) ))} 28: ${USR_SIZE=$(( 1792*(2**20) ))} 29: ${EFI_SIZE=$(( 0 ))} 30 31# set up disk creation environment 32. releasetools/image.defaults 33. releasetools/image.functions 34 35echo "Building work directory..." 36build_workdir "$SETS" 37 38echo "Adding extra files..." 39workdir_add_hdd_files 40 41# add kernels 42add_link_spec "boot/minix_latest" "minix_default" extra.kernel 43workdir_add_kernel minix_default 44workdir_add_kernel minix/$RELEASE_VERSION 45 46# add boot.cfg 47cat >${ROOT_DIR}/boot.cfg <<END_BOOT_CFG 48menu=Start MINIX 3:load_mods /boot/minix_default/mod*; multiboot /boot/minix_default/kernel rootdevname=c0d0p0 49menu=Start latest MINIX 3:load_mods /boot/minix_latest/mod*; multiboot /boot/minix_latest/kernel rootdevname=c0d0p0 50menu=Start latest MINIX 3 in single user mode:load_mods /boot/minix_latest/mod*; multiboot /boot/minix_latest/kernel rootdevname=c0d0p0 bootopts=-s 51menu=Start MINIX 3 ALIX:load_mods /boot/minix_default/mod*;multiboot /boot/minix_default/kernel rootdevname=c0d0p0 console=tty00 consdev=com0 ata_no_dma=1 52menu=Edit menu option:edit 53menu=Drop to boot prompt:prompt 54clear=1 55timeout=5 56default=2 57menu=Start MINIX 3 ($RELEASE_VERSION):load_mods /boot/minix/$RELEASE_VERSION/mod*; multiboot /boot/minix/$RELEASE_VERSION/kernel rootdevname=c0d0p0 58END_BOOT_CFG 59add_file_spec "boot.cfg" extra.boot 60 61echo "Bundling packages..." 62bundle_packages "$BUNDLE_PACKAGES" 63 64echo "Creating specification files..." 65create_input_spec 66create_protos "usr home" 67 68# Clean image 69if [ -f ${IMG} ] # IMG might be a block device 70then 71 rm -f ${IMG} 72fi 73 74# 75# Generate /root, /usr and /home partition images. 76# 77echo "Writing disk image..." 78 79# all sizes are written in 512 byte blocks 80ROOTSIZEARG="-b $((${ROOT_SIZE} / 512 / 8))" 81USRSIZEARG="-b $((${USR_SIZE} / 512 / 8))" 82HOMESIZEARG="-b $((${HOME_SIZE} / 512 / 8))" 83 84if [ ${EFI_SIZE} -ge 512 ] 85then 86 fetch_and_build_grub 87 88 : ${EFI_DIR=$OBJ/efi} 89 rm -rf ${EFI_DIR} && mkdir -p ${EFI_DIR}/boot/minix_default ${EFI_DIR}/boot/efi 90 create_grub_cfg 91 cp ${MODDIR}/* ${EFI_DIR}/boot/minix_default/ 92 cp ${RELEASETOOLSDIR}/grub/grub-core/booti386.efi ${EFI_DIR}/boot/efi 93 cp ${RELEASETOOLSDIR}/grub/grub-core/*.mod ${EFI_DIR}/boot/efi 94fi 95 96ROOT_START=${BOOTXX_SECS} 97echo " * ROOT" 98_ROOT_SIZE=$(${CROSS_TOOLS}/nbmkfs.mfs -d ${ROOTSIZEARG} -I $((${ROOT_START}*512)) ${IMG} ${WORK_DIR}/proto.root) 99_ROOT_SIZE=$(($_ROOT_SIZE / 512)) 100USR_START=$((${ROOT_START} + ${_ROOT_SIZE})) 101echo " * USR" 102_USR_SIZE=$(${CROSS_TOOLS}/nbmkfs.mfs -d ${USRSIZEARG} -I $((${USR_START}*512)) ${IMG} ${WORK_DIR}/proto.usr) 103_USR_SIZE=$(($_USR_SIZE / 512)) 104HOME_START=$((${USR_START} + ${_USR_SIZE})) 105echo " * HOME" 106_HOME_SIZE=$(${CROSS_TOOLS}/nbmkfs.mfs -d ${HOMESIZEARG} -I $((${HOME_START}*512)) ${IMG} ${WORK_DIR}/proto.home) 107_HOME_SIZE=$(($_HOME_SIZE / 512)) 108 109# 110# Write the partition table using the natively compiled 111# minix partition utility 112# 113if [ ${EFI_SIZE} -ge 512 ] 114then 115 dd if=/dev/zero bs=${EFI_SIZE} count=1 > ${OBJ}/efi.img 116 EFI_START=$((${HOME_START} + ${_HOME_SIZE})) 117 echo " * EFI" 118 ${CROSS_TOOLS}/nbmakefs -t msdos -s ${EFI_SIZE} -o "F=32,c=1" ${OBJ}/efi.img ${EFI_DIR} 119 dd if=${OBJ}/efi.img >> ${IMG} 120 ${CROSS_TOOLS}/nbpartition -m ${IMG} ${BOOTXX_SECS} 81:${_ROOT_SIZE}* 81:${_USR_SIZE} 81:${_HOME_SIZE} EF:1+ 121else 122 ${CROSS_TOOLS}/nbpartition -m ${IMG} ${BOOTXX_SECS} 81:${_ROOT_SIZE}* 81:${_USR_SIZE} 81:${_HOME_SIZE} 123fi 124 125${CROSS_TOOLS}/nbinstallboot -f -m ${ARCH} ${IMG} ${DESTDIR}/usr/mdec/bootxx_minixfs3 126 127echo "" 128echo "Disk image at `pwd`/${IMG}" 129echo "" 130echo "To boot this image on kvm using the bootloader:" 131echo "qemu-system-i386 --enable-kvm -m 256 -hda `pwd`/${IMG}" 132echo "" 133echo "To boot this image on kvm:" 134echo "cd ${MODDIR} && qemu-system-i386 --enable-kvm -m 256M -kernel kernel -append \"rootdevname=c0d0p0\" -initrd \"${mods}\" -hda `pwd`/${IMG}" 135echo "To boot this image on kvm with EFI (tianocore OVMF):" 136echo "qemu-system-i386 -L . -bios OVMF-i32.fd -m 256M -drive file=minix_x86.img,if=ide,format=raw" 137