Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Администрирование систем Linux. Управление резервными копиями данных

Оригинал: Backup
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 2 апреля 2015 г.

Часть VII. Управление резервными копиями данных

Глава 30. Резервные копии данных

30.1. Информация о ленточных накопителях

Не забывайте о том, что имена файлов устройств, грубо говоря, не имеют решающего значения, так как ядро операционной системы использует основной и дополнительный идентификаторы для поиска соответствующего устройства! Обратитесь к странице руководства утилиты mknod и файлу devices.txt из архива исходного кода ядра Linux для получения дополнительной информации.

30.1.1. Ленточные устройства с интерфейсом SCSI

В официальном списке имен файлов устройств Linux (http://www.lanana.org/docs/device-list/) можно обнаружить имена файлов устройств ленточных накопителей с интерфейсом SCSI (символьные устройства с основным идентификатором 9 - major 9 char). Ленточные накопители с интерфейсом SCSI представлены файлами устройств с именами, начинающимися с /dev/st и нумеруются начиная с 0 для первого ленточного накопителя.

/dev/st0 Первый ленточный накопитель
/dev/st1 Второй ленточный накопитель
/dev/st2 Третий ленточный накопитель

Для предотвращения автоматической перемотки ленты используйте файлы устройств с префиксом n в именах.

/dev/nst0 Первый ленточный накопитель без автоматической перемотки ленты
/dev/nst1 Второй ленточный накопитель без автоматической перемотки ленты
/dev/nst2 Третий ленточный накопитель без автоматической перемотки ленты

По умолчанию ленточные накопители с интерфейсом SCSI в Linux используют наиболее мощный из поддерживаемых аппаратный алгоритм сжатия данных. Для снижения степени сжатия добавьте букву l (низкая степень сжатия - low), m (средняя степень сжатия - medium) или a (автоматическая установка степени сжатия - auto) к имени файла устройства.

/dev/st0l Первый ленточный накопитель с низкой степенью сжатия данных
/dev/st0m Первый ленточный накопитель со средней степенью сжатия данных
/dev/nst2m Третий ленточный накопитель со средней степенью сжатия данных без автоматической перемотки ленты

30.1.2. Ленточные накопители с интерфейсом IDE

В официальном списке имен файлов устройств Linux (http://www.lanana.org/docs/device-list/) можно обнаружить имена файлов устройств ленточных накопителей с интерфейсом IDE (символьные устройства с основным идентификатором 37 - major 37 char). Ленточные накопители с интерфейсом IDE представлены файлами устройств с именами, начинающимися с /dev/ht и нумеруются с 0 для первого ленточного накопителя. Имена файлов устройств могут модифицироваться с целью отключения автоматической перемотки ленты и указания степени сжатия таким же образом, как в случае с ленточными накопителями с интерфейсом SCSI.

/dev/ht0 Первый ленточный накопитель с интерфейсом IDE
/dev/nht0 Второй ленточный накопитель с инте6рфейсом IDE без автоматической перемотки ленты
/dev/ht0m Первый ленточный накопитель с интерфейсом IDE со средней степенью сжатия данных

30.1.3. Утилита mt

Для управления вашими ленточными накопителями следует использовать утилиту mt (Magnetic Tape - магнитный накопитель). Некоторые примеры использования данной утилиты приведены ниже.

Команда для получения информации о состоянии ленточного накопителя.

mt -f /dev/st0 status

Команда для перемотки ленты...

mt -f /dev/st0 rewind

Команда для перемотки и извлечения ленты...

mt -f /dev/st0 eject

Команда для очистки ленты...

mt -f /dev/st0 erase

30.2. Сжатие данных

Сжатие данных в процессе создания их резервных копий может оказаться весьма полезным. Двумя наиболее популярными инструментами для сжатия обычных файлов в Linux являются утилиты gzip/gunzip и bzip2/bunzip2. Вы можете увидеть пример использования утилиты gzip ниже; обратите внимание на то, что данная утилита добавляет расширение .gz к имени сжатого файла.

paul@RHELv4u4:~/test$ ls -l allfiles.tx*
-rw-rw-r--  1 paul paul 8813553 фев 27 05:38 allfiles.txt
paul@RHELv4u4:~/test$ gzip allfiles.txt 
paul@RHELv4u4:~/test$ ls -l allfiles.tx*
-rw-rw-r--  1 paul paul 931863 фев 27 05:38 allfiles.txt.gz
paul@RHELv4u4:~/test$ gunzip allfiles.txt.gz 
paul@RHELv4u4:~/test$ ls -l allfiles.tx*
-rw-rw-r--  1 paul paul 8813553 фев 27 05:38 allfiles.txt
paul@RHELv4u4:~/test$ 

В общем случае утилита gzip обрабатывает данные гораздо быстрее, чем утилита bzip2, но последняя утилита гораздо качественнее сжимает данные. Давайте сравним две этих утилиты.

paul@RHELv4u4:~/test$ cp allfiles.txt bllfiles.txt 
paul@RHELv4u4:~/test$ time gzip allfiles.txt 

real    0m0.050s
user    0m0.041s
sys     0m0.009s
paul@RHELv4u4:~/test$ time bzip2 bllfiles.txt 

real    0m5.968s
user    0m5.794s
sys     0m0.076s
paul@RHELv4u4:~/test$ ls -l ?llfiles.tx*
-rw-rw-r--  1 paul paul 931863 фев 27 05:38 allfiles.txt.gz
-rw-rw-r--  1 paul paul 708871 май 12 10:52 bllfiles.txt.bz2
paul@RHELv4u4:~/test$ 

30.3. Утилита tar

Название утилиты tar расшифровывается как Tape ARchive (ленточный архив). Данный инструмент используется для приема и передачи данных (обмен данными обычно осуществляется с ленточными накопителями или обычными фалами). Параметр c используется для создания архива формата tar (или файла формата tar), а параметр f - для указания имени файла формата tar. С помощью команды из примера ниже создается резервная копия директории /etc, которая сохраняется в файл /backup/etc.tar.

root@RHELv4u4:~# tar cf /backup/etc.tar /etc
root@RHELv4u4:~# ls -l /backup/etc.tar 
-rw-r--r--  1 root root 47800320 май 12 11:47 /backup/etc.tar
root@RHELv4u4:~#

Для сжатия данных не потребуются программные каналы, ведь утилита tar поддерживает параметр z, предназначенный для сжатия данных с использованием алгоритма gzip, а также параметр j для сжатия данных с использованием алгоритма bzip2.

root@RHELv4u4:~# tar czf /backup/etc.tar.gz /etc
root@RHELv4u4:~# tar cjf /backup/etc.tar.bz2 /etc
root@RHELv4u4:~# ls -l /backup/etc.ta*
-rw-r--r--  1 root root 47800320 май 12 11:47 /backup/etc.tar
-rw-r--r--  1 root root  6077340 май 12 11:48 /backup/etc.tar.bz2
-rw-r--r--  1 root root  8496607 май 12 11:47 /backup/etc.tar.gz
root@RHELv4u4:~# 

Параметр t используется для вывода списка содержимого архива формата tar. Режим подробного вывода активируется с помощью параметра v (данный параметр также полезен в том случае, если вы хотите видеть информацию об обрабатываемых файлах в процессе их архивации).

root@RHELv4u4:~# tar tvf /backup/etc.tar
drwxr-xr-x root/root         0 2007-05-12 09:38:21 etc/
-rw-r--r-- root/root      2657 2004-09-27 10:15:03 etc/warnquota.conf
-rw-r--r-- root/root     13136 2006-11-03 17:34:50 etc/mime.types
drwxr-xr-x root/root         0 2004-11-03 13:35:50 etc/sound/
...

Для вывода информации об определенном файле из архива формата tar, следует использовать параметр t с передачей имени интересующего файла (без начального символа /).

root@RHELv4u4:~# tar tvf /backup/etc.tar etc/resolv.conf
-rw-r--r-- root/root        77 2007-05-12 08:31:32 etc/resolv.conf
root@RHELv4u4:~# 

Используйте параметр x для извлечения всех файлов или определенного файла из архива. Помните о том, что по умолчанию утилита tar будет извлекать файлы в текущую директорию.

root@RHELv4u4:~# tar xvf /backup/etc.tar etc/resolv.conf
etc/resolv.conf
root@RHELv4u4:~# ls -l /etc/resolv.conf
-rw-r--r-- 2 root root 40 май 12 12:05 /etc/resolv.conf
root@RHELv4u4:~# ls -l etc/resolv.conf
-rw-r--r-- 1 root root 77 май 12 08:31 etc/resolv.conf
root@RHELv4u4:~# 

Вы можете активировать режим сохранения прав доступа к файлам с помощью параметра p. Для задания файлов и директорий, которые не должны быть добавлены в архив, следует использовать параметр --exclude.

root ~# tar cpzf /backup/etc_with_perms.tgz /etc
root ~# tar cpzf /backup/etc_no_sysconf.tgz /etc --exclude /etc/sysconfig
root ~# ls -l /backup/etc_*
-rw-r--r--  1 root root 8434293 май 12 12:48 /backup/etc_no_sysconf.tgz
-rw-r--r--  1 root root 8496591 май 12 12:48 /backup/etc_with_perms.tgz
root ~# 

Также вы можете создать текстовый файл с именами файлов и директорий для архивации, после чего передать данный файл утилите tar, использовав параметр -T.

root@RHELv4u4:~# find /etc -name *.conf > files_to_archive.txt
root@RHELv4u4:~# find /home -name *.pdf >> files_to_archive.txt
root@RHELv4u4:~# tar cpzf /backup/backup.tgz -T files_to_archive.txt 

Утилита tar может принимать имена файлов от утилиты find посредством специальной утилиты xargs.

find /etc -type f -name "*.conf" | xargs tar czf /backup/confs.tar.gz

Вы можете использовать утилиту tar для копирования директории, причем данная команда будет более эффективной, чем команда cp -r.

(cd /etc; tar -cf - . ) | (cd /backup/copy_of_etc/; tar -xpf - )

Другой пример использования утилиты tar предназначен для безопасного копирования директории по сети.

(cd /etc;tar -cf - . )|(ssh user@srv 'cd /backup/cp_of_etc/; tar -xf - ')

Утилита tar может использоваться совместно с утилитой gzip и клиентом ssh для копирования файла на удаленный сервер по протоколу ssh.

cat backup.tar | gzip | ssh bashuser@192.168.1.105 "cat - > backup.tgz"

Команда для сжатия файла резервной копии формата tar при передаче по сети с сохранением несжатого файла на целевом узле.

cat backup.tar | gzip | ssh user@192.168.1.105 "gunzip|cat - > backup.tar"

Аналогичная предыдущей команда со сжатием данных силами клиента ssh.

cat backup.tar | ssh -C bashuser@192.168.1.105 "cat - > backup.tar"

30.4. Типы резервных копий данных

В Linux используются многоуровневые инкрементальные резервные копии данных с жестким разделением уровней. Полная резервная копия данных является резервной копией данных уровня 0. Резервная копия данных более высокого уровня x будет содержать информацию обо всех изменениях данных с момента создания резервной копии данных предыдущего уровня x-1.

Представьте, что вы создали полную резервную копию данных (уровня 0) в понедельник, а резервную копию уровня 1 - во вторник, следовательно, созданная во вторник резервная копия данных будет содержать информацию обо всех изменениях данных начиная с понедельника. Созданная в среду резервная копия данных уровня 2 будет содержать информацию обо всех изменениях данных начиная со вторника (предыдущий уровень резервной копии данных 2-1). Резервная копия данных уровня 3, созданная в четверг, будет содержать информацию обо всех изменениях данных начиная со среды (предыдущий уровень резервной копии данных 3-1). Другая резервная копия данных уровня 3, созданная в пятницу, будет также содержать информацию обо всех изменениях данных начиная со среды. Резервная копия данных уровня 2, созданная в субботу, будет содержать информацию обо всех изменениях данных с момента создания резервной копии данных предыдущего уровня 1, то есть, со вторника.

30.5. Утилиты dump и restore

Хотя утилита dump и похожа на утилиту tar, она значительно отличается от нее тем, что работает с данными на уровне файловой системы. В то время, как утилита tar принимает списки файлов для создания резервной копии, утилита dump самостоятельно осуществляет поиск файлов для создания резервной копии, исследуя файловую систему ext2. Файлы, обнаруженные утилитой dump, будут копироваться на ленточный накопитель или в обычный файл. В том случае, если на целевом устройстве не хватает свободного места для сохранения резервной копии данных (заканчивается лента), она разделяется на множество томов.

Извлечение файлов из созданной с помощью утилиты dump резервной копии осуществляется с помощью утилиты restore. В примере ниже полная резервная копия уровня 0 двух разделов жесткого диска сохраняется на ленточный носитель с помощью ленточного накопителя с интерфейсом SCSI. Необходимо использовать файл устройства ленточного накопителя без автоматической перемотки ленты для того, чтобы резервные копии разделов жесткого диска записывались на ленту друг за другом.

dump 0f /dev/nst0 /boot
dump 0f /dev/nst0 /

Вывод списка файлов архива, созданного с помощью утилиты dump, осуществляется с помощью команды dump -t, причем вы также можете осуществлять сравнение файлов с помощью команды dump -C.

Вы можете предотвратить резервное копирование произвольных файлов, изменив значения соответствующих атрибутов этих файлов с помощью утилиты chattr. Атрибут файла d в файловых системах семейства ext сообщает утилите dump о необходимости пропуска данного файла даже при создании полной резервной копии файловой системы. В следующем примере приведена команда, используемая для предотвращения резервного копирования файла /etc/hosts.

chattr +d /etc/hosts

Для полного восстановления файловой системы с помощью утилиты restore следует использовать параметр -r. Такой подход может оказаться полезным в случае возникновения необходимости в изменении размера файловой системы или изменения размера блока файловой системы. Перед восстановлением данных из резервной копии вы должны создать новую файловую систему, смонтировать ее в определенную директорию и перейти в эту директорию. Следует выполнять действия в такой последовательности, как показано в примере ниже.

mke2fs /dev/hda3
mount /dev/hda3 /mnt/data
cd /mnt/data
restore rf /dev/nst0

Для извлечения из резервной копии одного файла или директории используйте параметр -x.

restore -xf /dev/st0 /etc

30.6. Утилита cpio

Утилита cpio (Copy Input and Output) значительно отличается от утилит tar и dump. Она может принимать список имен файлов от сторонней утилиты, но при этом осуществляет последовательное копирование оригиналов этих файлов. Это обстоятельство позволяет достаточно просто использовать данную утилиту в сочетании с утилитой find! Некоторые примеры ее использования приведены ниже.

Утилита find передает имена файлов утилите cpio, которая, в свою очередь, помещает файлы в архив.

find /etc -depth -print | cpio -oaV -O archive.cpio

Аналогичная команда со сжатием результирующего архива с помощью утилиты gzip.

find /etc -depth -print | cpio -oaV | gzip -c > archive.cpio.gz 

Теперь данные архива передаются по протоколу ssh (осуществляется резервное копирование файлов в сжатый архив на другой машине).

find /etc -depth -print|cpio -oaV|gzip -c|ssh server "cat - > etc.cpio.gz"

Утилита find передает имена файлов утилите cpio | утилита cpio передает файлы в архиве клиенту ssh | клиент ssh передает файлы в архиве утилите cpio 'утилита cpio извлекает файлы из архива'.

find /etc -depth -print | cpio -oaV | ssh user@host 'cpio -imVd'

Аналогичная команда, с помощью которой выполняется обратное действие: осуществляется копирование директории с удаленного узла на локальную машину.

ssh user@host "find path -depth -print | cpio -oaV" | cpio -imVd

30.7. Утилита dd

30.7.1. Информация об утилите dd

Некоторые люди используют утилиту dd для создания резервных копий данных. Эта утилита является очень мощным инструментом, но созданные с помощью нее резервные копии данных могут восстанавливаться на схожих по параметрам разделах дисковых устройств или дисковых устройствах. Однако, существует множество вариантов продуктивного использования утилиты dd. Ниже приведены некоторые примеры ее использования.

30.7.2. Создание файла образа оптического диска CDROM

Простейший способ создания файла образа любого оптического диска с расширением .iso связан с использованием утилиты dd. Параметр if позволяет указать путь к исходному файлу, of - к целевому файлу. После этого для создания копии оптического диска на основе его файла образа с расширением .iso может быть использован любой инструмент для записи образов оптических дисков.

dd if=/dev/cdrom of=/путь/к/файлу/cdrom.ISO

30.7.3. Создание файла образа гибкого диска

Возможно, данный пример на сегодняшний день и не является актуальным, но на всякий случай следует упомянуть о том, что утилита dd может использоваться для создания файла образа гибкого диска объемом в 1.44 Мб. Размер блока файловой системы задается с помощью параметра bs, а в качестве значения параметра count используется количество блоков для копирования.

dd if=/dev/floppy of=/путь/к/файлу/floppy.img bs=1024 count=1440

30.7.4. Копирование основной загрузочной записи

Утилита dd может использоваться для копирования основной загрузочной записи (Master Boot Record - MBR) жесткого диска, представленного соответствующим файлом устройства, к примеру, /dev/hda, в файл.

dd if=/dev/hda of=/MBR.img bs=512 count=1

30.7.5. Копирование файлов

В данном примере показана методика использования утилиты dd для копирования файлов. Для файла с именем summer.txt создается копия с именем copy_of_summer.txt.

dd if=~/summer.txt of=~/copy_of_summer.txt

30.7.6. Создание файлов образов жестких дисков или их разделов

Кому нужна утилита ghost, если утилита dd может создавать образы разделов жестких дисков (со сжатием).

dd if=/dev/hdb2 of=/image_of_hdb2.IMG
dd if=/dev/hdb2 | gzip > /image_of_hdb2.IMG.gz

30.7.7. Создание файлов определенного размера

Утилита dd может использоваться для создания файла любого размера. В первом примере создается файл размером в один мебибайт, а во втором - в один мегабайт.

dd if=/dev/zero of=file1MB count=1024 bs=1024
dd if=/dev/zero of=file1MB count=1000 bs=1024

30.7.8. Сохранение копии оптического диска CDROM на удаленном сервере

Разумеется, существует бесконечное количество вариантов использования комбинации утилит ssh и bzip2. В данном примере сжатый с помощью утилиты bzip2 файл образа оптического диска CDROM сохраняется на удаленном сервере.

dd if=/dev/cdrom |bzip2|ssh user@host "cat - > /backups/cd/cdrom.iso.bz2"

30.8. Утилита split

Утилита split может успешно использоваться для разделения файлов на фрагменты меньшего размера. Данное разделение может оказаться полезным для записи фрагментов файла на множество носителей в том случае, если не разделенный на фрагменты файл не умещается на единственном носителе. В примере ниже показан метод разделения файла размером в 5000 байт на три файла меньшего размера, причем размер каждого из результирующих файлов не превышает 2000 байт.

paul@laika:~/test$ ls -l
итого 8
-rw-r--r-- 1 paul paul 5000 2007-09-09 20:46 bigfile1
paul@laika:~/test$ split -b 2000 bigfile1 splitfile.
paul@laika:~/test$ ls -l
итого 20
-rw-r--r-- 1 paul paul 5000 2007-09-09 20:46 bigfile1
-rw-r--r-- 1 paul paul 2000 2007-09-09 20:47 splitfile.aa
-rw-r--r-- 1 paul paul 2000 2007-09-09 20:47 splitfile.ab
-rw-r--r-- 1 paul paul 1000 2007-09-09 20:47 splitfile.ac

30.9. Практическое задание: резервные копии данных

!! Проявите осторожность при использовании параметров утилиты tar и указании пути к файлу резервной копии данных, ведь в случае ошибки могут быть повреждены файлы вашей системы !!

1. Создайте директорию (или раздел жесткого диска, если желаете) для хранения резервных копий данных. Используйте путь (или смонтируйте файловую систему из созданного раздела жесткого диска в директорию) /mnt/backup.

2a. Используйте утилиту tar для создания файла резервной копии данных директории /etc с именем /mnt/backup/etc_<дата>.tgz, причем этот файл должен быть сжат с использованием алгоритма gzip. (Замените <дата> на текущую дату.)

2b. Используйте утилиту tar для создания файла резервной копии данных директории /bin с именем /mnt/backup/bin_<дата>.tar.bz2, причем этот файл должен быть сжат с использованием алгоритма bzip2.

2с. Выберите по файлу из директорий /etc и /bin и проверьте, была ли создана резервная копия этих файлов.

2d. Извлеките два выбранных файла из архивов в вашу домашнюю директорию.

3a. Создайте директорию для хранения файлов резервных копий данных вашего соседа и сделайте ее доступной по пути /mnt/<имя_компьютера_соседа>.

3b. Используйте комбинацию из клиента ssh и утилиты tar для сохранения резервной копии данных вашей директории /boot на компьютере вашего соседа в директории /mnt/<имя_вашего_компьютера>.

4a. Используйте комбинацию из утилит find и cpio для создания архива содержимого директории /etc формата cpio.

4b. Выберите файл из директории /etc и извлеките его из архива формата cpio в вашу домашнюю директорию.

5. Используйте утилиту dd и клиент ssh для сохранения файла резервной копии данных основной загрузочной записи жесткого диска на компьютере вашего соседа.

6. (Задание должно выполняться на реальном компьютере.) Создайте и смонтируйте файл образа установочного диска Ubuntu с расширением .iso.

7. Используйте комбинацию из утилит dd и gzip для создания 'виртуального' образа одного из ваших разделов жесткого диска в другом разделе.

8. Используйте утилиту dd для создания файла размером в пять мегабайт в директории ~/testsplit с именем biggest. После этого разделите этот файл на файлы размером до двух мегабайт.

mkdir testsplit
dd if=/dev/zero of=~/testsplit/biggest count=5000 bs=1024
split -b 2000000 biggest parts

Предыдущий раздел: Оглавление Следующий раздел:
Глава 29. Работа с разделяемыми библиотеками   Приложение A. Дисковые квоты