8.3. Программы резервного копирования

Тремя основными программами являются dump(8), tar(1) и cpio(1).

8.3.1. Dump и Restore

dump(8) и restore(8) являются традиционными для Unix программами резервного копирования. Они работают с приводом как с набором дисковых блоков, которые расположены ниже понятий файлов, связей и каталогов, создаваемых файловыми системами. Программа dump(8) выполняет резервное копирование устройств, целых файловых систем, но не частей файловой системы и не деревьев каталогов, которые располагаются более чем в одной файловой системе при помощи символических ссылок ln(1) или монтирования одной файловой системы в другой. Утилита dump(8) не записывает на ленту файлы и каталоги, она записывает блоки данных, из которых строятся файлы и каталоги. В программе dump(8) имеются некоторые неудобства, оставшиеся от ее ранних дней в составе Version 6 операционной системы ATT Unix (около 1975). Параметры, используемые по умолчанию, подходят для 9-дорожечных лент (6250 bpi), но не для современных носителей с высокой плотностью записи информации (до 62,182 ftpi). Для использования емкостей нынешних накопителей на магнитной ленте эти параметры могут быть заданы в командной строке.

rdump(8) и rrestore(8) предназначены для резервного копирования данных по сети на накопитель, подключенный к другому компьютеру. Обе программы используют в работе rcmd(3) и ruserok(3) для доступа к накопителю на магнитной ленте на удаленном компьютере. Поэтому пользователь, выполняющий резервное копирование, должен иметь доступ к удаленному компьютеру через rhosts. Аргументы для rdump(8) и rrestore(8) должны подходить для использования на другом компьютере. (Например, при выполнении копирования по команде rdump на компьютере с FreeBSD на накопитель Exabyte, подключенный к машине Sun по имени komodo, используйте такую команду: /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nrsa8 /dev/rda0a 2>&1) Будьте осторожны: есть проблемы с обеспечением безопасности при разрешении использования команд rhosts. Внимательно отнеситесь к вашей ситуации.

8.3.2. Tar

Утилита tar(1) также восходит корнями к Version 6 системы ATT Unix (около 1975). tar(1) работает с файловой системой; tar(1) записывает на ленту файлы и каталоги. tar(1) поддерживает не полный набор опций, имеющихся в cpio(1), однако он не требует необычного перенаправления в командной строке, которое используется в утилите cpio(1).

В большинстве версий tar(1) создание резервных копий по сети не поддерживается. Версия GNU утилиты tar(1), которая используется во FreeBSD, поддерживает удаленные устройства в том же самом синтаксисе, что и rdump(8). Чтобы скопировать данные на накопитель Exabyte, подключенный к машине Sun по имени komodo, используйте такую команду: /usr/bin/tar cf komodo:/dev/nrsa8 . 2>&1. В случае использования версий без поддержки удаленных устройств, вы можете воспользоваться перенаправлением вывода и командой rsh(1) для посылки данных на удаленный ленточный накопитель.

    # tar cf - . | rsh hostname dd of=tape-device obs=20b
        

Если вы беспокоитесь о безопасности создания резервных копий по сети, то вместо rsh(1) вам нужно использовать ssh(1).

8.3.3. Cpio

cpio(1) является оригинальной программой Unix для обмена файлами на магнитных носителях. В утилите cpio(1) имеются опции (кроме всего прочего), позволяющие выполнять изменение порядка следования байтов, поддерживающие различные форматы архивов и выполняющие перенаправление данных другим программам. Последняя возможность делает cpio(1) прекрасным выбором для целей установки. cpio(1) не знает о том, как работать с каталогами, список файлов должен даваться через stdin.

cpio(1) не поддерживает создание резервных копий по сети. Вы можете воспользоваться перенаправлением вывода и программой rsh(1) для посылки данных на удаленный накопитель. (XXX добавить пример использования утилиты)

8.3.4. Pax

pax(1) является ответом IEEE/POSIX на утилиты tar(1) и cpio(1). В течении многих лет различные версии программ tar(1) и cpio(1) получались не совсем совместимыми. Так что вместо того, чтобы попытаться полностью их стандартизировать, POSIX создал новую утилиту для работы с архивами. pax(1) пытается читать и писать различные форматы cpio(1) и tar(1), и, кроме того, свои собственные новые форматы. Набор команд этой утилиты больше напоминает cpio(1), чем tar(1).

8.3.5. Amanda

Amanda (Advanced Maryland Network Disk Archiver) является целой клиент/серверной системой резервного копирования, а не отдельной программой. Сервер Amanda сможет осуществлять резервное копирование на единственный накопитель любого количества компьютеров, на которых имеется клиент Amanda и которые могут связываться по сети с сервером Amanda. Общей проблемой систем с большим количеством больших дисков является время, требуемое для непосредственной записи данных на ленту, превышающее лимит времени, выделенный на эту задачу. Amanda решает эту проблему. Amanda может использовать "промежуточный диск" для резервного копирования нескольких файловых систем одновременно. Amanda создает "наборы архивов": группа лент, используемых в некоторый период времени для создания полных копий всех файловых систем, перечисленных в конфигурационном файле системы Amanda. "Архивный набор" содержит также создаваемый каждую ночь инкрементальные (или дифференциальные) резервные копии всех файловых систем. Восстановление поврежденной файловой системы требует наличие самой последней полной копии и инкрементальных резервных копий.

Конфигурационный файл дает прекрасный механизм управление процессом резервного копирования и объемом трафика, генерируемого системой Amanda. Amanda сможет использовать любую из перечисленных выше программ для записи данных на ленту. Amanda имеется в виде как порта, так и пакаджа, и по умолчанию она не установлена.

8.3.6. Не делать ничего

"Не делать ничего" - это не программа для компьютера, и в то же время это наиболее широко используемая стратегия резервного копирования. Здесь нет никаких первоначальных затрат. Здесь нет расписания, которому нужно следовать. Просто скажите нет. Если что-то случится с вашими данными, улыбнитесь и забудьте о них!

Если ваше время и данные практически ничего не стоят, то "не делать ничего" является самой подходящей программой для вашего компьютера. Но будьте осторожны, Unix является весьма полезным инструментом, и через полгода вы можете обнаружить, что у вас есть набор файлов, представляющих для вас определенную ценность.

"Ничего не делать" является правильным методом резервного копирования для /usr/obj и других деревьев каталогов, которые могут быть в точности перегенерированы вашим компьютером. Примером являются файлы, представляющие страницы этой книги - они генерируются из входных файлов SGML. Создание резервных копий файлов HTML не нужно. Исходные файлы SGML копируются регулярно.

8.3.7. Какая программа резервного копирования самая лучшая?

dump(8) Точка. Elizabeth D. Zwicky протестировала все программы резервного копирования, обсуждаемые здесь. Беспроигрышным вариантом для сохранения всех ваших данных и особенностей файловых систем Unix является dump(8). Элизабет создала файловые системы, содержащие большое количество необычных элементов (и некоторых не так уж необычных) и тестировала каждую из программ, выполняя резервное копирование и последующее восстановление этих файловых систем. В число необычных элементов входили: файлы с дырами, файлы с дырами и блоком пустого места, файлы с необычными символами в их именах, нечитаемые и незаписываемые файлы, устройства, меняющие свой размер во время резервного копирования, файлы, создаваемые и удаляемые во время копирования и тому подобное. Она представила результаты на конференции LISA V в октябре 1991 года. Посмотрите ссылку на torture-testing Backup and Archive Programs.

8.3.8. Процедура восстановления при сбое

8.3.8.1. До того, как случится катастрофа

Вам нужно выполнить всего лишь четыре шага для того, чтобы быть готовым к любому сбою.

Во-первых, распечатайте разметку диска для всех ваших дисков (например, disklabel da0 | lpr), таблицу файловых систем (/etc/fstab) и все сообщения, выводимые при загрузке, каждого по два экземпляра.

Во-вторых, определите, все ли устройства присутствуют на загрузочной и аварийной дискетах (boot.flp и fixit.flp). Самым простым способом проверки является перезагрузка вашей машины с загрузочной дискетой, вставленной в дисковод и последующая проверка сообщений при загрузке. Если все имеющиеся у вас устройства здесь будут перечислены и будут работоспособны, перейдите к третьему шагу.

В противном случае вам необходимо будет создать две особым образом сформированные загрузочные дискеты, на которых помещено ядро, могущее смонтировать все ваши диски и получить доступ к вашему стримеру. На этих дискетах должны быть: fdisk(8), disklabel(8), newfs(8), mount(8) и какая-либо используемая вами программа резервного копирования. Эти программы должны быть скомпонованы статически. Если вы используете dump(8), то на дискете должна присутствовать и программа restore(8).

В-третьих, регулярно создавайте резервные копии на ленте. Любые изменения, которые вы делали после последнего резервного копирования, могут быть безвозвратно потеряны. На лентах включайте защиту от записи.

В-четвертых, проверяйте работу дискет (либо boot.flp и fixit.flp, либо двух дискет, которые вы сделали при выполнении второго шага) и лент с резервными копиями. Ведите журнал выполняемых действий. Храните эти записи вместе с загрузочной дискетой, распечатками и лентами. Вы просто обезумеете при восстановлении данных, если окажется, что записи могли бы избежать разрушения ваших резервных копий (Каким образом? Вместо команды tar xvf /dev/rsa0 вы могли случайно набрать tar cvf /dev/rsa0 и тем самым перезаписать вашу резервную копию).

Для дополнительной страховки, каждый раз создавайте загрузочные дискеты и две резервные копии на ленте. Храните одну из копий в каком-то удаленном месте и НЕ в том же здании, где находится ваш офис. Достаточно большое количество компаний во Всемирном Торговом Центре изучило это на своей шкуре. Это удаленное хранилище должно быть физически отделено на большое расстояние от ваших компьютеров и дисковых устройств.

Пример скрипта для создания загрузочной дискеты:

    #!/bin/sh
    #
    # create a restore floppy
    #
    # format the floppy
    #
    PATH=/bin:/sbin:/usr/sbin:/usr/bin

    fdformat -q fd0
    if [ $? -ne 0 ]
    then
    	 echo "Bad floppy, please use a new one"
    	 exit 1
    fi

    # place boot blocks on the floppy
    #
    disklabel -w -B /dev/rfd0c fd1440

    #
    # newfs the one and only partition
    #
    newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/rfd0a

    #
    # mount the new floppy
    #
    mount /dev/fd0a /mnt

    #
    # create required directories
    #
    mkdir /mnt/dev
    mkdir /mnt/bin
    mkdir /mnt/sbin
    mkdir /mnt/etc
    mkdir /mnt/root
    mkdir /mnt/mnt			# for the root partition
    mkdir /mnt/tmp
    mkdir /mnt/var

    #
    # populate the directories
    #
    if [ ! -x /sys/compile/MINI/kernel ]
    then
    	 cat << EOM
    The MINI kernel does not exist, please create one.
    Here is an example config file:
    #
    # MINI -- A kernel to get FreeBSD on onto a disk.
    #
    machine 	"i386"
    cpu		"I486_CPU"
    ident		MINI
    maxusers	5

    options 	INET			# needed for _tcp _icmpstat _ipstat
    					 #	      _udpstat _tcpstat _udb
    options 	FFS			#Berkeley Fast File System
    options 	FAT_CURSOR		#block cursor in syscons or pccons
    options 	SCSI_DELAY=15		#Be pessimistic about Joe SCSI device
    options 	NCONS=2 	#1 virtual consoles
    options 	USERCONFIG		#Allow user configuration with -c XXX

    config		kernel	root on da0 swap on da0 and da1 dumps on da0

    controller	isa0
    controller	pci0

    controller	fdc0	at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
    disk		fd0	at fdc0 drive 0

    controller	ncr0

    controller	scbus0

    device		sc0	at isa? port "IO_KBD" tty irq 1 vector scintr
    device		npx0	at isa? port "IO_NPX" irq 13 vector npxintr

    device		da0
    device		da1
    device		da2

    device		sa0

    pseudo-device	loop		# required by INET
    pseudo-device	gzip		# Exec gzipped a.out's
    EOM
    	 exit 1
    fi

    cp -f /sys/compile/MINI/kernel /mnt

    gzip -c -best /sbin/init > /mnt/sbin/init
    gzip -c -best /sbin/fsck > /mnt/sbin/fsck
    gzip -c -best /sbin/mount > /mnt/sbin/mount
    gzip -c -best /sbin/halt > /mnt/sbin/halt
    gzip -c -best /sbin/restore > /mnt/sbin/restore

    gzip -c -best /bin/sh > /mnt/bin/sh
    gzip -c -best /bin/sync > /mnt/bin/sync

    cp /root/.profile /mnt/root

    cp -f /dev/MAKEDEV /mnt/dev
    chmod 755 /mnt/dev/MAKEDEV

    chmod 500 /mnt/sbin/init
    chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
    chmod 555 /mnt/bin/sh /mnt/bin/sync
    chmod 6555 /mnt/sbin/restore

    #
    # create the devices nodes
    #
    cd /mnt/dev
    ./MAKEDEV std
    ./MAKEDEV da0
    ./MAKEDEV da1
    ./MAKEDEV da2
    ./MAKEDEV sa0
    ./MAKEDEV pty0
    cd /

    #
    # create minimum filesystem table
    #
    cat > /mnt/etc/fstab <<EOM
    /dev/fd0a	/	ufs	rw 1 1
    EOM

    #
    # create minimum passwd file
    #
    cat > /mnt/etc/passwd <<EOM
    root:*:0:0:Charlie &:/root:/bin/sh
    EOM

    cat > /mnt/etc/master.passwd <<EOM
    root::0:0::0:0:Charlie &:/root:/bin/sh
    EOM

    chmod 600 /mnt/etc/master.passwd
    chmod 644 /mnt/etc/passwd
    /usr/sbin/pwd_mkdb -d/mnt/etc /mnt/etc/master.passwd

    #
    # umount the floppy and inform the user
    #
    /sbin/umount /mnt
    echo "The floppy has been unmounted and is now ready."
          

8.3.8.2. После сбоя

Главный вопрос: выжило ли ваше оборудование? Вы регулярно делали резервные копии, так что нет нужды беспокоиться о программном обеспечении.

Если оборудование было повреждено, первым делом замените неисправные компоненты.

Если с оборудованием все в порядке, проверьте ваши дискеты. При использовании самостоятельно созданной загрузочной дискеты, загрузитесь в однопользовательском режиме (набрав -s в приглашении boot:). Пропустите следующий абзац.

Если вы используете дискеты boot.flp и fixit.flp, читайте дальше. Вставьте дискету boot.flp в первый дисковод и загрузите компьютер. На экран будет выведено оригинальное меню установки. Выберите пункт Fixit--Repair mode with CDROM or floppy. После вывода приглашения вставьте fixit.flp. restore и другие нужные вам программы находятся в /mnt2/stand.

Восстановите по отдельности каждую файловую систему.

Попробуйте выполнить команду mount(8) (например, mount /dev/da0a /mnt) по отношению к корневому разделу вашего первого диска. Если метка диска была испорчена, то воспользуйтесь командой disklabel(8) для переразбиения на разделы и разметки диска так, чтобы получившаяся метка совпала с той, которая вами была распечатана и сохранена. Для повторного создания файловых систем используйте утилиту newfs(8). Повторно смонтируйте корневой раздел дискеты в режиме чтения-записи (mount -u -o rw /mnt). Воспользуйтесь вашей программой резервного копирования и резервными копиями на лентах для восстановления данных для этой файловой системы (например. restore vrf /dev/sa0). Размонтируйте файловую систему (например, umount /mnt). Повторите эту процедуру для каждой файловой системы, которая была запорчена.

Как только ваша система заработает, сделайте резервную копию на новые ленты. Что бы ни вызвало сбой или потерю данных, это может случиться снова. Еще один час, потраченный в этот момент, может спасти вас от неприятностей в будущем.