xref: /minix/releasetools/x86_hdimage.sh (revision fb9c64b2)
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