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 ]
15 WORKDIR=/usr/obj/tinybsdbuild
17 BASEFILE="tinybsd.basefiles"
18 PORTSFILE="tinybsd.ports"
21 PKGFILES=/tmp/pkg.files
22 DEFINSTARGS="-o 0 -g 0 -m 555"
79 Usage: $0 sectors=<size of media> [80000]
80 heads=<heads according to firmware> [4]
81 spt=<sectors per track according to firmware> [32]
82 conf=<configuration name> (see conf/name) [default]
83 mfsroot[=<yes|no>] [no]
84 image=<tinybsd image name> [tinybsd.bin]
85 batch[=<anything>] (do not ask interactively)
86 new[=<anything>] (do not read previous values)
89 $0 sectors=65536 heads=8 spt=16 conf=wireless mfsroot=yes image=myimage.img batch
91 Default values are set in the program.
92 Environment values override defaults.
93 Previous values override environment values but can be disabled.
94 Command arguments override previous values.
95 Interactive values override command arguments but can be disabled.
97 Run diskinfo(8) -v against your CF device to get correct information
98 about your disk. USB keys do not need any specific geometry"
103 # Load variables from stdin (could be a file)
104 # Look for lines that match foo=bar
105 # do not run the file.. that is asking for trouble
124 eval "${PART1}='${PART2}'"
136 # get values from the user
143 if [ "$NO_PROMPTS" != "YES" ]
145 echo -n "$MESSAGE [$ANSWER] " > /dev/tty
147 [ "$result" != "" ] && ANSWER=$result
150 ANSWER=`eval "echo $ANSWER"`
155 # These are only used the VERY first time you run the program (on this machine)
158 NO_PROMPTS=${NO_PROMPTS:-NO}
159 NO_READ=${NO_READ:-NO}
160 SECTUNIT=${SECTUNIT:-80000}; export SECTUNIT
161 TRACKCYL=${TRACKCYL:-4}; export TRACKCYL
162 SECTRACK=${SECTRACK:-32}; export SECTRACK
163 CONF=${CONF:-default}; export CONF
164 MFSROOT=${MFSROOT:-NO}; export MFSROOT
165 IMG=${IMG:-tinybsd.bin}; export IMG
170 # get ourselves set up.
171 # Partly by reading config files and partly from asking questions.
174 if [ "${NO_READ}" = "YES" ]
180 HOSTPART=${HOSTNAME%%.*}
181 FILENAME=".tinybsd.${HOSTPART}.${USER}"
182 FULLFILENAME=$HOME/$FILENAME
184 if [ -f ${FULLFILENAME} ]
186 loadvars <${FULLFILENAME}
189 SECTUNIT=`confirm_action "$SECTUNIT" "512 byte sectors per unit?"`
190 TRACKCYL=`confirm_action "$TRACKCYL" "Tracks per cylinder?"`
191 SECTRACK=`confirm_action "$SECTRACK" "Sectors per track?"`
194 echo "The following configurations exist:"
195 ls -l conf|awk '/^d/{print " ",$9}'|grep -v CVS
196 CONF=`confirm_action "$CONF" "Configuration name?"`
197 if [ ! -d "${CURRENTDIR}/conf/$CONF" ]
199 echo "${TS} Error: Could not find config (${CONF})"
200 if [ "$NO_PROMPTS" = "YES" ]
208 MFSROOT=`confirm_action "$MFSROOT" "Use an MFSROOT? (YES/NO)"`
209 IMG=`confirm_action "$IMG" "Image file to generate?"`
211 # example of formatted value (NNN in this case)
212 # #condition and format the number
213 # if [ -z "${BUILDNUM}" ]
215 # echo "Starting with build 001"
218 # BUILDNUM=`printf "%03d\n" $(($BUILDNUM))`
226 HOSTPART=${HOSTNAME%%.*}
227 FILENAME=".tinybsd.${HOSTPART}.${USER}"
228 FULLFILENAME=$HOME/$FILENAME
230 echo "# written by tinybsd" `date`
231 echo "SECTUNIT=${SECTUNIT}"
232 echo "TRACKCYL=${TRACKCYL}"
233 echo "SECTRACK=${SECTRACK}"
235 echo "MFSROOT=${MFSROOT:-NO}"
240 check_alt_imgname() {
241 if [ ${IMG} = 'tinybsd.bin' ]
243 echo "${TS} Alternative image name not set; defaulting to 'tinybsd.bin'"
248 mv -f ${HOME}/tinybsd.log ${HOME}/tinybsd.log.old
252 chflags -R noschg ${WORKDIR}
253 echo "${TS} Removing "${WORKDIR}
255 echo "${TS} Removing Build Kernel Directory"
256 rm -rf /usr/obj/usr/src/sys/${KERNCONF}
268 echo "${TS} Creating directory hierarchy... "
269 mtree -deU -f /etc/mtree/BSD.root.dist -p ${WORKDIR}
270 mtree -deU -f /etc/mtree/BIND.chroot.dist -p ${WORKDIR}
271 mtree -deU -f /etc/mtree/BSD.usr.dist -p ${WORKDIR}/usr
272 mtree -deU -f /etc/mtree/BSD.local.dist -p ${WORKDIR}/usr/local
273 mtree -deU -f /etc/mtree/BSD.var.dist -p ${WORKDIR}/var
277 cd ${CURRENTDIR}/conf/${CONF}
279 for file in `cat ${BASEFILE} | grep -v "#" | \
280 cut -f1 -d":" | sort | uniq` ; do
281 echo "${TS} Copying "/${file}" to "${WORKDIR}/${file}
282 cp -fp /${file} ${WORKDIR}/${file} ;
287 for portname in `cat ${PORTSFILE} | grep -v '#'` ; do
288 cd ${PORTSDIR}/${portname}
289 pkgname=`make -V PKGNAME`
290 pkg_info -VQ ${pkgname}
292 if [ ${install} -eq 0 ] ; then
293 echo "$portname is already installed..."
304 create_missingdir() {
305 pkg_info -L ${pkgname} | egrep -v '(Information|Files|www|share|doc|man|include)' | sort | uniq >> ${PKGDIRS}
306 for dir in `cat ${PKGDIRS}`; do
307 if [ ! -d `dirname ${WORKDIR}/${dir}` ] ; then
308 mkdir -p `dirname ${WORKDIR}/${dir}`
315 pkg_info -L ${pkgname} | egrep -v '(Information|Files|www|share|doc|man|include)' >> ${PKGFILES}
316 for port in `cat ${PKGFILES}` ; do
317 echo "${TS} Copying "${port}" to "${WORKDIR}${port}
318 cp -fp ${port} ${WORKDIR}${port} ;
323 echo "${TS} Building customized tiny beastie kernel... "
324 cp -p ${CURRENTDIR}/conf/${CONF}/${KERNCONF} /usr/src/sys/i386/conf
326 make buildkernel KERNCONF=${KERNCONF} || exit 1
327 gzip -9 /usr/obj/usr/src/sys/${KERNCONF}/kernel
328 install ${DEFINSTARGS} /usr/obj/usr/src/sys/${KERNCONF}/kernel.gz ${WORKDIR}/boot/kernel/
329 install ${DEFINSTARGS} \
330 /usr/obj/usr/src/sys/${KERNCONF}/modules/usr/src/sys/modules/acpi/acpi/acpi.ko \
331 ${WORKDIR}/boot/kernel
332 install -o 0 -g 0 -m 444 /sys/i386/conf/GENERIC.hints ${WORKDIR}/boot/device.hints
336 TDEPFILE="`mktemp -t deps`"
337 TDEPFILES="`mktemp -t depsymlnk`"
339 cd ${CURRENTDIR}/conf/${CONF}
340 for file in `cat ${BASEFILE} ${PKGFILES} | grep -v "#" | cut -f1 -d":"`; do
341 ldd -f "%p\n" /${file} >> ${TDEPFILE} ; # don't worry on progs been "not dynamic"
346 for libdeplib in `cat ${TDEPFILE} | sort | uniq`; do
347 ldd -f "%p\n" /${libdeplib} >> ${TDEPFILE} ;
350 for pamdep in `ls -1 /usr/lib/pam*`; do
351 echo $pamdep >> ${TDEPFILE} ;
352 ldd -f "%p\n" /${pamdep} >> ${TDEPFILE} ;
355 for lib in `cat ${TDEPFILE} | sort | uniq`; do
356 echo "${TS} Copying "${lib}" to "${WORKDIR}${lib}
357 cp -fp ${lib} ${WORKDIR}${lib} ;
360 for depsymlink in `cat ${TDEPFILE}`; do
361 echo "${TS} Checking if ${depsymlink} is a symbolic link"
362 /bin/ls -l $depsymlink | grep "\->" | awk '{print $11":"$9}' >> ${TDEPFILES}
365 for i in `cat ${TDEPFILES}`; do
366 SOURCE_FILE=`echo $i | awk -F ":" '{print $1}'`
367 TARGET_FILE=`echo $i | awk -F ":" '{print $2}'`
369 echo "${TS} Unlinking ${WORKDIR}${TARGET_FILE}"
370 chroot ${WORKDIR} /bin/chflags 0 ${TARGET_FILE}
371 chroot ${WORKDIR} /bin/rm -f ${TARGET_FILE}
373 echo "${TS} Symlinking ${SOURCE_FILE} to ${TARGET_FILE}"
374 chroot ${WORKDIR} /bin/ln -s ${SOURCE_FILE} ${TARGET_FILE}
377 echo -n "${TS} Unlinking "
378 rm -fv ${TDEPFILE} ${TDEPFILES}
382 for portname in `cat ${PORTSFILE} | grep -v '#'` ; do
383 cd ${PORTSDIR}/${portname}
384 if [ $? -ne ${install} ] ; then
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}
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 ${BASEFILE} ${PORTSFILE} | 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."
495 ##########################
498 ##########################################
499 ## The actual program
500 ##########################################
503 # Load as many of the configuration options as we can
527 ) 2>&1 |tee -a ${HOME}/tinybsd.log