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