1f4051287SDavid du Colombier#!/bin/rc 2f4051287SDavid du Colombier# mkusbboot - make a bootable standalone plan 9 image to copy to a usb disk. 3f4051287SDavid du Colombier# 4f4051287SDavid du Colombier# due to name clashes in /srv, will only work on a machine 5f4051287SDavid du Colombier# without a fossil named `fossil' already running. 6f4051287SDavid du Colombier 7f4051287SDavid du Colombierrfork en 8f4051287SDavid du Colombiersyscfg=/sys/lib/sysconfig 9f4051287SDavid du Colombierproto=$syscfg/proto/stand-usb 10f4051287SDavid du Colombiersrcroot=/n/boot 11f4051287SDavid du Colombierquantum=1000000 12f4051287SDavid du Colombier# size of image in $quantum-byte units. 1900 is enough for production system 13f4051287SDavid du Colombier# (fs, /n/boot, ~1.2GB); 900 is ample for our install image 14f4051287SDavid du Colombier# (sources, /n/sources/plan9, ~370MB). 15*0a75e54aSDavid du Colombierdefsize=1900 16*0a75e54aSDavid du Colombiersize=() 17f4051287SDavid du Colombier 18f4051287SDavid du Colombierfn usage { 19eb2d6162SDavid du Colombier echo usage: $argv0 '[-b boot] [-p proto] [-r root] [-s 10⁶-bytes]' >[1=2] 20f4051287SDavid du Colombier exit usage 21f4051287SDavid du Colombier} 22f4051287SDavid du Colombier 23f4051287SDavid du Colombierfn sigint sighup sigterm { 248498559bSDavid du Colombier rm -f /tmp/9load 25f4051287SDavid du Colombier exit note 26f4051287SDavid du Colombier} 27f4051287SDavid du Colombier 28f4051287SDavid du Colombier# process arguments 29f4051287SDavid du Colombierdone=0 30f4051287SDavid du Colombierargv0=$0 31eb2d6162SDavid du Colombierboot=/386/9loadusb 32f4051287SDavid du Colombierwhile (~ $done 0 && ! ~ $#* 0 && ~ $1 -*) { 33f4051287SDavid du Colombier switch ($1) { 34eb2d6162SDavid du Colombier case -b; boot=$2; shift 35f4051287SDavid du Colombier case -p; proto=$2; shift 36f4051287SDavid du Colombier case -r; srcroot=$2; shift 37f4051287SDavid du Colombier case -s; size=$2; shift 38f4051287SDavid du Colombier case --; done=1 # no break in rc, alas 39f4051287SDavid du Colombier case -*; usage 40f4051287SDavid du Colombier } 41f4051287SDavid du Colombier shift 42f4051287SDavid du Colombier} 43f4051287SDavid du Colombierif (! ~ $#* 0) 44f4051287SDavid du Colombier usage 45f4051287SDavid du Colombier 46f4051287SDavid du Colombier# special case sources 47f4051287SDavid du Colombierif (~ $srcroot /n/*) 48f4051287SDavid du Colombier srcfs=`{ echo $srcroot | sed 's;^/n/([^/]+).*;\1;' } 49f4051287SDavid du Colombierif (~ $srcfs sources) 50*0a75e54aSDavid du Colombier defsize=900 51*0a75e54aSDavid du Colombierif (~ $#size 0) 52*0a75e54aSDavid du Colombier size=$defsize 53f4051287SDavid du Colombier 54f4051287SDavid du Colombier# make empty disk image file of maximum size 55f4051287SDavid du Colombierecho -n 'image: ' >[1=2] 56f4051287SDavid du Colombierdd -ibs $quantum -obs $quantum -oseek `{hoc -e $size'-1'} -count 1 -quiet 1 \ 57f4051287SDavid du Colombier </dev/zero >image 58f4051287SDavid du Colombier 59f4051287SDavid du Colombier# partition it 60f4051287SDavid du Colombierdisk/partfs image 61f4051287SDavid du Colombiercd /dev/sdXX 62f4051287SDavid du Colombier 63f4051287SDavid du Colombier# prep it: lay down mbr, fdisk partitions, 9 partitions 64f4051287SDavid du Colombierecho -n mbr+fdisk+prep... >[1=2] 65eb2d6162SDavid du Colombierdisk/mbr -m /386/mbr data 66f4051287SDavid du Colombierdisk/fdisk -baw data 67f4051287SDavid du Colombierdisk/prep -bw -a^(9fat nvram fscfg fossil) plan9 >/dev/null 68f4051287SDavid du Colombier 69f4051287SDavid du Colombier# populate 9fat, nvram, fsconfig 70f4051287SDavid du Colombierecho -n 9fat... >[1=2] 71f4051287SDavid du Colombierswitch ($objtype) { 72f4051287SDavid du Colombiercase 386 73*0a75e54aSDavid du Colombier # we don't normally keep gzipped kernels around, 74*0a75e54aSDavid du Colombier # but usb can be flakey and slow, so we'll make one. 75*0a75e54aSDavid du Colombier k=/tmp/9pccpuf.gz 76*0a75e54aSDavid du Colombier gzip -9 </$objtype/9pccpuf >$k 77f4051287SDavid du Colombiercase amd64 78f4051287SDavid du Colombier k=/$objtype/9k8cpu 79f4051287SDavid du Colombiercase * 80f4051287SDavid du Colombier echo $0: 'can''t cope with architecture' $objtype >[1=2] 81f4051287SDavid du Colombier exit unknown-arch 82f4051287SDavid du Colombier} 83eb2d6162SDavid du Colombiercp $boot /tmp/9load # force format to record the name `9load' 84eb2d6162SDavid du Colombierdisk/format -b /386/pbslba -d -r 2 9fat /tmp/9load $k \ 85f4051287SDavid du Colombier $syscfg/usb/plan9.ini >[2=1] | 86f4051287SDavid du Colombier grep -v '^(add .* at clust |Init|type |Adding file|used )' 87*0a75e54aSDavid du Colombierif (~ $objtype 386) 88*0a75e54aSDavid du Colombier rm -f $k 89eb2d6162SDavid du Colombierrm -f /tmp/9load 90f4051287SDavid du Colombiercp /dev/zero nvram >[2]/dev/null 91f4051287SDavid du Colombiercp /dev/zero fscfg >[2]/dev/null 92f4051287SDavid du Colombier 938498559bSDavid du Colombier# fill the fossil 94f4051287SDavid du Colombier9fs $srcfs 958498559bSDavid du Colombierecho -n load fossil... >[1=2] 968498559bSDavid du Colombierexec loadfossil /dev/sdXX/fossil $srcroot $proto $syscfg/usb/fossil.conf 97