1# Makefile - set up a vkernel environment for testing the vkernel 2# 3 4# require it to be specified 5SRCDIR ?= ${.CURDIR}/../.. 6ROOTSIZE ?= 512M 7PHYSMEM ?= 128m 8NCPUS ?= 2 9 10all: help 11 12.if ${MACHINE_ARCH} == "i386" 13USEKERNEL=VKERNEL 14.else 15USEKERNEL=VKERNEL64 16.endif 17 18scratch: world kernel root install 19 @echo "Run the environment with:" 20 @echo "make VKDIR=${VKDIR} run" 21 22quickw: quickworld quickkernel reinstall reinstallkernel 23 @echo "Run the environment with:" 24 @echo "make VKDIR=${VKDIR} run" 25 26quick: quickkernel reinstallkernel 27 @echo "Run the environment with:" 28 @echo "make VKDIR=${VKDIR} run" 29 30help: 31 @echo "Setup Instructions:" 32 @echo "" 33 @echo " setenv ROOTSIZE size (optional)" 34 @echo " setenv VKDIR target_dir" 35 @echo "" 36 @echo "Meta target components:" 37 @echo "" 38 @echo " help - this help" 39 @echo " clean - clean up" 40 @echo " scratch - build and install everything from scratch" 41 @echo " (this is absolutely everything)" 42 @echo " quick - incremental kernel build & reinstall" 43 @echo " quickw - incremental world & kernel build & reinstall" 44 @echo " run - run vkernel with VKDIR/root.img" 45 @echo " mount - mount VKDIR/root.img at VKDIR/root" 46 @echo " umount - unmount" 47 @echo "" 48 @echo "Individual target components:" 49 @echo "" 50 @echo " world - build the world from scratch" 51 @echo " root - create a new, empty root.img" 52 @echo " install - install a world & kernel" 53 @echo " into root.img" 54 @echo " leaf - additional customizatio" 55 @echo " kernel - build vkernel" 56 @echo " quickworld - incremental rebuild world" 57 @echo " quickkernel - incremental rebuild kernel" 58 @echo " reinstall - reinstall world into root.img" 59 @echo " (just the installworld piece)" 60 @echo " reinstallkernel - reinstall kernel into root.img" 61 @echo "" 62 63# Unmount everything, de-configured VN, and clean up. 64# (check handles umounting/deconfiguring) 65# 66clean: check 67 rm -rf ${VKDIR}/root.img ${VKDIR}/root 68 69# Build the world and kernel 70# 71# 72world: checkq 73 cd ${SRCDIR} && make -j 4 buildworld 74 75kernel: checkq 76 cd ${SRCDIR} && make -j 4 KERNCONF=${USEKERNEL} buildkernel 77 78# Quick build - just rebuild the kernel quickly 79# 80# 81quickworld: checkq 82 cd ${SRCDIR} && make -j 4 quickworld 83 84quickkernel: checkq 85 cd ${SRCDIR} && make KERNCONF=${USEKERNEL} quickkernel 86 87# Build and mount an empty filesystem for the emulated root disk 88# 89# NOTE: root must umount when done because a later dependency may 90# have a dependency on mount. 91# 92root: check 93 vnconfig -c -T -S ${ROOTSIZE} -s labels \ 94 `cat ${VKDIR}/vn.which` ${VKDIR}/root.img 95 dd if=/dev/zero of=/dev/`cat ${VKDIR}/vn.which` bs=32k count=4 96 fdisk -IB `cat ${VKDIR}/vn.which` 97 disklabel -r -w `cat ${VKDIR}/vn.which`s1 auto 98 disklabel `cat ${VKDIR}/vn.which`s1 > ${VKDIR}/label.tmp 99 echo 'a: * 0 4.2BSD' >> ${VKDIR}/label.tmp 100 disklabel -R `cat ${VKDIR}/vn.which`s1 ${VKDIR}/label.tmp 101 disklabel -B `cat ${VKDIR}/vn.which`s1 102 newfs /dev/`cat ${VKDIR}/vn.which`s1a 103 mkdir -p ${VKDIR}/root 104 vnconfig -u `cat ${VKDIR}/vn.which` > /dev/null 2>&1 105 106mount: check 107 vnconfig -c -s labels `cat ${VKDIR}/vn.which` ${VKDIR}/root.img 108 fsck -p /dev/`cat ${VKDIR}/vn.which`s1a 109 mount /dev/`cat ${VKDIR}/vn.which`s1a ${VKDIR}/root 110 @echo "Mounted ${VKDIR}/root" 111 112umount: check 113 114# Install a fresh world & distribution, and kernel 115# 116install: mount 117 cd ${SRCDIR} && \ 118 make -j 4 DESTDIR=${VKDIR}/root installworld 119 cd ${SRCDIR}/etc && \ 120 make -j 4 DESTDIR=${VKDIR}/root distribution 121 echo '/dev/vkd0s1a / ufs rw 1 1' > ${VKDIR}/root/etc/fstab 122 echo 'proc /proc procfs rw 0 0' >> ${VKDIR}/root/etc/fstab 123 echo 'vfs.root.mountfrom="ufs:vkd0s1a"' > ${VKDIR}/root/boot/loader.conf 124 #(egrep -v '^console' ${VKDIR}/root/etc/ttys; echo 'console "/usr/libexec/getty Pc" cons25 on secure') > ${VKDIR}/root/etc/ttys.new 125 #mv -f ${VKDIR}/root/etc/ttys.new ${VKDIR}/root/etc/ttys 126 cd ${SRCDIR} && \ 127 make -j 4 \ 128 DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \ 129 NO_MODULES= \ 130 installkernel 131 cp ${VKDIR}/root/boot/kernel/kernel ${VKDIR}/vkernel 132 133leaf: mount 134 echo 'ifconfig_vke0="up"' > ${VKDIR}/root/etc/rc.conf 135 echo 'defaultrouter="10.26.0.1" >> ${VKDIR}/root/etc/rc.conf 136 137# Quick reinstall - just install a new kernel on top of an existing image 138# 139# 140reinstall: mount 141 cd ${SRCDIR} && make -j 4 DESTDIR=${VKDIR}/root installworld 142 143reinstallkernel: mount 144 cd ${SRCDIR} && \ 145 make -j 4 DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \ 146 NO_MODULES= installkernel 147 cp ${VKDIR}/root/boot/kernel/kernel ${VKDIR}/vkernel 148 149sysloader: mount 150 cp /boot/loader ${VKDIR}/root/boot/loader 151 sync 152 153# Run the vkernel on our image. Make sure we are unmounted so 154# we do not compete against the emulated kernel when writing to root.img. 155# (check does this for us) 156# 157run: check 158 cd ${VKDIR} && ./vkernel -m ${PHYSMEM} -n ${NCPUS} \ 159 -r root.img -U -v \ 160 -I /var/run/vknet 161 162# When running w/ a NFS root 163# 164NFS_IP?= 10.0.0.53 165NFS_NETMASK?= 255.255.255.0 166NFS_ROOT_IP?= 10.0.0.1 167NFS_ROOT_PATH?= /netboot2 168 169run_nfsroot: check 170 cd ${VKDIR} && ./vkernel -m ${PHYSMEM} -n ${NCPUS} -U -v \ 171 -I /var/run/vknet \ 172 -e 'boot.netif.ip=${NFS_IP}:boot.netif.netmask=${NFS_NETMASK}:boot.netif.name=vke0:boot.nfsroot.server=${NFS_ROOT_IP}:boot.nfsroot.path=${NFS_ROOT_PATH}' 173 174# Make sure we are not mounted and the VN device is unconfigured, 175# 176# Find an unused VN device but do not do anything with it yet. 177# 178checkq: 179.if !defined(VKDIR) 180 @(echo "must specify VKDIR=target or as an environment variable"; exit 1) 181.endif 182.if exists(${VKDIR}) 183 @echo "${VKDIR} found" 184.else 185 mkdir -p ${VKDIR} 186.endif 187 188check: checkq 189.if exists(${VKDIR}/vn.which) 190 -umount ${VKDIR}/root > /dev/null 2>&1 191 -vnconfig -u `cat ${VKDIR}/vn.which` > /dev/null 2>&1 192 rm -f ${VKDIR}/vn.which 193.endif 194 (vnconfig -l | fgrep "not in use" > /dev/null) || \ 195 (echo "Cannot find unused VN"; exit 1) 196 vnconfig -l | fgrep "not in use" | \ 197 cut -f 1 -d : | head -1 > ${VKDIR}/vn.which 198 egrep '^vn' ${VKDIR}/vn.which > /dev/null || \ 199 (echo "VN device selection is bad"; exit 1) 200