Plan 9 from Bell Labs’s /usr/web/sources/contrib/maht/rc/install

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.



disk = sdC0
fstype = fossil #| fossil+venti
mbr = yes
fossilp = /dev/$disk/fossil
fossilsrv = installer
fscons = /srv/fs^$fossilsrv^cons
dist = /n/distmedia
distdir = dist
distisfrom=local #|  net
installurl = http://10.0.0.1
ventiarena = (/dev/$disk/arenas)
ventiindex = (/dev/$disk/isect)
ventireformat = yes
fat = /dev/$disk/9fat
bootfile = $disk!9fat!9pcf
bootargs = 'local!#S'^/$disk/fossil
bootdisk = $bootargs
venti = '#S'^/$disk/arenas
monitor=vesa
vgasize=1280x1024x32


fn hasmbr {
	x=`{xd -b $1 | sed -n '32p;32q'}
	~ $x(16) 55 && ~ $x(17) aa
}

fn dombr {
	if(~ mbr yes && ! hasmbr /dev/$disk/data)
		disk/mbr -m /386/mbr /dev/$disk/data
}

fn partdisk {
	disk/fdisk -a /dev/$disk/data
	disk/fdisk -p /dev/$disk/data >/dev/$disk/ctl >[2]/dev/null
	for(i in /dev/sd*/plan9*){
		if(test -f $i){
			d=`{basename -d $i}
			disk/prep -p $i >$d/ctl >[2]/dev/null
		}
	}
}

fn diskparted {
	mbrandplan9=0
	disks=`{ls /dev/sd*/plan9 >[2]/dev/null | sed 's!/dev/(sd..)/plan9!\1!'}
	for(disk in $disks) {
		if(hasmbr /dev/$disk/data)
			mbrandplan9=1
	if(~ $mbrandplan9 0)
		status='disk not partitioned'
}

fn autotype {
	if(~ $fstype fossil)
		echo -a 9fat -a nvram -a fossil -a swap
	if(~ $fstype fossil+venti)
		echo -a 9fat -a nvram -a arenas -a isect -a fossil -a swap # -a other
}

fn prepdisk {
	disk/prep `{autotype} $disk
	disk/prep -p $disk >`{basename -d $disk}^/ctl >[2]/dev/null
}

fn diskprepped {

	if(! test -f /dev/$disk/9fat)
		prepdisk=ready

	if(! ~ $prepdisk ready){
		prepdisk=done
		switch($fstype){
		case fossil
			if(! test -f /dev/$disk/fossil* && ! test -f /dev/fs/fossil*)
				prepdisk=ready
		case fossil+venti
			if(! test -f /dev/$disk/fossil* && ! test -f /dev/fs/fossil*)
				prepdisk=ready
			if(! test -f /dev/$disk/arenas && ! test -f /dev/fs/arenas*)
				prepdisk=ready
			if(! test -f /dev/$disk/isect && ! test -f /dev/fs/isect*)
				prepdisk=ready
		}
	}

	if(! ~ $prepdisk ready)
		status='disk not prepped'
}

fn fmtfossil {
	fossil/flfmt -y $fossilp
	n=`{cat /dev/swap | grep ' user' | sed 's/^[0-9]+\/([0-9]+) .*/\1/'}
	if(test $n -gt 32768)
		m=3000	# if have at least 128 user MB, use 24MB for fossil
	if not if(test $n -gt 16384)
		m=1500	# 64 user MB => 12MB for fossil
	if not if(test $n -gt 8192)
		m=750	# 32 user MB => 6MB for fossil
	if not
		m=256	# 2MB for fossil (this will be slow)

	# if we're using a venti in the back, take hourly snapshots
	# that retire after three days, in addition to the daily dumps at 5am
	if(~ $fstype fossil+venti){
		v=''
		snap='fsys main snaptime -s 60 -a 0500 -t 2880'
	}
	# otherwise, take the daily dumps but nothing else --
	# we can't retire snapshots unless dumps are being archived
	if not{
		v='-V'
		snap=''
	}
	echo \
'fsys main config '^$fossilp^'
fsys main open '^$v^' -c '^$m^'
'^$snap^'

'		| fossil/conf -w 
}

fn isfossil  {
	if(! cmp -s <{dd -quiet 1 -if $fossilp -bs 1024 -iseek 127 | dd -quiet 1 -bs 14 -count 1} <{echo 'fossil config'})
		status='no config'
	if not if(! cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 128 | dd -quiet 1 -bs 4 -count 1 | xd -b | sed 1q} <{echo '0000000  37 76 ae 89'})
		status='not write buffer'
}

fn run_fossil {
	echo 'srv -p fs'^$1^'cons' > /env/fossi.$1.conf
	echo 'srv fossil.'^$1 > /env/fossi.$1.conf
	echo 'fsys main config '^$disk >> /env/fossil.$1.conf
	echo 'fsys main open -AWVP' >> /env/fossil.$1.conf
	echo 'fsys main' >> /env/fossil.$1.conf
	fossil/fossil -c '. /env/fossil.'^$1.conf
	mount fossil.$1 /n/$1
}

fn initialise_newfs {
	if(! test -s /n/newfs/adm/users){
		echo fsys main create /active/adm adm sys d775 >>$fscons
		echo fsys main create /active/adm/users adm sys 664 >>$fscons
		echo uname upas :upas >>$fscons
		echo users -w >>$fscons
		sleep 2
	}
	if(! test -s /n/newfs/adm/users){
		status = 'could not create /adm/users'
		exit oops
	}
	for(i in dist dist/replica dist/replica/client){
		if(! test -d /n/newfs/$i)
			echo fsys main create /active/$i sys sys d775 >>$fscons
		sleep 2
	}
	if(! test -d /n/newfs/dist/replica/client){
		status = 'could not create /dist/replica/client'
		exit oops
	}
	if(! test -e /n/newfs/dist/replica/client/plan9.db){
		echo fsys main create /active/dist/replica/client/plan9.db sys sys 664 >>$fscons
		echo fsys main create /active/dist/replica/client/plan9.log sys sys a664 >>$fscons
	}
	if(test -d /n/newfs/dist/replica/client && test -f /n/newfs/adm/users){
		status = ''
		exit
	}
	status = '/n/newfs/dist/replica/client or /n/newfs/adm/users missing'
	exit oops
}
	


fn havedist {
	if(!(test -f $dist/$distdir/replica/plan9.db || test -f $dist/plan9.iso || test -f $dist/plan9.iso.bz2)) {
		status = 'No distribution found in '^$dist ' or '^$dist/$distdir
		exit
	}

	if(test -f $dist/$distdir/dist/replica/plan9.db) {
		bind $dist/$distdir $dist
		bind -a $dist/386/bin /bin
		bind -a $dist/rc/bin /bin
	}
}

fn isventi {
	if(cmp -s <{dd -quiet 1 -if $arg -bs 1024 -iseek 248 | dd -quiet 1 -bs 13 -count 1} <{echo 'venti config'})
		exit
	status = 'no venti config'
	exit oops
}

fn fmtventi {
	gg=()
	for(f in $ventiarena)
		if(! isventi $f)
			gg=($gg $f)
	if(! ~ $#gg 0) {
		status = 'not venti partition : ('^$"gg^')'
		exit oops
	}

	n=-1
	fmta=()
	for(a in $ventiarena){
		n=`{hoc -e 1+$n}
		if(isventiarenas $a) {
			if(~ $ventireformat yes)
				fmta=($fmta arenas$n:$a)
		}
		if not
			fmta=($fmta arenas$n:$a)
	}

	n=-1
	fmti=()
	for(a in $ventiindex) {
		n=`{hoc -e 1+$n}
		if(isventiisect $a) {
			if(~ $ventireformat yes)
				fmti=($fmti isect$n:$a)
		}
		if not
			fmti=($fmti isect$n:$a)
	}

	echo Formatting Venti arenas and indices (this takes a while).
	# do each disk in parallel
	echo good >/tmp/fmt
	dd=()
	for(a in $fmta $fmti){
		d=`{echo $a | sed 's!.*:(/.*/).*!\1!'}
		if(! ~ $d $dd)
			dd=($dd $d)
	}
	for(d in $dd){
		{
			for(a in $fmta){
				i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
				if(~ $i(2) $d){
					echo $i(3) ...
					venti/fmtarenas $i(1) $i(3) || echo bad >/tmp/fmt
					echo done with $i(3)
				}
			}
			for(a in $fmti){
				i=`{echo $a | sed 's!(.*):(/.*/)(.*)!\1 \2 \2\3!'}
				if(~ $i(2) $d){
					echo $i(3) ...
					venti/fmtisect $i(1) $i(3) || echo bad >/tmp/fmt
					echo done with $i(3)
				}
			}
		} &
	}
	wait
	if(~ bad `{cat /tmp/fmt}){
		status = 'There were errors formatting the indices and arenas.'
		exit oops
	}

	echo Done formatting Venti arenas and indices.

	v=$ventiarena(1)
	echo Storing Venti config on $v...
	{
		echo index main
		for(i in $ventiindex)
			echo isect $i
		for(a in $ventiarena)
			echo arenas $a
	} | venti/conf -w $v

	echo Initializing index...
	venti/fmtindex $v

	echo Done with Venti!
}

fn download {
	baropt='-w 145,129,445,168'
	if(! hget -vo /n/newfs/dist/_plan9.iso.bz2 $installurl/plan9.iso.bz2 |[2] bargraph $baropt 'downloading '^plan9.iso.bz2)
			exit
	mv /n/newfs/dist/_plan9.iso.bz2 /n/newfs/dist/plan9.iso.bz2
	if(~ $fstype fossil){
		echo fsys main sync >>$fscons
	}
	if(test -f /n/newfs/dist/plan9.iso.bz2) {
		mount /srv/$fossilsrv $dist
		distmediadir=/dist
	}
	if not {
		status = 'download failed'
	}
}

fn copydist {
	if(! test -d /n/dist/dist/replica) {
		status = 'missing dist/replica'
		exit
	}

	inst/watchfd applylog 0 `{ls -l /n/dist/dist/replica/plan9.log | awk '{print $6}'} 'Installing file system' &
	replica/pull -c / /rc/bin/inst/replcfg
	if(~ $status '' *conflicts || test -f /n/newfs/dist/replica/didplan9witherrors)
		>/n/newfs/dist/replica/didplan9
	if not
		>/n/newfs/dist/replica/didplan9witherrors
	if(! test -f /n/newfs/dist/replica/didplan9){
		status = 'copydist failed'
	}
}

fn add_plan9ini {
	{
		echo bootfile'='$bootfile
		echo bootargs'='$bootargs
		echo bootdisk'='$bootdisk
		echo venti'='$venti
		echo monitor'='$monitor
		echo vgasize'='$vgasize
		echo mouseport'='$mouseport
	} >/tmp/plan9.ini
}

fn init_9fat {
	if(! test -f $fat) {
		status =  'You have no 9fat partition.  Can''t setup booting.'
		exit
	}

	if(! test -f /tmp/plan9.ini) add_plan9ini

	need9fatformat=no
	if(! isfat $fat)
		need9fatformat=yes
	if not if(! mount -c /srv/dos /n/9fat $fat >[2]/dev/null)
		need9fatformat=yes
	if not if(! test -f /n/9fat/plan9.ini)
		need9fatformat=yes

	if(~ $need9fatformat yes){
		echo Initializing Plan 9 FAT partition.
		disk/format -r 2 -d -b /386/pbs $fat /n/newfs/386/9load
		# silently install pbslba if the partition is way into the disk.
		# it''s our only hope.  only need this for >8.5GB into the disk.
		# but...
		# there are so few non-LBA bioses out
		# there anymore that we'll do this even if we're only 2GB into
		# the disk.  it's just not worth the headaches of dealing with
		# crappy bioses that don't address the whole 8.5GB properly

		9fatoffset=`{grep '^part 9fat ' /dev/$disk/ctl | awk '{print $4}'}
		if(! ~ $#9fatoffset 1) {
			status =   'could not find plan 9 partition.'
			exit bad
		}
		if(test $9fatoffset -gt 2097152)	# 2GB
			disk/format -b /386/pbslba $fat

		mount -c /srv/dos /n/9fat $fat
	}

	if(! test -f /n/9fat/4e){
		cp /n/newfs/386/9load /n/9fat/9load
		cp /n/newfs/386/9pcf /n/9fat/9pcf
		if(test -f /n/9fat/plan9.ini && ! test -f /n/9fat/plan9-3e.ini)
			mv /n/9fat/plan9.ini /n/9fat/plan9-3e.ini
		if(test -f /n/9fat/9pcdisk && ! test -f /n/9fat/9pc3e)
			mv /n/9fat/9pcdisk /n/9fat/9pc3e

		awk -f /bin/inst/mkini.awk >/n/9fat/plan9.ini
		>/n/9fat/4e
	}
}


fn bootplan9 {	
	first=`{ls -p '#S' | sed 1q}
	if(! ~ $first $disk) {
		echo 'warning: The plan 9 partition is not on the boot disk,'
		echo 'so making it the active partition will have no effect.'
	}
	
	p9offset=`{grep '^part 9fat ' /dev/$disk/ctl |awk '{print $3}'}
	if(! ~ $#p9offset 1) {
		echo 'could not find plan 9 partition.'
		echo 'cannot happen'
		exit bad
	}

	dombr

	echo Setting Plan 9 partition active.
	p9part=`{disk/fdisk /dev/$disk/data >[2]/dev/null </dev/null | 
			grep PLAN9 | sed 1q | sed 's/ *(p.) .*/\1/'}
	if(~ $#p9part 0){
		echo 'You have no Plan 9 partitions (How could this happen?)' >[1=2]
		exit 'no plan 9 partition found'
	}
	p9part=$p9part(1)
	{ echo 'A '^$p9part; echo w } | disk/fdisk /dev/$disk/data >[2]/dev/null >/dev/null
	x=$status
	if(~ $x '' '|'){
		echo
		echo 'The Plan 9 partition is now marked as active.'
		exit ''
	}
	exit $x
}

fn finish {	
	echo -n 'Halting file systems...'
	
	if(ps | grep -s ' venti$')
		venti/sync -h tcp!127.0.0.1!17034
	if(ps | grep -s ' fossil$'){
		echo fsys all halt >>$fscons
		slay fossil|rc
	}
}

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].