Initial check in

This commit is contained in:
ccurley 2002-01-20 22:44:17 +00:00
parent 83c21c9762
commit e233e685ac
14 changed files with 1173 additions and 0 deletions

View File

@ -0,0 +1,157 @@
# a makefile for generating the Bare Metal Recovery HOW-TO
# Time-stamp: <2002-01-07 12:28:00 ccurley Makefile>
# All the scripts we incorporate into the HOWTO
SCRIPTS = cooked/back.up.all cooked/back.up.all.ssh cooked/dev.hda cooked/get.tester cooked/make.dev.hda cooked/make.fdisk cooked/restore.all cooked/restore.all.ssh cooked/restore.metadata cooked/restore.tester cooked/save.metadata
ILLOS = tomsrtbt.eps
# The base name of the document
DOCUMENT = Linux-Complete-Backup-and-Recovery-HOWTO
# The install directory. This will be mirrored to the web server
INSTALL = /home/ccurley/public_html/public/$(DOCUMENT)
# Some style sheet selections. Note the escapes for the \ and the #.
indexdsl = -d /usr/share/sgml/docbook/dsssl-stylesheets/ldp.dsl
dslhtml = -d /usr/share/sgml/docbook/dsssl-stylesheets/ldp.dsl\\\#html
dslprint = -d /usr/share/sgml/docbook/dsssl-stylesheets/ldp.dsl\\\#print
cooked:
mkdir cooked $(DOCUMENT) $(DOCUMENT).junk
clean:
-rm -r $(DOCUMENT) $(DOCUMENT).[a-r]* $(DOCUMENT).[t-z]* $(DOCUMENT).smooth.html cooked *.eps ../images
mkdir cooked $(DOCUMENT) $(DOCUMENT).junk
cooked/back.up.all: scripts/back.up.all
./buildscript back.up.all
cooked/back.up.all.ssh: scripts/back.up.all.ssh
./buildscript back.up.all.ssh
cooked/dev.hda: scripts/dev.hda
./buildscript dev.hda
cooked/get.tester: scripts/get.tester
./buildscript get.tester
cooked/make.dev.hda: scripts/make.dev.hda
./buildscript make.dev.hda
cooked/make.fdisk: scripts/make.fdisk
./buildscript make.fdisk
cooked/restore.all: scripts/restore.all
./buildscript restore.all
cooked/restore.all.ssh: scripts/restore.all.ssh
./buildscript restore.all.ssh
cooked/restore.metadata: scripts/restore.metadata
./buildscript restore.metadata
cooked/restore.tester: scripts/restore.tester
./buildscript restore.tester
cooked/save.metadata: scripts/save.metadata
./buildscript save.metadata
scripts: $(SCRIPTS)
tomsrtbt.eps: tomsrtbt.png
convert tomsrtbt.png tomsrtbt.eps
$(DOCUMENT)/index.html: $(DOCUMENT).sgml scripts
rm -r $(DOCUMENT).junk
mv $(DOCUMENT) $(DOCUMENT).junk
mkdir $(DOCUMENT)
cd $(DOCUMENT) ; /usr/bin/jade -t sgml -i html $(indexdsl) $(dslhtml) ../$(DOCUMENT).sgml
# cp -rp *.png $(DOCUMENT)
# cp -rp images $(DOCUMENT)
# this target makes is easier to type as a target name. OK, I'm lazy.
chunky: $(DOCUMENT)/index.html
$(DOCUMENT).smooth.html: $(DOCUMENT).sgml scripts
/usr/bin/jade -V nochunks -t sgml -i html $(indexdsl) $(dslhtml) $(DOCUMENT).sgml > $(DOCUMENT).smooth.html
cp -rp images ..
smooth: $(DOCUMENT).smooth.html
html: chunky smooth
$(DOCUMENT).rtf: $(DOCUMENT).sgml scripts
jade -t rtf -V rtf-backend $(dslprint) $(DOCUMENT).sgml
rtf: $(DOCUMENT).rtf
$(DOCUMENT).tex: $(DOCUMENT).sgml scripts
jade -t tex -V tex-backend $(dslprint) $(DOCUMENT).sgml
tex: $(DOCUMENT).tex
# It seems to be necessary to run this thrice in order to get the TOC
# to work correctly. I don't understand it either.
$(DOCUMENT).dvi: $(DOCUMENT).tex scripts
jadetex $(DOCUMENT).tex
jadetex $(DOCUMENT).tex
jadetex $(DOCUMENT).tex
dvi: $(DOCUMENT).dvi
$(DOCUMENT).ps: $(DOCUMENT).dvi scripts
dvips -f $(DOCUMENT).dvi -o $(DOCUMENT).ps # -The 1.5cm,3cm ?? We don't need this, but non-US might.
ps: $(DOCUMENT).ps
# $(DOCUMENT).pdf: $(DOCUMENT).ps scripts
# ps2pdf $(DOCUMENT).ps
# It seems to be necessary to run this thrice in order to get the TOC
# to work correctly, and to get the TOC into to the bookmarks panel on
# the left side of the acroread reader. I don't understand it either.
$(DOCUMENT).pdf: $(DOCUMENT).tex scripts
pdfjadetex $(DOCUMENT).tex
pdfjadetex $(DOCUMENT).tex
pdfjadetex $(DOCUMENT).tex
pdf: $(DOCUMENT).pdf
all: html rtf tex dvi ps pdf
ship: all
# The chunky version for on-line viewing
-rm -r $(INSTALL) $(INSTALL)/../images
cp -rp $(DOCUMENT) $(INSTALL)/
cp -rp images $(INSTALL)/..
# PDF and PS versions for download
cp -p $(DOCUMENT).pdf $(DOCUMENT).ps $(INSTALL)/
bzip2 -9 $(INSTALL)/$(DOCUMENT).ps
bzip2 -9 $(INSTALL)/$(DOCUMENT).pdf
# Smooth version for download
tar -cvf $(DOCUMENT).smooth.html.tar $(DOCUMENT).smooth.html
bzip2 -9 $(DOCUMENT).smooth.html.tar
mv $(DOCUMENT).smooth.html.tar.bz2 $(INSTALL)/
# Chunky version for download
tar -cvf $(DOCUMENT).chunky.html.tar $(DOCUMENT)
bzip2 -9 $(DOCUMENT).chunky.html.tar
mv $(DOCUMENT).chunky.html.tar.bz2 $(INSTALL)/
# The source for download
cd .. ; tar -cvf $(DOCUMENT).tar $(DOCUMENT)/README `find $(DOCUMENT)/scripts ! -name "*~" ! -type d ` $(DOCUMENT)/$(DOCUMENT).sgml $(DOCUMENT)/buildscript $(DOCUMENT)/Makefile $(DOCUMENT)/images
cd .. ; bzip2 -9 $(DOCUMENT).tar
cd .. ; mv $(DOCUMENT).tar.bz2 $(INSTALL)/
ls -l $(INSTALL)
install: ship

View File

@ -0,0 +1,27 @@
Time-stamp: <2002-01-20 15:38:33 ccurley README>
This directory has the SGML source and related files for the Linux
Complete Backup and Recovery HOWTO. It should have everything you need
by way of source to build the HOWTO in various formats such as pdf,
HTML and TeX.
Run make with no arguments. That will build some directories for
you. Then you can run "make all" to build the whole kazoo, or "make
html" to build just the html files, etc. For a complete list of the
available targets, see the file Makefile.
The original scripts are in the subdirectory scripts. They are exactly
as I use them on my test environment, and with the small amount of
editing described in the HOWTO they should be ready for you to
use. They are here so that the SGML source for the HOWTO can
incorporate them by inclusion, rather like C's "#include". Before the
SGML translator code can use the scripts, some SGML cruft has to be
added to each one. The script "buildscripts" does that. It is called
from the makefile, so you shouldn't have to be concerned with it. The
cooked scripts end up in the directory "cooked".
The target "clean" gets rid of intermediate files like the cooked
scripts and all of the final production. Use it to be sure you have
killed off any intermediate cruft.
Enjoy. Happy backing up.

View File

@ -0,0 +1,23 @@
#!/bin/bash
# Time-stamp: <2001-11-18 09:34:08 ccurley buildscript>
script=$1
# If the actual script exists, and
if [ -e scripts/$script ]; then
# echo "Target $script exists"
# if it is newer than the "cooked" version, or the cooked version
# does not exist, we add in the SGML source, producing the cooked
# version.
if [ scripts/$script -nt cooked/$script ] || [ ! -e cooked/$script ] ; then
echo "rebuilding $script"
echo -n '<![ CDATA [' > cooked/$script
cat scripts/$script >> cooked/$script
echo ']]>' >> cooked/$script
fi
fi

View File

@ -0,0 +1,45 @@
#! /bin/sh
# Back up the entire system to another computer's drive. To make this
# work, we need a convenient chunk of disk space on the remote computer we
# can nfs mount as /mnt/save.
# Time-stamp: <2001-11-19 09:19:35 ccurley back.up.all>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
save="/mnt/save"
# Make sure it's there
umount $save
mount $save
cd /
rm $save/tester.tar.old.gz
mv $save/tester.tar.gz $save/tester.tar.old.gz
# save everything except /mnt, /proc, and nfs mounted directories.
time tar cf - / --exclude /mnt --exclude /proc --exclude $save\
| gzip -c > $save/tester.tar.gz

View File

@ -0,0 +1,42 @@
#! /bin/sh
# Back up the entire system to another computer's drive. To make this
# work, we need a convenient chunk of disk space on the remote
# computer. This version uses ssh to do its transfer, and compresses
# using bz2. This means this script has to know more about the other
# computer, which does not make for good modularization.
# Time-stamp: <2001-11-19 09:19:48 ccurley back.up.all.ssh>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
save="/backs/tester"
backup_server="charlesc"
# rotate the old backups. Do it all in one line to minimze authentication overhead.
ssh $backup_server "rm $save/tester.tar.old.bz2; mv $save/tester.tar.bz2 \
$save/tester.tar.old.bz2"
# save everything except /mnt, /proc, and squid directories.
time tar cf - / --exclude /mnt --exclude /proc --exclude /var/spool/squid\
| ssh $backup_server "bzip2 -9 > $save/tester.tar.bz2"

View File

@ -0,0 +1,33 @@
n
p
1
1
29
t
1
6
a
1
n
p
2
30
44
n
e
3
45
1023
n
l
45
944
n
l
945
1023
t
6
82
v
w

View File

@ -0,0 +1,74 @@
#! /bin/sh
# Back up another computer's drive to this system. To make this work, we
# need a convenient chunk of disk space on this computer. This version
# uses ssh to do its transfer, and compresses using bz2. This version was
# developed so that the system to be backed up won't be authenticated to
# log onto the backup computer. This script is intended to be used on a
# firewall. You don't want the firewall to be authenticated to the backup
# system in case the firewall is cracked.
# Time-stamp: <2001-11-19 09:20:06 ccurley get.tester>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
# The host name of the computer to be backed up.
target=tester
echo Backing up $target
echo Aging the ZIP disk backups.
rm -r $target.oldzip
mv $target.zip $target.oldzip
ssh $target "modprobe ppa ; mount -r /mnt/zip"
echo Copying the ZIP disk.
# -r for recursive copy, -p to preserve times and permissions, -q for
# -quiet: no progress meter.
scp -qpr $target:/mnt/zip $target.zip
echo Testing the results.
find . -iname "*.gz" | xargs gunzip -t
ssh $target "eject $zip"
echo Aging the archives
rm $target.tar.old.bz2
mv $target.tar.bz2 $target.tar.old.bz2
echo Backing up $target to the backup server.
ssh $target tar -cf - / --exclude /mnt --exclude /proc --exclude /var/spool/squid\
| bzip2 -9 | cat > $target.tar.bz2
echo Testing the results.
find . -iname "*.bz2" | xargs bunzip2 -t

View File

@ -0,0 +1,62 @@
#! /bin/sh
# A script to restore the partition data of a hard drive and format
# the partitions. Created at bare metal backup time by the Perl script
# make.fdisk.
# Copyright 2001 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
dd if=/dev/zero of=/dev/hda bs=512 count=2
sync
fdisk /dev/hda < dev.hda
sync
echo
echo formatting and checking /dev/hda1
mkdosfs -c /dev/hda1
# restore FAT boot sector.
dd if=dev.hda1 of=/dev/hda1 bs=512 count=1
echo
echo formatting and checking /dev/hda2
badblocks -c 128 -o /tmp/dev.hda2 /dev/hda2
mke2fs -L /boot -l /tmp/dev.hda2 /dev/hda2
echo
echo formatting and checking /dev/hda5
badblocks -c 128 -o /tmp/dev.hda5 /dev/hda5
mke2fs -L / -l /tmp/dev.hda5 /dev/hda5
mkswap -c /dev/hda6
# / is the mountpoint for /dev/hda5.
mkdir /target/
mount /dev/hda5 /target/
# /boot is the mountpoint for /dev/hda2.
mkdir /target/boot
mount /dev/hda2 /target/boot

View File

@ -0,0 +1,419 @@
#! /usr/bin/perl
# A perl script to create a script and input file for fdisk to
# re-create the partitions on the hard disk, and format the Linux and
# Linux swap partitions. The first parameter is the fully qualified
# path of the device of the hard disk, e.g. /dev/hda. The two
# resulting files are the script make.dev.x and the data file dev.x
# (where x is the hard drive described, e.g. hda, sdc). make.dev.x is
# run at restore time to rebuild hard drive x, prior to running
# restore.metadata. dev.x is the input file for fdisk.
# Time-stamp: <2001-12-13 15:41:24 ccurley make.fdisk>
# Copyright 2001 through the last date of modification Charles Curley
# except for the subroutine cut2fmt.
# cut2fmt Copyright (c) 1998 Tom Christiansen, Nathan Torkington and
# O'Reilly & Associates, Inc. Permission is granted to use this code
# freely EXCEPT for book publication. You may use this code for book
# publication only with the explicit permission of O'Reilly &
# Associates, Inc.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# In addition, as a special exception, Tom Christiansen, Nathan
# Torkington and O'Reilly & Associates, Inc. give permission to use
# the code of this program with the subroutine cut2fmt (or with
# modified versions of the subroutine cut2fmt that use the same
# license as the subroutine cut2fmt), and distribute linked
# combinations including the two. You must obey the GNU General
# Public License in all respects for all of the code used other than
# the subroutine cut2fmt. If you modify this file, you may extend
# this exception to your version of the file, but you are not
# obligated to do so. If you do not wish to do so, delete this
# exception statement and the subroutine cut2fmt from your version.
# You can also contact the Free Software Foundation at http://www.fsf.org/
# Changes:
# 2001 11 25: Changed the way mke2fs gets its bad block
# list. badblocks does not guess at the block size, so you have to get
# it (from dumpe2fs) and feed it to badblocks. It is simpler to just
# have mke2fs call badblocks, but you do loose the ability to have a
# writing test easily. -- C^2
# 2001 11 25: Changed the regex that extracts partition labels from
# the mount command. This change does not affect the results at all,
# it just makes it possible to use Emacs' perl mode to indent
# correctly. I just escaped the left bracket in the regex. -- C^2
# Discussion:
# fdisk will spit out a file of the form below if you run it as "fdisk
# -l".
# root@tester ~/bin $ fdisk -l /dev/hda
# Disk /dev/hda: 64 heads, 63 sectors, 1023 cylinders
# Units = cylinders of 4032 * 512 bytes
# Device Boot Start End Blocks Id System
# /dev/hda1 1 9 18112+ 83 Linux
# /dev/hda2 10 1023 2044224 5 Extended
# /dev/hda5 10 368 723712+ 83 Linux
# /dev/hda6 369 727 723712+ 83 Linux
# /dev/hda7 728 858 264064+ 83 Linux
# /dev/hda8 859 989 264064+ 83 Linux
# /dev/hda9 990 1022 66496+ 82 Linux swap
# What fdisk does not do is provide output suitable for later
# importing into fdisk, a la sfdisk. This script parses the output
# from fdisk and creates an input file for fdisk. Use the input file
# like so:
# fdisk /dev/hdx < dev.hdx
# For the bare metal restore package, this script also builds a script
# that will execute the above command so you can run it from your zip
# disk. Because the bare metal restore scripts all are in /root/bin,
# the data file and script created by this script are also placed
# there. The same script also creates appropriate Linux file systems,
# either ext2fs, or Linux swap. There is limited support for FAT12 and
# FAT16. There is no support right now (hint, hint) for FAT32. For
# anything else, you're on your own.
# Note for FAT32: According to the MS KB, there are more than one
# reserved sectors for FAT32, usually 32, but it can vary. Do a search
# in M$'s KB for "boot sector" or BPB for the gory details. For more
# info than you really need on how boot sectors are used, see
# http://support.microsoft.com/support/kb/articles/Q140/4/18.asp
# You can also edit dev.x to change the sizes of partitions. Don't
# forget, if you change the size of a FAT partition across the 32MB
# boundary, you need to change the type as well! Run "fdisk /dev/hda"
# or some such, then the l command to see the available partition
# types. Then go ahead and edit dev.x appropriately. Also, when moving
# partition boundarys with hand edits, make sure you move both logical
# and extended partition boundaries appropriately.
# Bad block checking right now is a quick read of the partition. A
# writing check is also possible but more difficult. You have to run
# badblocks as a separate command, and pass the bad block list to
# mke2fs in a file (in /tmp, which is a ram disk). You also have to
# know how large the blocks are, which you learn by running
# dumpe2fs. It gets messy and I haven't done it yet. You probably
# don't need it for a new hard drive, but if you have had a hard drive
# crash on you and you are reusing it (while you are waiting for its
# replacement to come in, I presume), then I highly recommend it. Let
# me know how you do it.
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
# cut2fmt figures out the format string for the unpack function we use
# to slice and dice the output from fdisk. From Christiansen and
# Torkington, Perl Cookbook 5.
sub cut2fmt {
my (@positions) = @_;
my $template = '';
my $lastpos = 1;
foreach $place (@positions) {
$template .= "A" . ($place - $lastpos) . " ";
$lastpos = $place;
}
$template .= "A*";
return $template;
}
# Provide a default device.
if ( $ARGV[0] == "" ) {
$device="/dev/hda";
} else {
$device=$ARGV[0];
}
# print "Device is $device.\n";
# prepare format string.
$fmt = cut2fmt (11, 19, 24, 34, 45, 49);
# print "Format string is $fmt.\n\n";
# define fields in the array @_.
$dev = 0;
$bootable = 1;
$firstcyl = 2;
$lastcyl = 3;
$parttype = 5;
$partstring = 6;
$target = "\/target";
$outputfilename = $device;
$outputfilename =~ s/\//./g;
$outputfilename = substr ($outputfilename, 1, 100);
$outputfilepath = "\/root\/bin\/";
# Make a hash of the labels.
$mpid = open (MOUNT, "mount -l |") or die "Couldn't fork: $!\n";
while (<MOUNT>) {
if ($_ =~ /^$device/i) { # is this a line with a partition in it?
# print $_; # print it just for grins
split;
if ($_[6] ne "") { # only process if there actually is a label
$_[6] =~ s/[\[\]]//g; # strike [ and ].
$labels{$_[0]} = $_[6];
# print "The label of file device $_[0] is $labels{$_[0]}.\n";
}
# We only mount if it's ext2fs and read and write.
if ($_[4] eq "ext2" and $_[5] eq "(rw)" ) {
$mountpoints{$_[2]} = $_[0];
# print "$_[2] is the mountpoint for $mountpoints{$_[2]}.\n";
}
}
}
close (MOUNT);
$fpid = open (FDISK, "fdisk -l $device |") or die "Couldn't fork: $!\n";
open (OUTPUT, "> $outputfilepath${outputfilename}")
or die "Couldn't open output file $outputfilepath${outputfilename}.\n";
while (<FDISK>) {
if ($_ =~ /^$device/i) { # is this a line with a partition in it?
# print $_; # print it just for grins
chop; # kill trailing \r
@_ = unpack ($fmt, $_);
# now strip white spaces from cylinder numbers
@_[$firstcyl] =~ s/[ \t]+//;
@_[$lastcyl] =~ s/[ \t]+//;
@_[$parttype] =~ s/[ \t]+//;
$partnumber = substr(@_[$dev], 8, 10); # get partition number for this line
# just for grins
# print " $partnumber, @_[$firstcyl], @_[$lastcyl], @_[$partstring]\n";
# Here we start creating the input to recreate the partition
# this line represents.
print OUTPUT "n\n";
if ($partnumber < 5) {
# primary Linux partition
if (@_[$parttype] == 83) {
print OUTPUT "p\n$partnumber\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) { # in case it's all on one cylinder
print OUTPUT "@_[$lastcyl]\n";
}
if ($labels{@_[$dev]}) { # do we have a label?
# no bad block check
# $format .= "mke2fs @_[$dev] -L $labels{@_[$dev]}\n";
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mke2fs -c -L $labels{@_[$dev]} @_[$dev]\n\n";
} else {
# $format .= "mke2fs @_[$dev]\n"; # no bad block check
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mke2fs -c @_[$dev]\n\n";
}
# extended partition
} elsif (@_[$parttype] == 5) {
print OUTPUT "e\n$partnumber\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
# primary Linux swap partition
} elsif (@_[$parttype] == 82) {
print OUTPUT "p\n$partnumber\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n82\n";
$format .= "mkswap -c @_[$dev]\n\n";
# primary mess-dos partition. We don't handle FAT32,
# which requires a command line switch for mkdosfs.
} elsif ( @_[$parttype] == 1 || @_[$parttype] == 4 || @_[$parttype] == 6 ) {
print ("dd if=@_[$dev] of=$outputfilepath$outputfilename$partnumber");
print (" bs=512 count=1\n");
system ("dd if=@_[$dev] of=$outputfilepath$outputfilename$partnumber bs=512 count=1");
print OUTPUT "p\n$partnumber\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) { # in case it's all on one cylinder
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n@_[$parttype]\n";
# $format .= "mkdosfs @_[$dev]\n"; # no bad block check
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mkdosfs -c @_[$dev]\n";
$format .= "# restore FAT boot sector.\n";
$format .= "dd if=$outputfilename$partnumber of=@_[$dev] bs=512 count=1\n\n";
} else {
# anything else partition
print OUTPUT "p\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n@_[$parttype]\n";
}
} else {
# logical Linux partition
if (@_[$parttype] == 83) {
print OUTPUT "l\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
if ($labels{@_[$dev]}) { # do we have a label?
# no bad block check
# $format .= "mke2fs @_[$dev] -L $labels{@_[$dev]}\n";
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mke2fs -c -L $labels{@_[$dev]} @_[$dev]\n\n";
} else {
# $format .= "mke2fs @_[$dev]\n"; # no bad block check
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mke2fs -c @_[$dev]\n\n";
}
# logical Linux swap partition
} elsif (@_[$parttype] == 82 ) {
print OUTPUT "l\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n82\n";
$format .= "mkswap -c @_[$dev]\n\n";
# primary mess-dos partition. We don't handle FAT32,
# which requires a command line switch for mkdosfs.
} elsif ( @_[$parttype] == 1 || @_[$parttype] == 4 || @_[$parttype] == 6 ) {
print ("dd if=@_[$dev] of=$outputfilepath$outputfilename$partnumber");
print (" bs=512 count=1\n");
system ("dd if=@_[$dev] of=$outputfilepath$outputfilename$partnumber bs=512 count=1");
print OUTPUT "p\n$partnumber\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) { # in case it's all on one cylinder
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n@_[$parttype]\n";
# $format .= "mkdosfs @_[$dev]\n"; # no bad block check
$format .= "echo\necho formatting and checking @_[$dev]\n";
$format .= "mkdosfs -c @_[$dev]\n";
$format .= "# restore FAT boot sector.\n";
$format .= "dd if=$outputfilename$partnumber of=@_[$dev] bs=512 count=1\n\n";
} else {
# anything else partition
print OUTPUT "l\n@_[$firstcyl]\n";
if (@_[$firstcyl] ne @_[$lastcyl]) {
print OUTPUT "@_[$lastcyl]\n";
}
print OUTPUT "t\n$partnumber\n@_[$parttype]\n";
}
}
# handle bootable partitions
if (@_[$bootable] =~ /\*/) {
print OUTPUT "a\n$partnumber\n";
}
}
}
print OUTPUT "v\nw\n";
close (OUTPUT);
close (FDISK);
open (OUTPUT, "> ${outputfilepath}make.$outputfilename")
or die "Couldn't open output file ${outputfilepath}make.$outputfilename.\n";
print OUTPUT <<FINIS;
#! /bin/sh
# A script to restore the partition data of a hard drive and format
# the partitions. Created at bare metal backup time by the Perl script
# make.fdisk.
# Copyright 2001 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
FINIS
# Clean the old partition table out.
print OUTPUT "dd if=/dev/zero of=$device bs=512 count=2\n\nsync\n\n";
print OUTPUT "fdisk $device \< $outputfilename\n\nsync\n\n";
print OUTPUT $format;
# Now build the mount points on the root and other partitions.
# We have a hash of mount points and devices in %mountpoints. However,
# we have to process them such that directories are built on the
# appropriate target partition. E.g. where /usr/local is on its own
# partition, we have to mount /usr before we build /usr/local. We can
# ensure this by sorting them. Shorter mount point paths will be built
# first. We can't sort a hash directly, so we use an array.
# We build commands to create the appropriate mount points and then
# mount the partitions to the mount points. This is in preparation for
# untarring the contents of the ZIP disk, done in restore.metadata.
foreach $point ( sort keys %mountpoints) {
print OUTPUT "\n# $point is the mountpoint for $mountpoints{$point}.\n";
print OUTPUT "mkdir $target$point\n";
print OUTPUT "mount $mountpoints{$point} $target$point\n";
}
close (OUTPUT);
# These scripts are dangerous & should only be visible to root.
chmod 0700, "${outputfilepath}make.$outputfilename";
chmod 0600, "${outputfilepath}$outputfilename";

View File

@ -0,0 +1,38 @@
#! /bin/sh
# A script to restore all of the data from an nfs mount. This is our final
# stage restore.
# Time-stamp: <2001-11-19 09:21:22 ccurley restore.all>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
export save="/mnt/save"
mount $save
cd /
gunzip -dc $save/tester.tar.gz | tar -xpkf -
rm /var/run/*.pid
lilo

View File

@ -0,0 +1,38 @@
#! /bin/sh
# A script to restore all of the data using ssh and bunzip2. This is
# our final stage restore.
# Copyright 2000 through the last date of modification Charles Curley.
# Time-stamp: <2001-11-19 09:21:33 ccurley restore.all.ssh>
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
save="/backs/tester/"
backup_server="charlesc"
cd /
ssh $backup_server "cat $save/tester.tar.bz2" | bunzip2 | tar -xpkf -
rm /var/run/*.pid
lilo

View File

@ -0,0 +1,68 @@
#! /bin/sh
# A script to restore the meta-data from the ZIP disk. This runs under
# tomsrtbt only after partitions have been rebuilt, file systems made,
# and mounted. It also assumes the ZIP disk has already been
# mounted. Mounting the ZIP disk read only is probably a good idea.
# Time-stamp: <2001-11-19 09:21:51 ccurley restore.metadata>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
zip="/mnt";
target="/target";
# warm fuzzies for the user.
ls -lt $zip
cd $target
# restore the archived metadata files.
for archive in $( ls $zip/*.gz ); do
echo $archive
ls -al $archive
gzip -dc $archive | tar -xf -
done
mkdir $target/proc
chmod a-w $target/proc
# build a mount point directory so we'll have it on reboot.
mkdir $target/mnt
# Build the mount points for our second stage restoration and other
# things.
mkdir $target/mnt/save
mkdir $target/mnt/zip
mkdir $target/mnt/cdrom
mkdir $target/mnt/floppy
mkdir $target/mnt/imports
# Restore the scripts we used to create the ZIP disk and the ones we will
# use to restore it. These should be the latest & greatest in case we had
# to do any editing during 1st stage restore.
cp -p $zip/root.bin/* $target/root/bin
# Now install the boot sector.
chroot $target /sbin/lilo -C /etc/lilo.conf
df -m

View File

@ -0,0 +1,35 @@
#! /bin/sh
# A script to restore all of the data to tester via ssh. This is our final
# stage restore.
# Time-stamp: <2001-11-19 09:22:01 ccurley restore.tester>
# Copyright 2000 through the last date of modification Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
# The host name of the computer to be restored.
target=tester
bunzip2 -dc $target.tar.bz2 | ssh $target "cd / ; tar -xpkf - "
ssh $target lilo

View File

@ -0,0 +1,112 @@
#! /bin/sh
# A script to save certain meta-data off to the boot partition. Useful for
# restoration.
# Time-stamp: <2001-11-19 09:18:52 ccurley save.metadata>
# Copyright 2000 through the last date of modification, Charles Curley.
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# You can also contact the Free Software Foundation at http://www.fsf.org/
# For more information contact the author, Charles Curley, at
# http://w3.trib.com/~ccurley/.
export zip="/mnt/zip";
# export save="/mnt/save";
echo "saving hard drive info"
make.fdisk /dev/hda
# back up RPM metadata
echo "Verifying RPMs."
rpm -Va > /etc/rpmVa.txt
echo "Finished verifying RPMs; now mounting the ZIP drive."
umount $zip
modprobe ppa
mount /dev/sda1
# clean it all out
rm -r $zip/*
echo "Building the ZIP drive backups."
mkdir $zip/lost+found
fdisk -l /dev/hda > $zip/fdisk.hda
ls -al /mnt > $zip/ls.mnt.txt
ls -al / > $zip/ls.root.txt
mkdir $zip/etc;
cp -p /etc/* $zip/etc
cd /
# These appear to be required so we can restore later on.
tar cf - boot | gzip -c > $zip/boot.tar.gz
tar cf - root | gzip -c > $zip/root.tar.gz
tar cf - etc | gzip -c > $zip/etc.tar.gz
tar cf - lib | gzip -c > $zip/lib.tar.gz
tar cf - usr/sbin | gzip -c > $zip/usr.sbin.tar.gz
tar cf - usr/bin | gzip -c > $zip/usr.bin.tar.gz
tar cf - sbin | gzip -c > $zip/sbin.tar.gz
tar cf - bin | gzip -c > $zip/bin.tar.gz
tar cf - dev | gzip -c > $zip/dev.tar.gz
# Now optional saves.
# arkeia specific:
tar cf - usr/knox | gzip -c > $zip/arkeia.tar.gz
# save these so we can use ssh for restore. *crack* for RH 7.0 login
# authentication.
tar cf - usr/lib/*crack* usr/lib/libz* usr/lib/libssl* usr/lib/libcrypto*\
| gzip -c > $zip/usr.lib.tar.gz
# save the scripts we used to create the zip disk and the ones we will
# use to restore it.
mkdir $zip/root.bin
cp -p /root/bin/* $zip/root.bin
rm $zip/root.bin/*~ $zip/root.bin/#*#
echo "Test our results."
find $zip -iname "*.gz" | xargs gzip -t
# Not a normal part of the process: we duplicate the ZIP disk onto an
# NFS mount elsewhere.
# echo "Backing the ZIP drive to the NFS mount."
# umount $save
# mount $save
# rm -r $save/zip
# mkdir $save/zip
# cp -pr $zip $save
df -m
eject $zip