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"
78 Usage: $0 sectors=<size of media> [80000]
79 heads=<heads according to firmware> [4]
80 spt=<sectors per track according to firmware> [32]
81 conf=<configuration name> (see conf/name) [default]
82 mfsroot[=<yes|no>] [no]
83 image=<tinybsd image name> [tinybsd.bin]
84 batch[=<anything>] (do not ask interactively)
85 new[=<anything>] (do not read previous values)
88 $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
90 Default values are set in the program.
91 Environment values override defaults.
92 Previous values override environment values but can be disabled.
93 Command arguments override previous values.
94 Interactive values override command arguments but can be disabled.
96 Run diskinfo(8) -v against your CF device to get correct information
97 about your disk. USB keys do not need any specific geometry"
102 # Load variables from stdin (could be a file)
103 # Look for lines that match foo=bar
104 # do not run the file.. that is asking for trouble
123 eval "${PART1}='${PART2}'"
135 # get values from the user
142 if [ "$NO_PROMPTS" != "YES" ]
144 echo -n "$MESSAGE [$ANSWER] " > /dev/tty
146 [ "$result" != "" ] && ANSWER=$result
149 ANSWER=`eval "echo $ANSWER"`
154 # These are only used the VERY first time you run the program (on this machine)
157 NO_PROMPTS=${NO_PROMPTS:-NO}
158 NO_READ=${NO_READ:-NO}
159 SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
160 TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
161 SECTRACK=${SECTRACK:-32}; export SECTRACK
162 CONF=${CONF:-default}; export CONF
163 MFSROOT=${MFSROOT:-NO}; export MFSROOT
164 IMG=${IMG:-tinybsd.bin}; export IMG
169 # get ourselves set up.
170 # Partly by reading config files and partly from asking questions.
173 if [ "${NO_READ}" = "YES" ]
179 HOSTPART=${HOSTNAME%%.*}
180 FILENAME=".tinybsd.${HOSTPART}.${USER}"
181 FULLFILENAME=$HOME/$FILENAME
183 if [ -f ${FULLFILENAME} ]
185 loadvars <${FULLFILENAME}
188 SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
189 TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
190 SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
193 echo "The following configurations exist:"
194 ls -l conf|awk '/^d/{print " ",$9}'|grep -v CVS
195 CONF=`confirm_action "$CONF" "Configuration name?"`
196 if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
198 echo "${TS} Error: Could not find config (${CONF})"
199 if [ "$NO_PROMPTS" = "YES" ]
207 MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
208 IMG=`confirm_action "$IMG" "Image file to generate?"`
210 # example of formatted value (NNN in this case)
211 # #condition and format the number
212 # if [ -z "${BUILDNUM}" ]
214 # echo "Starting with build 001"
217 # BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
225 HOSTPART=${HOSTNAME%%.*}
226 FILENAME=".tinybsd.${HOSTPART}.${USER}"
227 FULLFILENAME=$HOME/$FILENAME
229 echo "# written by tinybsd" `date`
230 echo "SECTUNIT=${SECTUNIT}"
231 echo "TRACKCYL=${TRACKCYL}"
232 echo "SECTRACK=${SECTRACK}"
234 echo "MFSROOT=${MFSROOT:-NO}"
239 check_alt_imgname() {
240 if [ ${IMG} = 'tinybsd.bin' ]
242 echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
247 mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
251 # Before removing check if there is not a mount under $WORKDIR anymore
252 MOUNT_CHECK=`mount|egrep "on ${WORKDIR}"`
254 if [ ! -z "${MOUNT_CHECK}" ]; then
255 echo "There are mounts under the workdir (${WORKDIR}). Please umount them before running this script"
258 chflags -R noschg ${WORKDIR}
259 echo "${TS} Removing "${WORKDIR}
261 echo "${TS} Removing Build Kernel Directory"
262 rm -rf /usr/obj/usr/src/sys/${KERNCONF}
275 echo "${TS} Creating directory hierarchy... "
276 mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
277 mtree -deU -f /etc/mtree/BIND.chroot.dist -p ${WORKDIR}
278 mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
279 mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
280 mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
284 cd ${CURRENTDIR}/conf/${CONF}
286 for file in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE} | grep -v "#" | \
287 cut -f1 -d":" | sort | uniq` ; do
288 echo "${TS} Copying "/${file}" to "${WORKDIR}/${file}
289 cp -fp /${file} ${WORKDIR}/${file} ;
294 for portname in `cat ${CURRENTDIR}/conf/${CONF}/${PORTSFILE} | grep -v '#'` ; do
295 if [ ! -d "${WORKDIR}/usr/ports" ]; then
296 mkdir -p "${WORKDIR}/usr/ports"
299 PNAME=`/usr/bin/basename "${portname}"`
300 PORT_OPTION_FILE="/var/db/ports/${PNAME}/options"
302 if [ -f "${PORT_OPTION_FILE}" ]; then
303 mkdir -p "${WORKDIR}/var/db/ports/${PNAME}"
304 cp "${PORT_OPTION_FILE}" "${WORKDIR}/var/db/ports/${PNAME}/"
307 mount_nullfs /lib "${WORKDIR}/lib"
308 mount_nullfs /usr/bin "${WORKDIR}/usr/bin"
309 mount_nullfs /usr/sbin "${WORKDIR}/usr/sbin"
310 mount_nullfs /usr/ports "${WORKDIR}/usr/ports"
311 mount_nullfs /usr/share "${WORKDIR}/usr/share"
312 mount_nullfs /usr/libexec "${WORKDIR}/usr/libexec"
313 mount_nullfs /usr/lib "${WORKDIR}/usr/lib"
314 mount_nullfs /usr/include "${WORKDIR}/usr/include"
316 cd ${PORTSDIR}/${portname}
318 make DESTDIR_ENV_LIST=PATH DESTDIR="${WORKDIR}" install
321 umount "${WORKDIR}/lib"
322 umount "${WORKDIR}/usr/ports"
323 umount "${WORKDIR}/usr/bin"
324 umount "${WORKDIR}/usr/sbin"
325 umount "${WORKDIR}/usr/share"
326 umount "${WORKDIR}/usr/libexec"
327 umount "${WORKDIR}/usr/lib"
328 umount "${WORKDIR}/usr/include"
333 echo "${TS} Building customized tiny beastie kernel... "
334 cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/i386/conf
336 make buildkernel KERNCONF=${KERNCONF} || exit 1
337 gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
338 install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
339 install ${DEFINSTARGS} \
340 /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
341 ${WORKDIR}/boot/kernel
342 install -o 0 -g 0 -m 444 /sys/i386/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
346 TDEPFILE="`mktemp -t deps`"
347 TDEPFILES="`mktemp -t depsymlnk`"
349 find "${WORKDIR}" -type f |while read file; do
350 ldd -f "%p\n" ${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
353 for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
354 ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
357 for pamdep in `ls -1 /usr/lib/pam*`; do
358 echo $pamdep >> ${TDEPFILE} ;
359 ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
362 for lib in `cat ${TDEPFILE} | sort | uniq`; do
363 echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
364 cp -fp ${lib} ${WORKDIR}${lib} ;
367 for depsymlink in `cat ${TDEPFILE}`; do
368 echo "${TS} Checking if ${depsymlink} is a symbolic link"
369 /bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
372 for i in `cat ${TDEPFILES}`; do
373 SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
374 TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
376 echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
377 chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
378 chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
380 echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
381 chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
384 echo -n "${TS} Unlinking "
385 rm -fv ${TDEPFILE} ${TDEPFILES}
389 cd /usr/src/etc/sendmail/
390 make freebsd.cf freebsd.submit.cf
393 mkdir -p ${WORKDIR}/var/named/etc/namedb
394 make distribution DESTDIR=${WORKDIR}
398 echo "Creating ssh keys..."
399 ssh-keygen -t rsa1 -b 1024 -f ${WORKDIR}/etc/ssh/ssh_host_key -N ''
400 ssh-keygen -t dsa -f ${WORKDIR}/etc/ssh/ssh_host_dsa_key -N ''
401 ssh-keygen -t rsa -f ${WORKDIR}/etc/ssh/ssh_host_rsa_key -N ''
405 echo "${TS} Copying your custom configuration on conf/ ..."
406 for custom in `find ${CURRENTDIR}/conf/${CONF}/ -type d -depth 1 \! -name CVS`; do
407 cp -Rp ${custom}/* ${WORKDIR}/${custom#${CURRENTDIR}/conf/${CONF}/}/
410 if [ -f ${CURRENTDIR}/conf/${CONF}/boot.config ]; then
411 cp ${CURRENTDIR}/conf/${CONF}/boot.config ${WORKDIR}/boot.config
417 for i in `cat ${CURRENTDIR}/conf/${CONF}/${BASEFILE}| grep -v "#" | grep ":"`; do
418 SOURCE_FILE=`echo $i | awk -F ":" {'print $1'}`
419 TARGET_FILE=`echo $i | awk -F ":" {'print $2'}`
420 chroot ${WORKDIR} /bin/ln -vs /${SOURCE_FILE} ${TARGET_FILE}
427 VNODEFILE=`mktemp -t tinybsd`
428 IMGMNT=`mktemp -d -t tinybsd`
430 dd if=/dev/zero of=${VNODEFILE} count=${SECTUNIT}
432 MD=`mdconfig -a -t vnode -f ${VNODEFILE} -x ${SECTRACK} -y ${TRACKCYL}`
434 diskinfo -v /dev/${MD}
439 cp -p /boot/boot0 ${WORKDIR}/boot/boot0
440 bsdlabel -w -B /dev/${MD}
441 newfs -O2 -U /dev/${MD}a
443 mount /dev/${MD}a ${IMGMNT}
445 if [ ${MFSROOT} = 'yes' ]
447 echo "${TS} Creating MFS root..."
448 # Update is not done yet
449 #mkdir -p ${WORKDIR}/usr/local/bin/
450 #cp -p ${CURRENTDIR}/update/update ${WORKDIR}/usr/local/bin/
451 rm ${WORKDIR}/etc/fstab
452 cd ${WORKDIR} && find . -print | sed '/kernel/ d' | cpio -dump ${IMGMNT} || true
454 dd if=/dev/${MD} of=${CURRENTDIR}/mfsroot.img
455 gzip -9 < ${CURRENTDIR}/mfsroot.img > ${CURRENTDIR}/mfsroot.gz
456 rm ${CURRENTDIR}/mfsroot.img
457 mount /dev/${MD}a ${IMGMNT}
459 cp -rp ${WORKDIR}/boot ${IMGMNT}
460 rm ${IMGMNT}/boot/device.hints
462 echo 'set vfs.root.mountfrom="ufs:/dev/md0a"' ; \
463 echo 'set bootfile="/boot/kernel/kernel"' ; \
464 sed -e '/^#/ d' -e 's/^/set /' < ${WORKDIR}/boot/device.hints ; \
465 echo 'load /boot/kernel/kernel' ; \
466 echo 'echo Loading mfsroot' ; \
467 echo 'load -t mfs_root /mfsroot' ;\
469 ) > ${IMGMNT}/boot/loader.rc
470 mv ${CURRENTDIR}/mfsroot.gz ${IMGMNT}
472 ( cd ${WORKDIR} && find . -print | cpio -dump ${IMGMNT} ) || true
479 dd if=/dev/${MD} of=${CURRENTDIR}/${IMG} bs=64k
486 echo "${TS} Your configuration options were saved in ${FULLFILENAME}"
487 echo "${TS} You can see your build log in ${HOME}/tinybsd.log"
488 echo "${TS} Your final image is in ${CURRENTDIR}/${IMG}"
489 echo "${TS} Now use dd(1) to write it."
492 ##########################
495 ##########################################
496 ## The actual program
497 ##########################################
500 # Load as many of the configuration options as we can
523 ) 2>&1 |tee -a ${HOME}/tinybsd.log