xref: /plan9/rc/bin/mkusbboot (revision 0a75e54a195f699ff0426de1f8ba80514066a83b)
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