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