xref: /freebsd/tools/boot/rootgen.sh (revision 02d2ad99ac81792cc460a484fe2454d1de7cd42f)
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
24cpsys() {
25    src=$1
26    dst=$2
27
28    # Copy kernel + boot loader
29    (cd $src ; tar cf - .) | (cd $dst; tar xf -)
30}
31
32mk_nogeli_gpt_ufs_legacy() {
33    src=$1
34    img=$2
35
36    rm -f ${img} ${img}.p2
37    makefs -t ffs -B little -s 200m ${img}.p2 ${src}
38    mkimg -s gpt -b ${src}/boot/pmbr \
39	  -p freebsd-boot:=${src}/boot/gptboot \
40	  -p freebsd-ufs:=${img}.p2 -o ${img}
41}
42
43mk_nogeli_gpt_ufs_uefi() {
44    src=$1
45    img=$2
46
47    rm -f ${img} ${img}.p2
48    makefs -t ffs -B little -s 200m ${img}.p2 ${src}
49    mkimg -s gpt -b ${src}/boot/pmbr \
50	  -p freebsd-boot:=${src}/boot/gptboot \
51	  -p freebsd-ufs:=${img}.p2 -o ${img}
52}
53
54mk_nogeli_gpt_ufs_both() {
55    src=$1
56    img=$2
57
58    makefs -t ffs -B little -s 200m ${img}.p3 ${src}
59    # p1 is boot for uefi, p2 is boot for gpt, p3 is /
60    mkimg -b ${src}/boot/pmbr -s gpt \
61	  -p efi:=${src}/boot/boot1.efifat \
62	  -p freebsd-boot:=${src}/boot/gptboot \
63	  -p freebsd-ufs:=${img}.p3 \
64	  -o ${img}
65}
66
67mk_nogeli_gpt_zfs_legacy() {
68    src=$1
69    img=$2
70    mntpt=$3
71    geli=$4
72    scheme=$5
73    fs=$6
74    bios=$7
75    pool=nogeli-gpt-zfs-legacy
76
77    rm -f ${img}
78    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
79    md=$(mdconfig -f ${img})
80    gpart create -s gpt ${md}
81    gpart add -t freebsd-boot -s 400k -a 4k	${md}	# <= ~540k
82    gpart add -t freebsd-zfs -l root $md
83    # install-boot will make this bootable
84    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}p2
85    zpool set bootfs=${pool} ${pool}
86    zfs create -o mountpoint=/ ${pool}/ROOT
87    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
88    cpsys ${src} ${mntpt}
89    df
90    # need to make a couple of tweaks
91    cat > ${mntpt}/boot/loader.conf <<EOF
92zfs_load=YES
93opensolaris_load=YES
94EOF
95    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
96    cp /boot/kernel/opensolaris.ko ${mntpt}/boot/kernel/opensolaris.ko
97    ls -las ${mntpt}/boot
98    # end tweaks
99    zfs umount -f ${pool}/ROOT
100    zfs set mountpoint=none ${pool}/ROOT
101    zpool set bootfs=${pool}/ROOT ${pool}
102    zpool set autoexpand=on ${pool}
103    zpool export ${pool}
104    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
105    mdconfig -d -u ${md}
106}
107
108mk_nogeli_gpt_zfs_uefi() {
109}
110
111mk_nogeli_gpt_zfs_both() {
112}
113
114mk_nogeli_mbr_ufs_legacy() {
115}
116
117mk_nogeli_mbr_ufs_uefi() {
118}
119
120mk_nogeli_mbr_ufs_both() {
121}
122
123mk_nogeli_mbr_zfs_legacy() {
124}
125
126mk_nogeli_mbr_zfs_uefi() {
127}
128
129mk_nogeli_mbr_zfs_both() {
130}
131
132mk_geli_gpt_ufs_legacy() {
133}
134
135mk_geli_gpt_ufs_uefi() {
136}
137
138mk_geli_gpt_ufs_both() {
139}
140
141mk_geli_gpt_zfs_legacy() {
142}
143
144mk_geli_gpt_zfs_uefi() {
145}
146
147mk_geli_gpt_zfs_both() {
148}
149
150mk_geli_mbr_ufs_legacy() {
151}
152
153mk_geli_mbr_ufs_uefi() {
154}
155
156mk_geli_mbr_ufs_both() {
157}
158
159mk_geli_mbr_zfs_legacy() {
160}
161
162mk_geli_mbr_zfs_uefi() {
163}
164
165mk_geli_mbr_zfs_both() {
166}
167
168# iso
169# pxeldr
170# u-boot
171
172# Misc variables
173SRCTOP=$(make -v SRCTOP)
174cd ${SRCTOP}/stand
175OBJDIR=$(make -v .OBJDIR)
176IMGDIR=${OBJDIR}/boot-images
177mkdir -p ${IMGDIR}
178MNTPT=$(mktemp -d /tmp/stand-test.XXXXXX)
179
180# Setup the installed tree...
181DESTDIR=${OBJDIR}/boot-tree
182rm -rf ${DESTDIR}
183mkdir -p ${DESTDIR}/boot/defaults
184mkdir -p ${DESTDIR}/boot/kernel
185cp /boot/kernel/kernel ${DESTDIR}/boot/kernel
186echo -h -D -S115200 > ${DESTDIR}/boot.config
187# XXX
188cp /boot/device.hints ${DESTDIR}/boot/device.hints
189# Assume we're already built
190make install DESTDIR=${DESTDIR} MK_MAN=no MK_INSTALL_AS_USER=yes
191# Copy init, /bin/sh and minimal libraries
192mkdir -p ${DESTDIR}/sbin ${DESTDIR}/bin ${DESTDIR}/lib ${DESTDIR}/libexec
193for f in /sbin/init /bin/sh $(ldd /bin/sh | awk 'NF == 4 { print $3; }') /libexec/ld-elf.so.1; do
194    cp $f ${DESTDIR}/$f
195done
196mkdir ${DESTDIR}/dev
197
198# OK. Let the games begin
199
200for geli in nogeli geli; do
201    for scheme in gpt mbr; do
202	for fs in ufs zfs; do
203	    for bios in legacy uefi both; do
204		# Create sparse file and mount newly created filesystem(s) on it
205		img=${IMGDIR}/${geli}-${scheme}-${fs}-${bios}.img
206		echo "vvvvvvvvvvvvvvvvvvvvvv   Creating $img  vvvvvvvvvvvvvvvvvvvvvvv"
207		eval mk_${geli}_${scheme}_${fs}_${bios} ${DESTDIR} ${img} ${MNTPT} ${geli} ${scheme} ${fs} ${bios}
208		echo "^^^^^^^^^^^^^^^^^^^^^^   Creating $img  ^^^^^^^^^^^^^^^^^^^^^^^"
209	    done
210	done
211    done
212done
213
214rmdir ${MNTPT}
215