Vmware playground for plan9

0 - WHAT WILL YOU GET

With that i will practice distributed programming with plan9 using one computer connected to internet.

It would be better if you try to install a terminal and play a bit with it, to get used to use the plan9 environment properly.

And even better if you have a couple of supported machines to see the real thing :=)

1 - INSTALL YOUR VMWARE_LIKE SOFTWARE

The following considerations must be done prior to select a virtual machine software:

I choosed vmware 4.5.2 as its support all of the above and it is supported by Plan9 graphics system.

The vmware 5.0 machine can be used but the install process must be done using text only, so if you're not proficent with ed, you better choose 4.5.2.

qemu can be used as well but i know nothing about it, so may be someone wants to make this brief more complete.

2 - INSTALLING THE FIRST VIRTUAL MACHINE

Here we select fossil+venti as we first will set up a standalone plan9 auth/cpu/file server.

Later we split that in different machines

I suggest you to use the default partition layout and default slices layout.

You should be able to do it without more indications as the installation program is intuitive enough.

3 - BOOT AND INITIAL SET UP

At this moment fossil will start the first snapshot to venti so disk will be crazy for a little while.

Take a coffe in the mean while, and later follow with the configuration instructions.

	% con /srv/fscons 
	prompt: fsys main 
	main: uname sys +glenda 
	main: uname adm + glenda
ipnet=devel.net ip=192.168.1.1 ipmask=255.255.255.0 
	ipgw=192.168.1.1
	dns=130.206.1.3 
	fs=kenshin 
	auth=kenshin 
	authdom=lloth.net

sys=kenshin ip=192.168.1.200 ether=000c29a15062
	dom=kenshin.devel.net 
	bootf=/386/9pccpuf 
	proto=il
	% ip/ipconfig -g 192.168.1.1 ether /net/ether0 192.168.1.200 255.255.255.0 
	% echo refresh > /net/cs 
	% echo refresh > /net/dns 
	% ip/ping www.google.com

If you can't reach google look through the wiki and 9fans archives to configure your network.

	% pull -v
	% cd /sys/src/9/pc 
	% mk 'CONF=pccpuf' install 
	% 9fat: 
	% cp 9pccpuf.gz /n/9fat/ 
	% acme /n/9fat/plan9.ini set the bootfile to 9pccpuf.gz
	% acme /rc/bin/cpurc

Put the ip/ipconfig line to boot with network configured before the ndb/cs line and uncomment the lines marked as needed for booting other systems and for auth servers

	% echo blah > /dev/sdC0/nvram
	% cp /adm/timezone/CET /adm/timezone/local
	% con /srv/fscons 
	prompt: fsys main 
	main: uname bootes bootes 
	main: uname sys +bootes 
	main: uname adm +bootes 
	main: uname sys -glenda
	main: uname adm -glenda

4. FIRST BOOT

	authid: bootes 
	authdom: devel.net 
	secstore: 	invent_a_secstore_password 
	password: invent_a_bootes_password
	% /sys/lib/newuser 
This will not bring you to rio
	% auth/changeuser bootes 
Put the same password you invented in the last step, you can enter the other data as you want
	c:\> drawterm-windows -a 192.168.1.200 -c 192.168.1.200 
	user[none]: bootes 
	password: you know what to put here :)

This will give you a rio environment.

5. Set up the multiboot environment

	% con /srv/fscons 
	prompt: fsys main
	main: create /active/cfg sys sys d775 
	main: % mkdir /cfg/pxe 
	% mkdir /cfg/kenshin

	#!/bin/rc
	boottime=`{date}
	boottime=$"boottime
	
	# parallelism for mk
	NPROC=`{wc -l /dev/sysstat}
	NPROC=`{echo $NPROC|sed 's/ .*//'}
	
	# get rid of need for dirs in /n
	mntgen -s slashn && chmod 666 /srv/slashn
	
	# cs sets /dev/sysname
	ndb/cs
	sysname=`{cat /dev/sysname}
	prompt=($sysname^'# ' ' ')
	
	# site specific startup
	if(test -e /rc/bin/cpurc.local)
	       . /rc/bin/cpurc.local
	
	# cpu specific startup
	if(test -e /cfg/$sysname/cpurc)
	       . /cfg/$sysname/cpurc
	
	# if we're not a server, start a dns resolver
	if(! test -e /srv/dns)
	       ndb/dns -r
	
	# reboot if we lose the file server
	aux/reboot
	
	# turn on dong's tcp port hog defense
	if( test -e /net/tcp/clone)
	       echo -n tcpporthogdefense on > /net/tcp/0/ctl
	
	# keep other bootes processes from creating capabilities
	rm '#ยค/caphash' > /dev/null >[2=1]
	
	# start up internet if we don't already have an address
	if(! grep u /net/ipselftab | grep -sv 127.0.0.1)
	       ip/ipconfig
	if(! grep -s 127.0.0.1 /net/ipselftab)
	       ip/ipconfig loopback /dev/null 127.1
	
	# start listeners if it hasn't already been done (dicey check)
	if(! netstat -n | grep -s 'tcp.*Listen.* (7|9|21|22|23|25|110|113|565|993|17007|17009|17010) .*')
	       aux/listen -q tcp
	if(! netstat -n | grep -v 17008 | grep -s il.*Listen)
	       aux/listen -q il
	
	if(! ps|grep -s timesync)
	       aux/timesync -s /net -nl -d /sys/log/timesync.d oncore achille
	
	# cpu specific startup
	if(test -e /cfg/$sysname/cpustart)
	       . /cfg/$sysname/cpustart
	
	exit 0


	#!/bin/rc

	ip/ipconfig -g 192.168.1.1 ether /net/ether0 192.168.1.200 255.255.255.0

	ndb/dns -r

	prompt=($sysname^'# ' ' ')

	aux/timesync hora.rediris.es

	ip/dhcpd ip/tftpd

	auth/keyfs -wp -m /mnt/keys /adm/keys >/dev/null >[2=1] 
	auth/cron >>/sys/log/cron >[2=1] &

	aux/listen -q -t /rc/bin/service.auth -d /rc/bin/service il
	aux/listen -q -t /rc/bin/service.auth -d /rc/bin/service tcp

	cpu% cat flproto 
	fsys main config /dev/sdC0/fossil 
	fsys main open -c 3000 
	fsys main snaptime -s 60 -a 0500 -t 2880 
	listen tcp!*!564 
	cpu% cat flproto | fossil/conf -w /dev/sdC0/fossil

6. Test the new cpurc files, so reboot the machine

If something fails, i hope the error message would be enought to let you fix the problem :)

7. Now create other virtual machine.

8. Add a new machine


sys=ant ip=192.168.1.201 ether=000c29a15062 
	dom=ant.lloth.net
	bootf=/386/9pxeload 
	proto=il

You will need to put the mac of the virtual machine so check it on your virtual machine ( in vmware set up to boot from network and copy the mac address )

Create a file ith the mac address as name

	% acme /cfg/pxe/mac

That file must contain a plan9.ini file


	bootfile=ether0!/386/9pccpu 
	bootargs=tcp!192.168.1.200!564

	*nomp=1
	 *nodumpstack=1 
	partition=new

- Create the cpurc for this machine under /cfg/ant/cpurc


	#!/bin/rc

	prompt=($sysname^'# ' ' ')

	aux/timesync hora.rediris.es

	aux/listen -q -t /rc/bin/service.auth -d /rc/bin/service il
	aux/listen -q -t /rc/bin/service.auth -d /rc/bin/service tcp

9. Boot the new cpu machine
	% disk/mbr /dev/sdC0/data 
	% disk/fdisk /dev/sdC0/data 
	>>> a p0 start
	cylinder: 0 
	end [0..208] 208 
	>>> w 
	>>> q 
	% disk/prep /dev/sdC0/plan9
	>>> a 9fat 
	start sector: 0 
	end [0..209715] 200000 
	>>> a nvram start
	sector: 200000 
	end [200000..209715] 209715 
	>>> w
	>>> q 
	% disk/fdisk -p /dev/sdC0/data > /dev/sdC0/ctl

Now we got the first machine booted from network up and running

10. Testing auth

cpu% cpu -h ant -c rc

Adding key: dom=lloth.net proto=p9sk1
user[bootes]: bootes 
password:

	cpu% cat /dev/sysname 
	antcpu%

Now that we have two machines, we can configure our prompt to show us where we are. Put this on /usr/bootes/lib/profile

	fn cd { builtin cd $1;awd; prompt=(`{cat /dev/sysname}^' '^`{pwd}^'%' ' ') }

	cpu% fn cd { builtin cd $1;awd; prompt=(`{cat /dev/sysname}^' '^`{pwd}^'% ' ' ') } 
	cpu% cd 
	kenshin /usr/bootes% acme lib/profile
	kenshin /usr/bootes% cpu -h ant -c rc 
	ant /usr/bootes% 
	ant /usr/bootes% 
	ant /usr/bootes%

Usually the path is too fancy.

11. Clone a machine and start up a new cpu server

vmware 5 will let you clone machines, so i upgraded to it. I will not explain how to clone vmware machines as may be you just used other virtualization software (or even the real hardware)

To start up a new server, when we have the machine ready, and its MAC address written somewhere is:

		/cfg/pxe/mac file
		/cfg/system_name/cpurc

I created 5 machines with 64MB of ram each one.

As terminal i will use drawterm, as i upgraded to vmware 5, and vga is not supported and there are problems with cut&paste. . .

12. Adding users to the playground

In the console of kenshin our main file server/auth/cpu we can add users as described in the wiki.

	% auth/changeuser gdiaz 
	% con/srv/fscons 
	prompt: fsys main 
	main: uname gdiaz gdiaz 
	%

Now i can drawterm with the new user

And make my first distributed application with plan9 :)


	#!/bin/rc
	
	servers=(kenshin ant shrek niki connor kirk)
	timezones=(CET EDT Canada_Pacific Japan US_Hawaii Singapore)
	
	minx=0
	miny=0
	maxx=100
	maxy=100
	i=1
	for (s in $servers) {
			echo  vars: $timezones($i), $i, $minx , $maxx
			script=''''^'cat /adm/timezone/'^$timezones($i)^' > /env/timezone; clock'^''''
			window -r $minx $miny $maxx $maxy cpu -h $s -c $script
			i = `{ echo $i+1 | bc }
			minx = `{echo $i^'*100'  | bc }
			maxx = `{echo $minx^'+'^100 | bc }		
	}