Module Name: src Committed By: christos Date: Sun Jan 13 20:57:18 UTC 2013
Modified Files: src/distrib/utils/embedded: mkimage Added Files: src/distrib/utils/embedded/conf: rpi.conf usermode.conf Log Message: Adjust mkimage to handle RPI. From skrll@ To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/distrib/utils/embedded/mkimage cvs rdiff -u -r0 -r1.1 src/distrib/utils/embedded/conf/rpi.conf \ src/distrib/utils/embedded/conf/usermode.conf Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/distrib/utils/embedded/mkimage diff -u src/distrib/utils/embedded/mkimage:1.3 src/distrib/utils/embedded/mkimage:1.4 --- src/distrib/utils/embedded/mkimage:1.3 Tue Feb 28 23:49:50 2012 +++ src/distrib/utils/embedded/mkimage Sun Jan 13 15:57:18 2013 @@ -1,6 +1,6 @@ #! /bin/sh -# $NetBSD: mkimage,v 1.3 2012/02/29 04:49:50 agc Exp $ +# $NetBSD: mkimage,v 1.4 2013/01/13 20:57:18 christos Exp $ # Copyright (c) 2012 Alistair Crooks <a...@netbsd.org> # All rights reserved. @@ -70,6 +70,12 @@ next_avail () # find the size of the gzipped files in a .tgz archive sizeone() { + if [ ! -f "$1" ] + then + echo "$PROG: Missing set $1" 1>&2 + echo 0 + return; + fi case "$1" in *.tgz|*.tar.gz) tar tvzf "$1" | awk '{ tot += $5 } END { print tot }' @@ -83,31 +89,66 @@ sizeone() { esac } +usage() { + cat << EOF 1>&2 +Usage: $PROG [-S <setsdir>] [-c <custom-files-dir>] [-h <host-arch>] [-s <size>] +EOF +exit 1 +} + +finish() { + cleanup + ${sudo} umount ${mnt} + ${sudo} vnconfig -u ${vnddev} +} + +trap finish 0 1 2 3 15 +DIR="$(dirname "$0")" +PROG="$(basename "$0")" bar="===" -custom=custom -h=usermode1.$(uname -n) -image=usermode.img -overhead=8 # in MB -sets="base etc modules" -setsdir=/usr/build/release/$(uname -m)/binary/sets -size=0 # in MB -specialdirs="/kern /proc" -usermodedirs="/var.cow /etc.cow /root.cow /pkgs" -sudo="sudo" - -while [ $# -gt 0 ]; do - case "$1" in - -S) setsdir=$2; shift ;; - -c) custom=$2; shift ;; - -h) h=$2; shift ;; - -s) size=$2; shift ;; - -x) set -x ;; - *) break ;; +sudo= +mnt="/tmp/image.$$" +src="/usr/src" +obj="/usr/obj" + +# First pass for options to get the host +OPTS="S:c:h:s:x" +while getopts "$OPTS" f +do + case $f in + h) h="$OPTARG";; + *) ;; + esac +done + +if [ -z "$h" ] +then + usage +fi + +if [ ! -f "${DIR}/${h}.conf" ] +then + echo $PROG: ${DIR}/${h}.conf is not present 1>&2 + exit 1 +fi + +. "${DIR}/${h}.conf" + +OPTIND=1 +while getopts "$OPTS" f +do + case $f in + S) setsdir="$OPTARG";; + c) custom="$OPTARG";; + h) ;; + s) size="$OPTARG";; + x) set -x;; + *) ;; esac - shift done -if [ $# -gt 0 ]; then +shift $(( "$OPTIND" - 1 )) +if [ -n "$1" ]; then # take the next argument as being the image name image="$1" shift @@ -115,69 +156,52 @@ fi total=0 for s in ${sets}; do - total=$(expr ${total} + $(sizeone ${setsdir}/${s}.tgz)) + one="$(sizeone ${setsdir}/${s}.tgz)" + total=$(( ${total} + ${one} )) done # calculate size of custom files custsize=0 if [ -d "${custom}" ]; then custsize=$(ls -lR "${custom}" | awk 'NF == 9 { tot += $5 } END { print tot }') fi -total=$(expr \( \( ${total} + ${custsize} \) / 1000000 \) + ${overhead}) +total=$(( ( ( ${total} + ${custsize} ) / 1000000 ) + ${overhead} )) if [ $size -eq 0 ]; then # auto-size the pkgs fs size=${total} else # check that we've been given enough space if [ ${total} -gt ${size} ]; then - echo "File system size given as ${size} MB, but it needs ${total} MB" >&2 + echo "$PROG: Given size is ${size} MB, but we need ${total} MB" >&2 exit 1 fi fi echo "${bar} making a new ${size} MB image in ${image} ${bar}" -dd if=/dev/zero of=${image} bs=1m count=${size} +dd if=/dev/zero of=${image} bs=1m count=${size} conv=sparse vnddev=$(next_avail vnd) echo "${bar} mounting image via vnd ${vnddev} ${bar}" ${sudo} vnconfig ${vnddev} ${image} -${sudo} newfs /dev/r${vnddev}a -${sudo} mount /dev/${vnddev}a /mnt +${sudo} mkdir -p ${mnt} +make_filesystems + +${sudo} mkdir -p ${mnt}/etc ${mnt}/dev echo "${bar} installing sets ${bar}" -(cd /mnt && +(cd ${mnt} && for s in ${sets}; do - echo ${s} - ${sudo} tar xpzf ${setsdir}/${s}.tgz + if [ -f "${s}" ]; then + echo ${s} + ${sudo} tar xpzf ${setsdir}/${s}.tgz + fi done ) echo "${bar} performing customisations ${bar}" -${sudo} rm -f /mnt/etc/motd -tmp=/tmp/usermode.$$ -cat > ${tmp} << EOF -# NetBSD/usermode /etc/fstab -/dev/ld0a / ffs ro 1 1 -/dev/ld1a /pkgs ffs ro 1 2 -kernfs /kern kernfs rw -ptyfs /dev/pts ptyfs rw -procfs /proc procfs rw -# mount /root as tmpfs on top of existing dir -tmpfs /root.cow tmpfs rw,-s2M 0 0 -/root.cow /root union rw,hidden 0 0 -# mount /etc as tmpfs on top of existing dir -tmpfs /etc.cow tmpfs rw,-s12M 0 0 -/etc.cow /etc union rw,hidden 0 0 -# mount /var as tmpfs on top of existing dir -tmpfs /var.cow tmpfs rw,-s32M 0 0 -/var.cow /var union rw,hidden - - -tmpfs /tmp tmpfs rw,-s32M 0 0 -/dev/cd0a /cdrom cd9660 ro,noauto -EOF -${sudo} mv ${tmp} /mnt/etc/fstab +make_fstab -cat > ${tmp} << EOF -# $NetBSD: mkimage,v 1.3 2012/02/29 04:49:50 agc Exp $ +${sudo} cat > ${mnt}/etc/rc.conf << EOF # # see rc.conf(5) for more information. # @@ -196,48 +220,19 @@ fi # rc_configured=YES -# make sure we have the right rw filesystem at boot -critical_filesystems_local="/var.cow /var /etc.cow /etc /root.cow /root" - -# Add local overrides below -# -dhcpcd=YES -sshd=YES - hostname=${h} + EOF -${sudo} mv ${tmp} /mnt/etc/rc.conf -echo "${bar} making extra directories ${bar}" -for d in ${usermodedirs}; do - ${sudo} mkdir -p /mnt/${d} -done +customize + for d in ${specialdirs}; do - ${sudo} mkdir -p /mnt/${d} + ${sudo} mkdir -p ${mnt}/${d} done -echo "${bar} customising /var/tmp ${bar}" -${sudo} rm -rf /mnt/var/tmp -(cd /mnt/var && ${sudo} ln -s /tmp tmp) - -# package-related stuff -(cat /mnt/etc/csh.cshrc;echo "setenv PKG_DBDIR /usr/pkg/.dbdir") > ${tmp} -${sudo} mv ${tmp} /mnt/etc/csh.cshrc -(cat /mnt/etc/profile;echo "export PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} -${sudo} mv ${tmp} /mnt/etc/profile -(echo "PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} -${sudo} mv ${tmp} /mnt/etc/mk.conf -(cd /mnt/usr && ${sudo} ln -s /pkgs/usr/pkg pkg) - -# last, customisation stage -if [ -d ${custom} ]; then +if [ \( -n "${custom}" \) -a \( -d "${custom}" \) ]; then echo "${bar} user customisations from files in ${custom} ${bar}" - (cd ${custom} && ${sudo} pax -rwpe . /mnt) + (cd ${custom} && ${sudo} pax -rwpe . ${mnt}) fi -df /mnt - -${sudo} umount /mnt -${sudo} vnconfig -u ${vnddev} - exit 0 Added files: Index: src/distrib/utils/embedded/conf/rpi.conf diff -u /dev/null src/distrib/utils/embedded/conf/rpi.conf:1.1 --- /dev/null Sun Jan 13 15:57:18 2013 +++ src/distrib/utils/embedded/conf/rpi.conf Sun Jan 13 15:57:18 2013 @@ -0,0 +1,109 @@ +# $NetBSD: rpi.conf,v 1.1 2013/01/13 20:57:18 christos Exp $ +# Raspberry PI customization script used by mkimage +# +image=$HOME/rpi.img + +firmwaredir=$src/external/broadcom/rpi-firmware/dist +firmwarefiles="LICENCE.broadcom bootcode.bin fixup.dat fixup_cd.dat start.elf start_cd.elf" + +sets="base etc games man misc modules tests text" +setsdir=$obj/evbarm/media +kerneldir=$src/sys/arch/evbarm/compile/RPI +specialdirs="/kern /proc" + +size=2048 +overhead=8 + +tmp=/tmp/rpi.disklabel.$$ + +make_filesystems() { + cat > ${tmp} << EOF +type: SCSI +disk: STORAGE DEVICE +label: fictitious +flags: removable +bytes/sector: 512 +sectors/track: 32 +tracks/cylinder: 64 +sectors/cylinder: 2048 +cylinders: 7460 +total sectors: 2097152 +rpm: 3600 +interleave: 1 +trackskew: 0 +cylinderskew: 0 +headswitch: 0 # microseconds +track-to-track seek: 0 # microseconds +drivedata: 0 + +8 partitions: +# size offset fstype [fsize bsize cpg/sgs] + a: 1449984 647168 4.2BSD 2048 16384 0 # + b: 524288 122880 swap # + d: 2097152 0 unused 0 0 # + e: 114688 8192 MSDOS # +EOF + ${sudo} disklabel -R ${vnddev} ${tmp} + ${sudo} fdisk -f -u -0 -s 12/8192/114688 -F ${image} + ${sudo} newfs /dev/r${vnddev}a + ${sudo} newfs_msdos /dev/r${vnddev}e + ${sudo} mount /dev/${vnddev}a ${mnt} + ${sudo} mkdir ${mnt}/boot + ${sudo} mount_msdos /dev/${vnddev}e ${mnt}/boot +} + +make_fstab() { +${sudo} cat > ${mnt}/etc/fstab << EOF +# NetBSD /etc/fstab +# See /usr/share/examples/fstab/ for more examples. +/dev/ld0a / ffs rw,log 1 1 +/dev/ld0b none swap sw 0 0 +/dev/ld0e /boot msdos rw 1 1 +kernfs /kern kernfs rw +ptyfs /dev/pts ptyfs rw +procfs /proc procfs rw +EOF +} + +customize() { + + ${sudo} cat > ${mnt}/etc/rc.conf << EOF +sshd=YES +dhcpcd=YES +mdnsd=YES +wscons=YES +EOF + + ${sudo} cat > ${mnt}/boot/cmdline.txt << EOF +console=fb +#fb=1280x1024 # to select a mode, otherwise EDID will be tried and fallback to +#fb=disable # to disable fb completely +EOF + + echo "${bar} installing firmware files ${bar}" + (cd ${mnt}/boot && + for f in ${firmwarefiles}; do + echo $f + ${sudo} cp ${firmwaredir}/${f} . + done + ) + + if [ ! -f ${kerneldir}/kernel.img ]; then + echo ${PROG}: Missing ${kerneldir}/kernel.img 1>&2 + exit 1 + fi + echo "${bar} installing kernel ${bar}" + ${sudo} cp ${kerneldir}/kernel.img ${mnt}/boot + + if [ ! -f ${mnt}/dev/MAKEDEV ]; then + echo ${PROG}: Missing ${mnt}/dev/MAKEDEV 1>&2 + exit 1 + fi + echo "${bar} running MAKEDEV ${bar}" + (cd ${mnt}/dev && ${sudo} sh MAKEDEV all) +} + +cleanup() { + rm -f ${tmp} + ${sudo} umount ${mnt}/boot +} Index: src/distrib/utils/embedded/conf/usermode.conf diff -u /dev/null src/distrib/utils/embedded/conf/usermode.conf:1.1 --- /dev/null Sun Jan 13 15:57:18 2013 +++ src/distrib/utils/embedded/conf/usermode.conf Sun Jan 13 15:57:18 2013 @@ -0,0 +1,78 @@ +# $NetBSD: usermode.conf,v 1.1 2013/01/13 20:57:18 christos Exp $ +# NetBSD/usermode customization script used by mkimage +custom=custom +image=usermode.img +overhead=8 # in MB +sets="base etc modules" +setsdir=/usr/build/release/$(uname -m)/binary/sets +size=0 # in MB +specialdirs="/kern /proc" +usermodedirs="/var.cow /etc.cow /root.cow /pkgs" + +make_filesystems() { + ${sudo} newfs /dev/r${vnddev}a + ${sudo} mount /dev/${vnddev}a ${mnt} +} + +make_fstab() { +${sudo} cat > ${mnt}/etc/fstab << EOF +# NetBSD/usermode /etc/fstab +/dev/ld0a / ffs ro 1 1 +/dev/ld1a /pkgs ffs ro 1 2 +kernfs /kern kernfs rw +ptyfs /dev/pts ptyfs rw +procfs /proc procfs rw +# mount /root as tmpfs on top of existing dir +tmpfs /root.cow tmpfs rw,-s2M 0 0 +/root.cow /root union rw,hidden 0 0 +# mount /etc as tmpfs on top of existing dir +tmpfs /etc.cow tmpfs rw,-s12M 0 0 +/etc.cow /etc union rw,hidden 0 0 +# mount /var as tmpfs on top of existing dir +tmpfs /var.cow tmpfs rw,-s32M 0 0 +/var.cow /var union rw,hidden - - +tmpfs /tmp tmpfs rw,-s32M 0 0 +/dev/cd0a /cdrom cd9660 ro,noauto +EOF +} + +customize() { +${sudo} cat > ${mnt}/etc/rc.conf << EOF +# make sure we have the right rw filesystem at boot +critical_filesystems_local="/var.cow /var /etc.cow /etc /root.cow /root" + +# Add local overrides below +# +dhcpcd=YES +sshd=YES +EOF + +echo "${bar} making extra directories ${bar}" +for d in ${usermodedirs}; do + ${sudo} mkdir -p ${mnt}/${d} +done + +echo "${bar} customising /var/tmp ${bar}" +${sudo} rm -rf ${mnt}/var/tmp +(cd ${mnt}/var && ${sudo} ln -s /tmp tmp) + +# package-related stuff +(cat ${mnt}/etc/csh.cshrc;echo "setenv PKG_DBDIR /usr/pkg/.dbdir") > ${tmp} +${sudo} mv ${tmp} ${mnt}/etc/csh.cshrc +(cat ${mnt}/etc/profile;echo "export PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} +${sudo} mv ${tmp} ${mnt}/etc/profile +(echo "PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} +${sudo} mv ${tmp} ${mnt}/etc/mk.conf +(cd ${mnt}/usr && ${sudo} ln -s /pkgs/usr/pkg pkg) + +# last, customisation stage +if [ -d ${custom} ]; then + echo "${bar} user customisations from files in ${custom} ${bar}" + (cd ${custom} && ${sudo} pax -rwpe . ${mnt}) +fi + +df ${mnt} +} + +cleanup() { +}