When a System Dies; Getting back in operation again.

Jonathan McKeown j.mckeown at ru.ac.za
Mon May 4 08:31:20 UTC 2009


On Friday 01 May 2009 22:43:51 Jerry McAllister wrote:
> On Fri, May 01, 2009 at 12:07:22PM -0500, Martin McCormick wrote:
> > Let's say we have a system that is backed up regularly and it
> > vanishes in a puff of smoke one day. One can get FreeBSD
> > installed on a new drive in maybe half an hour or so but we also
> > need to get back to the right patch level and then we can say we
> > are back where we started.
>
> What you want to do is use the fixit image to set up the disk.
> That means fdisk and bsdlabel and newfs it.   You can actually
> use sysinstall to do this as well.  Just let the installer come
> up and do the disk stuff, choose minimal install and then after
> it finishes making the disks, kill the rest of the install (or
> just let it finish and then overwrite it.
>
> But, I find it actually easier to do the fdisk, bsdlabel and newfs-s
> myself.  But, then I am used to it.
>
> Right after you get done making sure where your fixit is living,
> then use fdisk and bsdlabel to check for the way you have the disk
> set up currently.   Write it down or print it out and keep it
> near that installation/fixit disk.

[Lots of good stuff about creating the partitions]

> Now all you have to do is newfs each partition.   Just take the
> defaults.   Remember that newfs wants the full device spec, not
> just the drive identifier.

If you have kept the right information beforehand, you can actually restore 
your dumps onto ``bare metal'' without doing a partial install first, and 
with the same newfs settings for each partition as you originally had. You 
need to use bsdlabel and dumpfs -m and keep the output for rebuilding. The 
rest of this message is the details.

On your running system, create and keep two files. My system has one slice, 
ad6s1, and the usual partitions - a for root, d for /tmp, e for /var, f 
for /usr, and I've shown the commands you need, and the resulting file 
contents on my current system, below:

bsdlabel ad6s1 >ad6s1.label

ad6s1.label contains:

# /dev/ad6s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  1048576        0    4.2BSD     2048 16384     8
  b:  8388608  1048576      swap
  c: 156296322        0    unused        0     0         # "raw" part, don't 
edit
  d: 20971520  9437184    4.2BSD     2048 16384 28552
  e:  1048576 30408704    4.2BSD     2048 16384     8
  f: 124839042 31457280    4.2BSD     2048 16384 28552

I usually put all the spare space on a disk into /usr, so changing the first 
field on the f: line (the size) from 124839042 to * tells bsdlabel to do 
exactly that in case the replacement disk is a different size from the 
original.

We now need the newfs settings for all the 4.2BSD filesystems except c, so (in 
sh syntax)

for i in a d e f; do dumpfs -m ad6s1$i; done >newfscmds.ad6s1

newfscmds.ad6s1 now contains:

# newfs command for ad6s1a (/dev/ad6s1a)
newfs -O 2 -a 8 -b 16384 -d 16384 -e 2048 -f 2048 -g 16384 -h 64 -m 8 -o 
time -s 262144 /dev/ad6s1a
# newfs command for ad6s1d (/dev/ad6s1d)
newfs -O 2 -U -a 8 -b 16384 -d 16384 -e 2048 -f 2048 -g 16384 -h 64 -m 8 -o 
time -s 5242880 /dev/ad6s1d
# newfs command for ad6s1e (/dev/ad6s1e)
newfs -O 2 -U -a 8 -b 16384 -d 16384 -e 2048 -f 2048 -g 16384 -h 64 -m 8 -o 
time -s 262144 /dev/ad6s1e
# newfs command for ad6s1f (/dev/ad6s1f)
newfs -O 2 -U -a 8 -b 16384 -d 16384 -e 2048 -f 2048 -g 16384 -h 64 -m 8 -o 
time -s 31209760 /dev/ad6s1f

take out the -s 31209760 in the command for ad6s1f (this is the size of the 
new filesystem and it defaults to the size of the partition - which we made 
to take up the rest of the disk).

Now you can save these two files somewhere. When it comes to a catastrophic 
failure and restore, boot a liveCD. Use fdisk to create your single large 
slice on the new disk with

fdisk -BI ad6

Use 

bsdlabel -R ad6s1 ad6s1.label

to restore the disklabel.

If your device name is different from before, you need to edit newfscmds.ad6s1 
to change the ad6 to the new device name wherever it occurs, but you then run 
the newfs commands in the file to create your filesystems with the same 
parameters (softupdates on/off, etc) as before.

You now have the basic structure of your previous disk, ready to have the 
root, /var/ and /usr dumps restored to make a running system identical to the 
destroyed one, with one last step:

bsdlabel -B ad6s1

to put the boot code on the slice. (I haven't tried this bit, so if you're 
going to use the boot code from your root partition, which is stored 
at /boot/boot, you'll need to check whether you can run bsdlabel -B on a 
mounted disk. If you can, the command would be

bsdlabel -B -b /mnt/boot/boot /dev/ad6s1

assuming you mounted /dev/ad6s1a on /mnt).

If you have a different device name, of course, you also need to edit your 
fstab before rebooting.

Jonathan


More information about the freebsd-questions mailing list