2 # Copyright (c) 2006 Jean Milanez Melo <jmelo@freebsdbrasil.com.br>
4 # Patrick Tracanelli <eksffa@freebsdbrasil.com.br>
8 CURRENTDIR=/usr/src/tools/tools/tinybsd
9 if [ ! -d $CURRENTDIR ]
16 WORKDIR=/usr/obj/tinybsdbuild
18 BASEFILE="tinybsd.basefiles"
19 PORTSFILE="tinybsd.ports"
21 DEFINSTARGS="-o 0 -g 0 -m 555"
80 Usage: $0 sectors=<size of media> [80000]
81 heads=<heads according to firmware> [4]
82 spt=<sectors per track according to firmware> [32]
83 conf=<configuration name> (see conf/name) [default]
84 mfsroot[=<yes|no>] [no]
85 image=<tinybsd image name> [tinybsd.bin]
86 batch[=<anything>] (do not ask interactively)
87 new[=<anything>] (do not read previous values)
90 $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
92 Default values are set in the program.
93 Environment values override defaults.
94 Previous values override environment values but can be disabled.
95 Command arguments override previous values.
96 Interactive values override command arguments but can be disabled.
98 Run diskinfo(8) -v against your CF device to get correct information
99 about your disk. USB keys do not need any specific geometry"
104 # Load variables from stdin (could be a file)
105 # Look for lines that match foo=bar
106 # do not run the file.. that is asking for trouble
125 eval "${PART1}='${PART2}'"
137 # get values from the user
144 if [ "$NO_PROMPTS" != "YES" ]
146 echo -n "$MESSAGE [$ANSWER] " > /dev/tty
148 [ "$result" != "" ] && ANSWER=$result
151 ANSWER=`eval "echo $ANSWER"`
156 # These are only used the VERY first time you run the program (on this machine)
159 NO_PROMPTS=${NO_PROMPTS:-NO}
160 NO_READ=${NO_READ:-NO}
161 SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
162 TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
163 SECTRACK=${SECTRACK:-32}; export SECTRACK
164 CONF=${CONF:-default}; export CONF
165 MFSROOT=${MFSROOT:-NO}; export MFSROOT
166 IMG=${IMG:-tinybsd.bin}; export IMG
171 # get ourselves set up.
172 # Partly by reading config files and partly from asking questions.
175 if [ "${NO_READ}" = "YES" ]
181 HOSTPART=${HOSTNAME%%.*}
182 FILENAME=".tinybsd.${HOSTPART}.${USER}"
183 FULLFILENAME=$HOME/$FILENAME
185 if [ -f ${FULLFILENAME} ]
187 loadvars <${FULLFILENAME}
190 SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
191 TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
192 SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
195 echo "The following configurations exist:"
196 ls -l conf|awk '/^d/{print " ",$9}'|grep -v CVS
197 CONF=`confirm_action "$CONF" "Configuration name?"`
198 if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
200 echo "${TS} Error: Could not find config (${CONF})"
201 if [ "$NO_PROMPTS" = "YES" ]
209 MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
210 IMG=`confirm_action "$IMG" "Image file to generate?"`
212 # example of formatted value (NNN in this case)
213 # #condition and format the number
214 # if [ -z "${BUILDNUM}" ]
216 # echo "Starting with build 001"
219 # BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
227 HOSTPART=${HOSTNAME%%.*}
228 FILENAME=".tinybsd.${HOSTPART}.${USER}"
229 FULLFILENAME=$HOME/$FILENAME
231 echo "# written by tinybsd" `date`
232 echo "SECTUNIT=${SECTUNIT}"
233 echo "TRACKCYL=${TRACKCYL}"
234 echo "SECTRACK=${SECTRACK}"
236 echo "MFSROOT=${MFSROOT:-NO}"
241 check_alt_imgname() {
242 if [ ${IMG} = 'tinybsd.bin' ]
244 echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
249 mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
253 # Before removing check if there is not a mount under $WORKDIR anymore
254 MOUNT_CHECK=`mount|egrep "on ${WORKDIR}"`
256 if [ ! -z "${MOUNT_CHECK}" ]; then
257 echo "There are mounts under the workdir (${WORKDIR}). Please umount them before running this script"
260 chflags -R noschg ${WORKDIR}
261 echo "${TS} Removing "${WORKDIR}
263 echo "${TS} Removing Build Kernel Directory"
264 rm -rf /usr/obj/usr/src/sys/${KERNCONF}
277 echo "${TS} Creating directory hierarchy... "
278 mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
279 mtree -deU -f /etc/mtree/BIND.chroot.dist -p ${WORKDIR}
280 mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
281 mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
282 mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
286 cd ${CURRENTDIR}/conf/${CONF}
288 for file in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE} | grep -v "#" | \
289 cut -f1 -d":" | sort | uniq` ; do
290 echo "${TS} Copying "/${file}" to "${WORKDIR}/${file}
291 cp -fp /${file} ${WORKDIR}/${file} ;
296 for portname in `cat ${CURRENTDIR}/conf/${CONF}/${PORTSFILE} | grep -v '#'` ; do
297 if [ ! -d "${WORKDIR}/usr/ports" ]; then
298 mkdir -p "${WORKDIR}/usr/ports"
301 PNAME=`/usr/bin/basename "${portname}"`
302 PORT_OPTION_FILE="/var/db/ports/${PNAME}/options"
304 if [ -f "${PORT_OPTION_FILE}" ]; then
305 mkdir -p "${WORKDIR}/var/db/ports/${PNAME}"
306 cp "${PORT_OPTION_FILE}" "${WORKDIR}/var/db/ports/${PNAME}/"
309 mount_nullfs /lib "${WORKDIR}/lib"
310 mount_nullfs /usr/bin "${WORKDIR}/usr/bin"
311 mount_nullfs /usr/sbin "${WORKDIR}/usr/sbin"
312 mount_nullfs /usr/ports "${WORKDIR}/usr/ports"
313 mount_nullfs /usr/share "${WORKDIR}/usr/share"
314 mount_nullfs /usr/libexec "${WORKDIR}/usr/libexec"
315 mount_nullfs /usr/lib "${WORKDIR}/usr/lib"
316 mount_nullfs /usr/include "${WORKDIR}/usr/include"
318 cd ${PORTSDIR}/${portname}
320 make DESTDIR_ENV_LIST=PATH DESTDIR="${WORKDIR}" install
323 umount "${WORKDIR}/lib"
324 umount "${WORKDIR}/usr/ports"
325 umount "${WORKDIR}/usr/bin"
326 umount "${WORKDIR}/usr/sbin"
327 umount "${WORKDIR}/usr/share"
328 umount "${WORKDIR}/usr/libexec"
329 umount "${WORKDIR}/usr/lib"
330 umount "${WORKDIR}/usr/include"
335 echo "${TS} Building customized tiny beastie kernel... "
336 cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/${TINYARCH}/conf
338 make buildkernel KERNCONF=${KERNCONF} || exit 1
339 gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
340 install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
341 install ${DEFINSTARGS} \
342 /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
343 ${WORKDIR}/boot/kernel
344 install -o 0 -g 0 -m 444 /sys/${TINYARCH}/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
348 TDEPFILE="`mktemp -t deps`"
349 TDEPFILES="`mktemp -t depsymlnk`"
351 find "${WORKDIR}" -type f |while read file; do
352 ldd -f "%p\n" ${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
355 for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
356 ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
359 for pamdep in `ls -1 /usr/lib/pam*`; do
360 echo $pamdep >> ${TDEPFILE} ;
361 ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
364 for lib in `cat ${TDEPFILE} | sort | uniq`; do
365 echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
366 cp -fp ${lib} ${WORKDIR}${lib} ;
369 for depsymlink in `cat ${TDEPFILE}`; do
370 echo "${TS} Checking if ${depsymlink} is a symbolic link"
371 /bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
374 for i in `cat ${TDEPFILES}`; do
375 SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
376 TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
378 echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
379 chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
380 chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
382 echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
383 chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
386 echo -n "${TS} Unlinking "
387 rm -fv ${TDEPFILE} ${TDEPFILES}
391 cd /usr/src/etc/sendmail/
392 make freebsd.cf freebsd.submit.cf
395 mkdir -p ${WORKDIR}/var/named/etc/namedb
396 make distribution DESTDIR=${WORKDIR} || exit 1
400 echo "Creating ssh keys..."
401 ssh-keygen -t rsa1 -b 1024 -f ${WORKDIR}/etc/ssh/ssh_host_key -N ''
402 ssh-keygen -t dsa -f ${WORKDIR}/etc/ssh/ssh_host_dsa_key -N ''
403 ssh-keygen -t rsa -f ${WORKDIR}/etc/ssh/ssh_host_rsa_key -N ''
407 echo "${TS} Copying your custom configuration on conf/ ..."
408 for custom in `find ${CURRENTDIR}/conf/${CONF}/ -type d -depth 1 \! -name CVS`; do
409 cp -Rp ${custom}/* ${WORKDIR}/${custom#${CURRENTDIR}/conf/${CONF}/}/
412 if [ -f ${CURRENTDIR}/conf/${CONF}/boot.config ]; then
413 cp ${CURRENTDIR}/conf/${CONF}/boot.config ${WORKDIR}/boot.config
419 for i in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE}| grep -v "#" | grep ":"`; do
420 SOURCE_FILE=`echo $i | awk -F ":" {'print $1'}`
421 TARGET_FILE=`echo $i | awk -F ":" {'print $2'}`
422 chroot ${WORKDIR} /bin/ln -vs /${SOURCE_FILE} ${TARGET_FILE}
429 VNODEFILE=`mktemp -t tinybsd`
430 IMGMNT=`mktemp -d -t tinybsd`
432 dd if=/dev/zero of=${VNODEFILE} count=${SECTUNIT}
434 MD=`mdconfig -a -t vnode -f ${VNODEFILE} -x ${SECTRACK} -y ${TRACKCYL}`
436 diskinfo -v /dev/${MD}
441 cp -p /boot/boot0 ${WORKDIR}/boot/boot0
442 bsdlabel -w -B /dev/${MD}
443 newfs -O2 -U /dev/${MD}a
445 mount /dev/${MD}a ${IMGMNT}
447 if [ ${MFSROOT} = 'yes' ]
449 echo "${TS} Creating MFS root..."
450 # Update is not done yet
451 #mkdir -p ${WORKDIR}/usr/local/bin/
452 #cp -p ${CURRENTDIR}/update/update ${WORKDIR}/usr/local/bin/
453 rm ${WORKDIR}/etc/fstab
454 cd ${WORKDIR} && find . -print | sed '/kernel/ d' | cpio -dump ${IMGMNT} || true
456 dd if=/dev/${MD} of=${CURRENTDIR}/mfsroot.img
457 gzip -9 < ${CURRENTDIR}/mfsroot.img > ${CURRENTDIR}/mfsroot.gz
458 rm ${CURRENTDIR}/mfsroot.img
459 mount /dev/${MD}a ${IMGMNT}
461 cp -rp ${WORKDIR}/boot ${IMGMNT}
462 rm ${IMGMNT}/boot/device.hints
464 echo 'set vfs.root.mountfrom="ufs:/dev/md0a"' ; \
465 echo 'set bootfile="/boot/kernel/kernel"' ; \
466 sed -e '/^#/ d' -e 's/^/set /' < ${WORKDIR}/boot/device.hints ; \
467 echo 'load /boot/kernel/kernel' ; \
468 echo 'echo Loading mfsroot' ; \
469 echo 'load -t mfs_root /mfsroot' ;\
471 ) > ${IMGMNT}/boot/loader.rc
472 mv ${CURRENTDIR}/mfsroot.gz ${IMGMNT}
474 ( cd ${WORKDIR} && find . -print | cpio -dump ${IMGMNT} ) || true
481 dd if=/dev/${MD} of=${CURRENTDIR}/${IMG} bs=64k
488 echo "${TS} Your configuration options were saved in ${FULLFILENAME}"
489 echo "${TS} You can see your build log in ${HOME}/tinybsd.log"
490 echo "${TS} Your final image is in ${CURRENTDIR}/${IMG}"
491 echo "${TS} Now use dd(1) to write it."
494 ##########################
497 ##########################################
498 ## The actual program
499 ##########################################
502 # Load as many of the configuration options as we can
525 ) 2>&1 |tee -a ${HOME}/tinybsd.log