Hi Mats,

I posted it before; unfortunately the archive doesn't save the attached files.
Here is the original post: http://9fans.net/archive/2014/08/78.

Please see the attachment for the script.

Cheers,
Dante

On 18.11.2014 22:28, Mats Olsson wrote:
Hi dante!

I would appreciate it a lot if you could send the "clone script" that
you used to clone the 9pi imate to a larger SD card. Thanks
beforehand!

Kind Regards,
Mats

2014-11-18 21:29 GMT+01:00, Richard Miller <9f...@hamnavoe.com>:
If you must use a rpi, you should strive to use it as a terminal, and
like every other Plan 9 terminal it should use the central file server
without local storage.

That would be my advice too. As an experiment, I set up a 9picpu using the SD card as local storage, working mostly as a secondary smtp and imap server. After a bit less than a year, the SD card suffered a catastrophic failure. When I say catastrophic, I mean I can't find any meaningful data
anywhere in the first 120MB or so of /dev/sdM0/data ... just
not-quite-random
looking garbage.

I can't think of any software fault that could wipe out so much of a
disk, with no respect for partition boundaries (the dos partition in
the first 64MB had not been mounted). But I also know too little about
the internals of SD cards to understand how they fail.  Maybe some
internal logical-to-physical block mapping table went bad?

Anyway, it's just one anecdotal data point, but I wouldn't be happy
running any plan 9 machine with an SD card as the main filesystem.


#!/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=] <<EOF
a p0 0 16
t p0 FAT32
A p0
w
q
EOF
check $status

echo ........ Create a Plan9 partition with default parameters.
disk/fdisk -wa /dev/$disk/data >[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 <<EOF
srv -p fscons.old
srv fossil.old
fsys main config /dev/sdM0/fossil
fsys main open -aAVP
fsys main
EOF
fossil/fossil -c '. /env/flproto' >[1=] >[2=]
check $status

echo ........ Start server for new Fossil partition.
cat >/env/flproto <<EOF
srv -p fscons.new
srv fossil.new
fsys main config /dev/$disk/fossil
fsys main open -aAVWP
fsys main
EOF
fossil/fossil -c '. /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=] <<EOF

create /active/adm adm sys d775
EOF
check $status

# copy
cp -gux /n/fossil.old/adm/users /n/fossil.new/adm/users
check $status

con /srv/fscons.new >[1=] >[2=] <<EOF

users -r /active/adm/users


EOF
check $status

echo ........ Copy boot files.
cp -gux /n/dos.old/* /n/dos.new >[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=] <<EOF
srv -d fossil.old
srv -d fscons.old
EOF
check $status

echo ........ Unmount new Fossil partition.
unmount /n/fossil.new >[1=] >[2=]
check $status

echo ........ Stop server for new Fossil partition.
con /srv/fscons.new >[1=] >[2=] <<EOF
srv -d fossil.new
srv -d fscons.new
EOF
check $status

echo ......... Kill fossil.
kill fossil | rc >[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=]  <<EOF
fsys main config
fsys main open -aAV
fsys main snaptime -a none -s 60 -t 172800
fsys main
users -r /active/adm/users
EOF
check $status

echo ........ DONE

Reply via email to