]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/boot/rootgen.sh
Upgrade our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to
[FreeBSD/FreeBSD.git] / tools / boot / rootgen.sh
1 #!/bin/sh
2
3 # $FreeBSD$
4
5 #
6 # Builds all the bat-shit crazy combinations we support booting from,
7 # at least for amd64. It assume you have a ~sane kernel in /boot/kernel
8 # and copies that into the ~150MB root images we create (we create the du
9 # size of the kernel + 20MB
10 #
11 # Sad panda sez: this runs as root, but could be userland if someone
12 # creates userland geli and zfs tools.
13 #
14 # This assumes an external prograam install-boot.sh which will install
15 # the appropriate boot files in the appropriate locations.
16 #
17 # These images assume ada0 will be the root image. We should likely
18 # use labels, but we don't.
19 #
20 # ASsumes you've already rebuilt... maybe bad? Also maybe bad: the env
21 # vars should likely be conditionally set to allow better automation.
22 #
23
24 cpsys() {
25     src=$1
26     dst=$2
27
28     # Copy kernel + boot loader
29     (cd $src ; tar cf - .) | (cd $dst; tar xf -)
30 }
31
32 mk_nogeli_gpt_ufs_legacy() {
33     src=$1
34     img=$2
35
36     cat > ${src}/etc/fstab <<EOF
37 /dev/ada0p2     /               ufs     rw      1       1
38 EOF
39     makefs -t ffs -B little -s 200m ${img}.p2 ${src}
40     mkimg -s gpt -b ${src}/boot/pmbr \
41           -p freebsd-boot:=${src}/boot/gptboot \
42           -p freebsd-ufs:=${img}.p2 -o ${img}
43     rm -f ${src}/etc/fstab
44 }
45
46 mk_nogeli_gpt_ufs_uefi() {
47     src=$1
48     img=$2
49
50     cat > ${src}/etc/fstab <<EOF
51 /dev/ada0p2     /               ufs     rw      1       1
52 EOF
53 # XXX need to make msdos part for this to work XXXX
54     cp ${src}/boot/boot.efifat ${img}.p1
55     makefs -t ffs -B little -s 200m ${img}.p2 ${src}
56     mkimg -s gpt -b ${src}/boot/pmbr \
57           -p efi:=${img}.p1 \
58           -p freebsd-ufs:=${img}.p2 -o ${img}
59     rm -f ${src}/etc/fstab
60 }
61
62 mk_nogeli_gpt_ufs_both() {
63     src=$1
64     img=$2
65
66     cat > ${src}/etc/fstab <<EOF
67 /dev/ada0p3     /               ufs     rw      1       1
68 EOF
69     # XXX need to make msdos part for this to work XXXX
70     cp ${src}/boot/boot.efifat ${img}.p1
71     makefs -t ffs -B little -s 200m ${img}.p3 ${src}
72     # p1 is boot for uefi, p2 is boot for gpt, p3 is /
73     mkimg -b ${src}/boot/pmbr -s gpt \
74           -p efi:=${src}/boot/boot1.efifat \
75           -p freebsd-boot:=${src}/boot/gptboot \
76           -p freebsd-ufs:=${img}.p3 \
77           -o ${img}
78     rm -f ${src}/etc/fstab
79 }
80
81 mk_nogeli_gpt_zfs_legacy() {
82     src=$1
83     img=$2
84     mntpt=$3
85     geli=$4
86     scheme=$5
87     fs=$6
88     bios=$7
89     pool=nogeli-gpt-zfs-legacy
90
91     dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
92     md=$(mdconfig -f ${img})
93     gpart create -s gpt ${md}
94     gpart add -t freebsd-boot -s 400k -a 4k     ${md}   # <= ~540k
95     gpart add -t freebsd-zfs -l root $md
96     # install-boot will make this bootable
97     zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
98     zpool set bootfs=${pool} ${pool}
99     zfs create -o mountpoint=/ ${pool}/ROOT
100     # NB: The online guides go nuts customizing /var and other mountpoints here, no need
101     cpsys ${src} ${mntpt}
102     df
103     # need to make a couple of tweaks
104     cat > ${mntpt}/boot/loader.conf <<EOF
105 zfs_load=YES
106 opensolaris_load=YES
107 EOF
108     cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
109     cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
110     ls -las ${mntpt}/boot
111     # end tweaks
112     zfs umount -f ${pool}/ROOT
113     zfs set mountpoint=none ${pool}/ROOT
114     zpool set bootfs=${pool}/ROOT ${pool}
115     zpool set autoexpand=on ${pool}
116     zpool export ${pool}
117     ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
118     mdconfig -d -u ${md}
119 }
120
121 mk_nogeli_gpt_zfs_uefi() {
122 }
123
124 mk_nogeli_gpt_zfs_both() {
125 }
126
127 mk_nogeli_mbr_ufs_legacy() {
128     src=$1
129     img=$2
130
131     cat > ${src}/etc/fstab <<EOF
132 /dev/ada0s1a    /               ufs     rw      1       1
133 EOF
134     makefs -t ffs -B little -s 200m ${img}.s1a ${src}
135     mkimg -s bsd -b ${src}/boot/boot -p freebsd-ufs:=${img}.s1a -o ${img}.s1
136     mkimg -a 1 ${bootmbr} -s mbr -b ${src}/boot/boot0sio -p freebsd:=${img}.s1 -o ${img}
137     rm -f ${src}/etc/fstab
138 }
139
140 mk_nogeli_mbr_ufs_uefi() {
141 }
142
143 mk_nogeli_mbr_ufs_both() {
144 }
145
146 mk_nogeli_mbr_zfs_legacy() {
147 }
148
149 mk_nogeli_mbr_zfs_uefi() {
150 }
151
152 mk_nogeli_mbr_zfs_both() {
153 }
154
155 mk_geli_gpt_ufs_legacy() {
156 }
157
158 mk_geli_gpt_ufs_uefi() {
159 }
160
161 mk_geli_gpt_ufs_both() {
162 }
163
164 mk_geli_gpt_zfs_legacy() {
165 }
166
167 mk_geli_gpt_zfs_uefi() {
168 }
169
170 mk_geli_gpt_zfs_both() {
171 }
172
173 mk_geli_mbr_ufs_legacy() {
174 }
175
176 mk_geli_mbr_ufs_uefi() {
177 }
178
179 mk_geli_mbr_ufs_both() {
180 }
181
182 mk_geli_mbr_zfs_legacy() {
183 }
184
185 mk_geli_mbr_zfs_uefi() {
186 }
187
188 mk_geli_mbr_zfs_both() {
189 }
190
191 # iso
192 # pxeldr
193 # u-boot
194 # powerpc
195
196 qser="-serial telnet::4444,server -nographic"
197
198 # https://wiki.freebsd.org/QemuRecipes
199 # aarch64
200 qemu_aarch64_uefi()
201 {
202     img=$1
203     sh=$2
204
205     echo "qemu-system-aarch64 -m 4096M -cpu cortex-a57 -M virt  \
206         -bios QEMU_EFI.fd ${qser} \
207         -drive if=none,file=${img},id=hd0 \
208         -device virtio-blk-device,drive=hd0" > $sh
209 # https://wiki.freebsd.org/arm64/QEMU also has
210 #       -device virtio-net-device,netdev=net0
211 #       -netdev user,id=net0
212 }
213
214 # Amd64 qemu
215 qemu_amd64_legacy()
216 {
217     img=$1
218     sh=$2
219
220     echo "qemu-system-x86_64 --drive file=${img},format=raw ${qser}" > $sh
221 }
222
223 qemu_amd64_uefi()
224 {
225     img=$1
226     sh=$2
227
228     echo "qemu-system-x86_64 -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
229 }
230
231 qemu_amd64_both()
232 {
233     img=$1
234     sh=$2
235
236     echo "qemu-system-x86_64 --drive file=${img},format=raw ${qser}" > $sh
237     echo "qemu-system-x86_64 -bios ~/bios/OVMF-X64.fd --drive file=${img},format=raw ${qser}" > $sh
238 }
239
240 # arm
241 # nothing listed?
242
243 # i386
244 qemu_i386_legacy()
245 {
246     img=$1
247     sh=$2
248
249     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
250 }
251
252 # Not yet supported
253 qemu_i386_uefi()
254 {
255     img=$1
256     sh=$2
257
258     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
259 }
260
261 # Needs UEFI to be supported
262 qemu_i386_both()
263 {
264     img=$1
265     sh=$2
266
267     echo "qemu-system-i386 --drive file=${img},format=raw ${qser}" > $sh
268     echo "qemu-system-i386 -bios ~/bios/OVMF-X32.fd --drive file=${img},format=raw ${qser}" > $sh
269 }
270
271 # mips
272 # qemu-system-mips -kernel /path/to/rootfs/boot/kernel/kernel -nographic -hda /path/to/disk.img -m 2048
273
274 # Powerpc -- doesn't work but maybe it would enough for testing -- needs details
275 # powerpc64
276 # qemu-system-ppc64 -drive file=/path/to/disk.img,format=raw
277
278 # sparc64
279 # 10.3 works, 12-current (which one?) hangs
280 # qemu-system-sparc64 -drive file=/path/to/disk.img,format=raw
281
282
283 # Misc variables
284 SRCTOP=$(make -v SRCTOP)
285 cd ${SRCTOP}/stand
286 OBJDIR=$(make -v .OBJDIR)
287 IMGDIR=${OBJDIR}/boot-images
288 mkdir -p ${IMGDIR}
289 MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
290
291 # Setup the installed tree...
292 DESTDIR=${OBJDIR}/boot-tree
293 rm -rf ${DESTDIR}
294 mkdir -p ${DESTDIR}/boot/defaults
295 mkdir -p ${DESTDIR}/boot/kernel
296 cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
297 echo -h -D -S115200 > ${DESTDIR}/boot.config
298 # XXX
299 cp /boot/device.hints ${DESTDIR}/boot/device.hints
300 # Assume we're already built
301 make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes
302 # Copy init, /bin/sh, minimal libraries and testing /etc/rc
303 mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin \
304       ${DESTDIR}/lib ${DESTDIR}/libexec \
305       ${DESTDIR}/etc ${DESTDIR}/dev
306 for f in /sbin/halt /sbin/init /bin/sh $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
307     cp $f ${DESTDIR}/$f
308 done
309 cat > ${DESTDIR}/etc/rc <<EOF
310 #!/bin/sh
311
312 echo "RC COMMAND RUNNING -- SUCCESS!!!!!"
313 halt -p
314 EOF
315
316 # OK. Let the games begin
317
318 for arch in amd64; do
319     for geli in nogeli geli; do
320         for scheme in gpt mbr; do
321             for fs in ufs zfs; do
322                 for bios in legacy uefi both; do
323                     # Create sparse file and mount newly created filesystem(s) on it
324                     img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
325                     sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
326                     echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
327                     rm -f ${img}*
328                     eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
329                     eval qemu_${arch}_${bios} ${img} ${sh}
330                     [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
331                     echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
332                 done
333             done
334         done
335     done
336 done
337
338 rmdir ${MNTPT}
339
340 exit 0
341
342 # Notes for the future
343
344 for arch in i386; do
345     for geli in nogeli geli; do
346         for scheme in gpt mbr; do
347             for fs in ufs zfs; do
348                 for bios in legacy; do
349                     # Create sparse file and mount newly created filesystem(s) on it
350                     img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
351                     sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
352                     echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
353                     rm -f ${img}*
354                     eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
355                     eval qemu_${arch}_${bios} ${img} ${sh}
356                     [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
357                     echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
358                 done
359             done
360         done
361     done
362 done
363
364 for arch in arm aarch64; do
365     for scheme in gpt mbr; do
366         fs=ufs
367         for bios in uboot efi; do
368             # Create sparse file and mount newly created filesystem(s) on it
369             img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
370             sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
371             echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
372             rm -f ${img}*
373             eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
374             eval qemu_${arch}_${bios} ${img} ${sh}
375             [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
376             echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
377         done
378     done
379 done
380
381 for arch in powerpc powerpc64; do
382     for scheme in ppc-wtf; do
383         fs=ufs
384         for bios in ofw uboot chrp; do
385             # Create sparse file and mount newly created filesystem(s) on it
386             img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
387             sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
388             echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
389             rm -f ${img}*
390             eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
391             eval qemu_${arch}_${bios} ${img} ${sh}
392             [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
393             echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
394         done
395     done
396 done
397
398 for arch in sparc64; do
399     for scheme in sun; do
400         fs=ufs
401         for bios in ofw; do
402             # Create sparse file and mount newly created filesystem(s) on it
403             img=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.img
404             sh=${IMGDIR}/${arch}-${geli}-${scheme}-${fs}-${bios}.sh
405             echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
406             rm -f ${img}*
407             eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
408             eval qemu_${arch}_${bios} ${img} ${sh}
409             [ -n "${SUDO_USER}" ] && chown ${SUDO_USER} ${img}*
410             echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
411         done
412     done
413 done