#!/bin/rc # # This program clones a Raspberry Pi Plan9 installation onto another storage device. # Use a USB adapter for SD cards in order to write another SD card. # The storage device will be used at its full capacity, in contrast to the downloadable image. # Moreover, no additional computer is required for the installation. # # This program makes some assumptions that are specific to the Raspberry Pi device. # The only parameter is the name of the destination drive. # The program will not ask for further input. # # NOTES # # You can of course use the USB adapter for SD cards to write the downloadable image. # The bootstrap cannot access a DOS partition embedded into a Plan9 partition (9fat). # The sd(3) driver cannot serve volumes from a partition table: we use partfs(8) instead. # Con(1) needs a certain number of empty lines in the input in order to read all server answers. # fn check { if( ! ~ $1 '' ) { echo We encountered an error and must stop here. echo Status: $1. exit 13 } } if(! test $#* -eq 1) { echo Usage: '''piclone sdUY.Z''' creates a Raspberry9 system on sdUY.Z. exit } disk=$1 if(! test -d /dev/$disk) { echo No such device: $disk. exit } # Make shure there is no disk configuration left. echo ........ Null the disk configuration. dd -if /dev/zero -of /dev/$disk/data -count 1024 >[1=] >[2=] check $status # the default MBR without boot code suffices for the Pi. echo ........ Install MBR. disk/mbr /dev/$disk/data >[1=] >[2=] check $status # We need a real DOS partition. # The Raspberry Pi boot mechanism cannot cope with the 9FAT partition embedded in the plan9 one. echo ........ Create DOS partition for booting. disk/fdisk -b /dev/$disk/data >[1=] >[2=] <[1=] >[2=] check $status # sd(3) does not serve disk partitions: use partfs(8). if( ! test -e /dev/$disk/dos ) { echo ........ Start partfs to serve partitions. disk/partfs -d $disk /dev/$disk/data >[1=] >[2=] check $status } echo ........ Reconfigure device. disk/fdisk -p /dev/$disk/data >/dev/$disk/ctl >[2=] check $status echo ........ Plan9 partition: install MBR. disk/mbr /dev/$disk/plan9 >[1=] >[2=] check $status echo ........ Plan9 partition: subdivide. disk/prep -wb -a nvram -a fossil /dev/$disk/plan9 >[1=] >[2=] check $status echo ........ Plan9 partition: reconfigure device. disk/prep -p /dev/$disk/plan9 >/dev/$disk/ctl >[2=] check $status echo Partitions on $disk: cat /dev/$disk/ctl echo ........ Format DOS partition. disk/format -d -r2 /dev/$disk/dos >[1=] >[2=] check $status echo ........ Format Fossil partition. fossil/flfmt -y /dev/$disk/fossil >[1=] >[2=] check $status if( ! test -e /srv/dos ){ echo ........ Start DOS server. dossrv >[1=] >[2=] check $status } echo ........ Start server for old Fossil partition. cat >/env/flproto <[1=] >[2=] check $status echo ........ Start server for new Fossil partition. cat >/env/flproto <[1=] >[2=] check $status echo ........ Mount old DOS partition. mount -c /srv/dos /n/dos.old /dev/sdM0/dos >[1=] >[2=] check $status echo ........ Mount new DOS partition. mount -c /srv/dos /n/dos.new /dev/$disk/dos >[1=] >[2=] check $status echo ........ Mount old Fossil partition. mount -c /srv/fossil.old /n/fossil.old >[1=] >[2=] check $status echo ........ Mount new Fossil partition. mount -c /srv/fossil.new /n/fossil.new >[1=] >[2=] check $status echo ........ Create users file on new Fossil partition. # create default con /srv/fscons.new >[1=] >[2=] <[1=] >[2=] <[1=] >[2=] check $status echo ........ Copy system: please be VERY patient. disk/mkfs -a -s /n/fossil.old /sys/lib/sysconfig/proto/allproto | disk/mkext -u -v -d /n/fossil.new >[2=1] | tee /tmp/xxx echo ........ Status: $status. echo ........ Unmount old DOS partition. unmount /n/dos.old >[1=] >[2=] check $status echo ........ Unmount new DOS partition. unmount /n/dos.new >[1=] >[2=] check $status echo ........ Unmount old Fossil partition. unmount /n/fossil.old >[1=] >[2=] check $status echo ........ Stop server for old Fossil partition. con /srv/fscons.old >[1=] >[2=] <[1=] >[2=] check $status echo ........ Stop server for new Fossil partition. con /srv/fscons.new >[1=] >[2=] <[1=] >[2=] rm /srv/fossil.old >[1=] >[2=] rm /srv/fscons.old >[1=] >[2=] rm /srv/fossil.new >[1=] >[2=] rm /srv/fscons.new >[1=] >[2=] echo ........ Write persistent Fossil configuration. fossil/conf -w /dev/$disk/fossil >[1=] >[2=] <