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