Migrating CWFS
From time to time one may wish to move a CWFS instance from one device to another. Perhaps the old device is full or faulty. Perhaps you’d just like to make a backup. In any case, the process is fairly simple.
Prepare new device
After installing the new drive and powering up the machine, the first
thing to do is identify the new device. The #S
device
indicates that the new device has been recognised.
cpu% ls '#S'
'#S/sdD0'
'#S/sdD1'
'#S/sdctl'
cpu% cat '#S/sdD0/ctl'
inquiry KINGSTON SA400S37240G
config 0040 capabilities 2F00 dma 00550020 dmactl 00550020 rwm 1 rwmctl 0 lba48always off
model KINGSTON SA400S37240G
serial 50026B768422720C
firm SBFKJ4.3
feat lba llba smart power nop ata8
geometry 468862128 512
alignment 512 0
missirq 0
sloop 0
irq 18977 30
bsy 0 0
nildrive 6
part data 0 468862128
cpu%
Next, we prepare the MBR and DOS partition table with
disk/mbr
and disk/fdisk
:
cpu% disk/mbr -m /386/mbr '#S/sdD0/data'
cpu% disk/fdisk -w -a '#S/sdD0/data'
cpu% cat '#S/sdD0/ctl'
inquiry KINGSTON SA400S37240G
config 0040 capabilities 2F00 dma 00550020 dmactl 00550020 rwm 1 rwmctl 0 lba48always off
model KINGSTON SA400S37240G
serial 50026B768422720C
firm SBFKJ4.3
feat lba llba smart power nop ata8
geometry 468862128 512
alignment 512 0
missirq 0
sloop 0
irq 20034 55
bsy 0 0
nildrive 6
part data 0 468862128
part plan9 63 468862128
cpu%
Now we can set up the plan9 partition table. I’ve chosen to elide the ‘other’ partition this time around as I’ve never used it in the entire 6 years that I’ve been using the previous filesystem.
cpu% disk/prep -w -a 9fat -a nvram -a fscache -a fsworm '#S/sdD0/plan9'
no plan9 partition table found
9fat 204800
nvram 1
fscache 78109544
fsworm 390547720
cpu%
Copy old WORM
Disable the background dump service and trigger a final dump of the old file system:
cpu% echo cwcmd startdump 0 >>/srv/cwfs.cmd
cpu% echo dump >>/srv/cwfs.cmd
There’s no point copying the entire WORM partition so let’s work out
how much of it needs to be copied using the statw
command:
cpu% con -C /srv/cwfs.cmd
statw
cwstats main
filesys main
maddr = 3
msize = 5147
caddr = 518
csize = 694845
sbaddr = 1668338
craddr = 1697494 1697494
roaddr = 1697497 1697497
fsize = 1697599 1697599 0+48%
slast = 1668081
snext = 1697498
wmax = 1697497 0+48%
wsize = 3484185 1+ 0%
223247 none
8903 dirty
0 dump
461561 read
1134 write
0 dump1
cache 5% full
So we need only copy fsize
16K blocks. We can use
dd(1)
to do so, but please, double and triple check the
order of your arguments before running this command!
cpu% dd -if '#S/sdD1/fsworm' -of '#S/sdD0/fsworm' -bs 16k -count 1697599
cpu%
This will likely take quite some time. In the example above, copying 1697599*16K ≈ 25G took around 10 minutes or so.
Bring up new FS
cpu% bind -a '#S' /dev
cpu% cwfs64x -n newcwfs -f /dev/sdD0/fscache -C -c
config: service cwfs
config: config /dev/sdD0/fscache
config: filsys main c(/dev/sdD0/fscache)(/dev/sdD0/fsworm)
config: filsys dump o
config: recover main
config: end
checktag pc=20eb0f n(3) tag/path=Tnone/0; expected Tsuper/2
current fs is "main"
11 uids read, 7 groups used
63-bit cwfs as of Mon Nov 9 20:51:45 2020
last boot Sat Nov 28 14:34:23 2020
cpu%
You can now mount the new filesystem:
cpu% mount /srv/newcwfs /n/newroot
cpu% mount /srv/newcwfs /n/newdump dump
cpu%
Copy 9fat and nvram
The last thing to do is to copy the 9fat and nvram partitions from your old disk to the new one. This is trivial:
cpu% cp '#S/sdD1/9fat' '#S/sdD1/nvram' '#S/sdD0'
cpu%
You should now be able reboot from the new disk.