1# Makefile - set up a vkernel environment for testing the vkernel 2# 3 4# require it to be specified 5SRCDIR ?= ${.CURDIR}/../.. 6PHYSMEM ?= 256m 7NCPUS ?= 2 8FSTYPE ?= 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 " setenv FSTYPE fstype (optional. values:hammer, 4.2BSD)" 36 @echo "" 37 @echo "Meta target components:" 38 @echo "" 39 @echo " help - this help" 40 @echo " clean - clean up" 41 @echo " scratch - build and install everything from scratch" 42 @echo " (this is absolutely everything)" 43 @echo " quick - incremental kernel build & reinstall" 44 @echo " quickw - incremental world & kernel build & reinstall" 45 @echo " run - run vkernel with VKDIR/root.img" 46 @echo " mount - mount VKDIR/root.img at VKDIR/root" 47 @echo " umount - unmount" 48 @echo "" 49 @echo "Individual target components:" 50 @echo "" 51 @echo " world - build the world from scratch" 52 @echo " root - create a new, empty root.img" 53 @echo " install - install a world & kernel" 54 @echo " into root.img" 55 @echo " leaf - additional customization" 56 @echo " kernel - build vkernel" 57 @echo " quickworld - incremental rebuild world" 58 @echo " quickkernel - incremental rebuild kernel" 59 @echo " reinstall - reinstall world into root.img" 60 @echo " (just the installworld piece)" 61 @echo " reinstallkernel - reinstall kernel into root.img" 62 @echo "" 63 64# Unmount everything, de-configured VN, and clean up. 65# (check handles umounting/deconfiguring) 66# 67clean: check 68 rm -rf ${VKDIR}/root.img ${VKDIR}/root 69 70# Build the world and kernel 71# 72# 73world: checkq 74 cd ${SRCDIR} && make -j 4 buildworld 75 76kernel: checkq 77 cd ${SRCDIR} && make -j 4 KERNCONF=${USEKERNEL} buildkernel 78 79nativekernel: checkq 80 cd ${SRCDIR} && make -j 4 KERNCONF=${USEKERNEL} nativekernel 81 82# Quick build - just rebuild the kernel quickly 83# 84# 85quickworld: checkq 86 cd ${SRCDIR} && make -j 4 quickworld 87 88quickkernel: checkq 89 cd ${SRCDIR} && make -j 4 KERNCONF=${USEKERNEL} quickkernel 90 91# Build and mount an empty filesystem for the emulated root disk 92# 93# NOTE: root must umount when done because a later dependency may 94# have a dependency on mount. 95# 96root: check 97 vnconfig -c -T -S ${ROOTSIZE} -s labels \ 98 `cat ${VKDIR}/vn.which` ${VKDIR}/root.img 99 dd if=/dev/zero of=/dev/`cat ${VKDIR}/vn.which` bs=32k count=4 100 fdisk -IB `cat ${VKDIR}/vn.which` 101 disklabel -r -w `cat ${VKDIR}/vn.which`s1 auto 102 disklabel `cat ${VKDIR}/vn.which`s1 > ${VKDIR}/label.tmp 103 echo 'a: * 0 ${FSTYPE}' >> ${VKDIR}/label.tmp 104 disklabel -R `cat ${VKDIR}/vn.which`s1 ${VKDIR}/label.tmp 105 disklabel -B `cat ${VKDIR}/vn.which`s1 106 ${NEWFS_CMD} ${NEWFS_ARGS} /dev/`cat ${VKDIR}/vn.which`s1a 107 mkdir -p ${VKDIR}/root 108 vnconfig -u `cat ${VKDIR}/vn.which` > /dev/null 2>&1 109 110mount: check 111 vnconfig -c -s labels `cat ${VKDIR}/vn.which` ${VKDIR}/root.img 112. if ${FSTYPE} == "4.2BSD" 113 fsck -p /dev/`cat ${VKDIR}/vn.which`s1a 114. endif 115 ${MOUNT_CMD} /dev/`cat ${VKDIR}/vn.which`s1a ${VKDIR}/root 116 @echo "Mounted ${VKDIR}/root" 117 118umount: check 119 120# Install a fresh world & distribution, and kernel 121# 122install: mount 123 cd ${SRCDIR} && \ 124 make -j 4 DESTDIR=${VKDIR}/root installworld 125 cd ${SRCDIR}/etc && \ 126 make -j 4 DESTDIR=${VKDIR}/root distribution 127 echo '/dev/vkd0s1a / ufs rw 1 1' > ${VKDIR}/root/etc/fstab 128 echo 'proc /proc procfs rw 0 0' >> ${VKDIR}/root/etc/fstab 129 echo 'vfs.root.mountfrom="ufs:vkd0s1a"' > ${VKDIR}/root/boot/loader.conf 130 #(egrep -v '^console' ${VKDIR}/root/etc/ttys; echo 'console "/usr/libexec/getty Pc" cons25 on secure') > ${VKDIR}/root/etc/ttys.new 131 #mv -f ${VKDIR}/root/etc/ttys.new ${VKDIR}/root/etc/ttys 132 cd ${SRCDIR} && \ 133 make -j 4 \ 134 DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \ 135 installkernel 136 cp ${VKDIR}/root/boot/kernel/kernel ${VKDIR}/vkernel 137 138leaf: mount 139 echo 'ifconfig_vke0="up"' > ${VKDIR}/root/etc/rc.conf 140 echo 'defaultrouter="10.26.0.1"' >> ${VKDIR}/root/etc/rc.conf 141 echo 'search dragonflybsd.org backplane.com' > ${VKDIR}/root/etc/resolv.conf 142 echo 'nameserver 10.0.0.25' >> ${VKDIR}/root/etc/resolv.conf 143 echo 'nameserver 10.0.0.2' >> ${VKDIR}/root/etc/resolv.conf 144 echo 'nameserver 8.8.8.8' >> ${VKDIR}/root/etc/resolv.conf 145 make umount 146 chmod 644 /build/vkernel/root.img 147 148# Quick reinstall - just install a new kernel on top of an existing image 149# 150# 151reinstall: mount 152 cd ${SRCDIR} && make -j 4 DESTDIR=${VKDIR}/root installworld 153 154reinstallkernel: mount 155 cd ${SRCDIR} && \ 156 make -j 4 DESTDIR=${VKDIR}/root KERNCONF=${USEKERNEL} \ 157 installkernel 158 cp ${VKDIR}/root/boot/kernel/kernel ${VKDIR}/vkernel 159 160sysloader: mount 161 cp /boot/loader ${VKDIR}/root/boot/loader 162 sync 163 164# Run the vkernel on our image. Make sure we are unmounted so 165# we do not compete against the emulated kernel when writing to root.img. 166# (check does this for us) 167# 168run: check 169 mkdir -p /var/vkernel 170 sysctl vm.vkernel_enable=1 171 cd ${VKDIR} && ./vkernel -m ${PHYSMEM} -n ${NCPUS} \ 172 -r root.img -U -v \ 173 -I /var/run/vknet 174 175# When running w/ a NFS root 176# 177NFS_IP?= 10.0.0.53 178NFS_NETMASK?= 255.255.255.0 179NFS_ROOT_IP?= 10.0.0.1 180NFS_ROOT_PATH?= /netboot2 181 182run_nfsroot: check 183 cd ${VKDIR} && ./vkernel -m ${PHYSMEM} -n ${NCPUS} -U -v \ 184 -I /var/run/vknet \ 185 -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}' 186 187# Make sure we are not mounted and the VN device is unconfigured, 188# 189# Find an unused VN device but do not do anything with it yet. 190# 191checkq: 192.if !defined(VKDIR) 193 @(echo "must specify VKDIR=target or as an environment variable"; /usr/bin/false) 194.endif 195 196.if exists(${VKDIR}) 197 @echo "${VKDIR} found" 198.else 199 mkdir -p ${VKDIR} 200.endif 201 202.if ${FSTYPE} == "hammer" 203NEWFS_CMD = newfs_${FSTYPE} 204NEWFS_ARGS = -L VKROOT -f 205MOUNT_CMD = mount_${FSTYPE} 206ROOTSIZE ?= 5G 207.else 208FSTYPE = 4.2BSD 209NEWFS_CMD = newfs 210NEWFS_ARGS = 211MOUNT_CMD = mount 212ROOTSIZE ?= 2G 213.endif 214 215 216check: checkq 217.if exists(${VKDIR}/vn.which) 218 -umount ${VKDIR}/root > /dev/null 2>&1 219 -vnconfig -u `cat ${VKDIR}/vn.which` > /dev/null 2>&1 220 rm -f ${VKDIR}/vn.which 221.endif 222 (vnconfig -l | fgrep "not in use" > /dev/null) || \ 223 (echo "Cannot find unused VN"; /usr/bin/false) 224 vnconfig -l | fgrep "not in use" | \ 225 cut -f 1 -d : | head -1 > ${VKDIR}/vn.which 226 egrep '^vn' ${VKDIR}/vn.which > /dev/null || \ 227 (echo "VN device selection is bad"; /usr/bin/false) 228