Subversion Repositories general

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1365 dev 1
 	FSBACKUP - file system backup and synchronization utility.
2
 
3
     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY WARRANTIES *
4
 
5
For english documentation type 'perldoc fsbackip.pl'
6
 
7
---------------------------------------------------------------------------
8
 
9
FSBACKUP - система инкрементального резервного копирования и синхронизации ФС. 
10
	          http://www.opennet.ru/dev/fsbackup/
11
 
12
По всем вопросам обращайтесь к автору: Maxim Chirkov <mc@tyumen.ru>
13
 
14
---------------------------------------------------------------------------
15
СОДЕРЖАНИЕ:
16
    Назначение.
17
    Комплект поставки.
18
    Выполняемые функции.
19
    Установка.
20
    Файл конфигурации.
21
    Восстановление данных.
22
    Виды бэкапа.
23
    Типы хранилища для архива бэкапа.
24
    Шифрование бэкапа.
25
    Благодарности.
26
 
27
---------------------------------------------------------------------------
28
Назначение:
29
 
30
    Система fsbackup была создана для обеспечения резервного копирования серверов 
31
разного масштаба на специально отведенном сервере бэкапа. 
32
 
33
    Достоинствами метода резервного копирования на специально отведенном сервере,
34
с использованием fsbackup, является:
35
    - 	высокая производительность (скорость передачи по 100Мбит сети намного
36
	выше скорости записи на ленточный накопитель), низкая себестоимость 
37
	(цена Мб на современных жестких IDE дисках достаточно низкая);
38
 
39
    -	надежность (возможность параллельного хранения нескольких резервных 
40
	копий за разные моменты времени); 
41
 
42
    -   безопасность (применение PGP шифрования резервных копий перед записью на 
43
	бэкап сервер);
44
 
45
    -	автономность (один раз настроив систему бэкап будет производится 
46
	автоматически, не нужно обслуживать стриммер), 
47
 
48
    -	возможность сохранения только измененных с последнего бэкапа данных, без
49
	затрат на копирования не изменившейся информации.
50
 
51
    -   простота настройки и установки (как правило система способна 
52
	функционировать сразу после запуска инсталляционного скрипта)
53
 
54
    - 	простота восстановления (открытый формат для хранения резервных копий 
55
	(tar), позволяет восстановить данные без использования входящих в 
56
	комплект утилит восстановления).
57
 
58
    - 	гибкость задания масок для помещения файлов и каталогов в архив.
59
 
60
    -	поддержка бэкапа баз данных хранимых в MySQL и PostgreSQL.
61
 
62
    fsbackup может выполнять создание как полного образа сервера, так и резервных 
63
копий основных подсистем, исключая операционную систему. В случае полного бэкапа,
64
полное восстановление работоспособности происходит в течении нескольких десятков
65
минут, в случае частичного бэкапа для восстановления требуется несколько часов.
66
 
67
    В отличие от многих систем автоматического резервного копирования, в fsbackup
68
применяется гибкая система построения масок (с использованием regex) для
69
принятия решения о помещении файлов в бэкап.
70
 
71
 
72
---------------------------------------------------------------------------
73
Комплект поставки:
74
 
75
	create_backup.sh
76
	    Скрипт для периодического запуска всей подсистемы резервного
77
	    копирования из crontab.
78
 
79
	install.pl
80
	    Скрипт для установки программы и всех недостающих Perl модулей.
81
 
82
	fsbackup.pl
83
            Основной скрипт для бэкапа и синхронизации.
84
 
85
	cfg_example
86
            Пример файла конфигурации и документация по всем конфигурационным 
87
	    директивам. 
88
 
89
	cache/
90
	    Образ директории для помещения временных хэшей. 
91
 
92
	sys_backup/
93
	    Образ директории для помещения бэкапов созданных sysbackup.sh. 
94
 
95
	modules/
96
	    Perl модули которые требуются для функционирования fsbackup.pl.
97
 
98
	scripts/
99
	    Директория со вспомогательными скриптами.
100
 
101
	scripts/mysql_backup.sh
102
	scripts/pgsql_backup.sh
103
	    Скрипты для создания полного и частичного бэкапа базы данных 
104
	    хранимой в PostgreSQL или MySQL. 
105
	    Поддерживаются режимы работы:
106
	    1. полный бэкап всех баз и структур;
107
	    2. полный бэкап структур всех баз + бэкап данных в избранных базах/таблицах;
108
	    3. полный бэкап структур всех баз + бэкап данных во всех базах, 
109
	       кроме избранных баз/таблиц;
110
 
111
	scripts/sysbackup.sh
112
	    Скрипт для сохранения списка всех установленных в системе пакетов 
113
	    для FreeBSD и Linux, для Linux использующих rpm - сохранение файлов 
114
	    конфигурации всех установленных в системе пакетов.
115
 
116
	scripts/sysrestore.sh
117
	    Скрипт для автоматической установки всех пакетов, список которых 
118
	    был сохранен скриптом sysbackup.sh, в свеже-установленной системе.
119
 
120
	scripts/fsrestore.sh
121
	    Скрипт для восстановления данных из инкрементального бэкапа.
122
 
123
---------------------------------------------------------------------------
124
Выполняемые функции:
125
 
126
    - 2 метода вычисления контрольных сумм: 
127
	timesize - по атрибутам (дата, время, размер, права доступа...)
128
	md5 - по содержимому файла.
129
 
130
    - 4 вида бэкапа:
131
	backup - инкрементальный бэкап в архив (т.е. копируются только 
132
		 изменившиеся с момента последнего бэкапа файлы).
133
	full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 
134
		 все файлы).
135
	sync - синхронизация дерева.
136
	hash - только генерация хэша, без помещения файлов в архив (может
137
		использоваться для определения какие файлы были изменены)
138
 
139
    - 3 типа хранилища бэкапа:
140
    	local 	   - хранение бэкапа в локальной файловой системе.
141
	remote_ssh - копирование бэкапа на удаленную машину с использованием SSH
142
	remote_ftp - копирование бэкапа на удаленную машину по FTP.
143
 
144
    - 8 встроенных операторов (можно использовать regex) для описания 
145
      помещаемых в бэкап (или игнорируемых для помещения в бэкап) файлов:
146
    	    /dir[/file] - путь к файлу/директории для бэкапа.
147
	    !/dir[/file] - отрицание пути, не помещать в бэкап (не маска, а реальный путь).
148
	    # - комментарий
149
	    =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
150
	    f~ - маска для файла. Первый или второй символ.
151
	    d~ - маска для директории. Первый или второй символ.
152
	    =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
153
	    f! - "НЕ" маска для файла. Первый или второй символ.
154
	    d! - "НЕ" маска для директории. Первый или второй символ.
155
	    Ограничен по времени создания и размеру
156
 
157
    - Возможность шифрования бэкапа с помощью PGP.
158
 
159
    - Гибкое задание уровня инкрементальности. Например, при = 7 - 6 раз 
160
      будут помещаться только изменения, на 7 раз бэкап будет объединен в 
161
      один файл.
162
 
163
    - Скрипт для сохранения списка всех установленных в системе пакетов 
164
      для FreeBSD и Linux.
165
 
166
    -  Скрипты для создания полного и частичного бэкапа базы данных 
167
       хранимой в PostgreSQL или MySQL. Поддерживаются режимы работы:
168
	     - полный бэкап всех баз и структур;
169
	     - полный бэкап структур всех баз + бэкап данных в избранных базах;
170
	     - полный бэкап структур всех баз + бэкап данных во всех базах, 
171
		 кроме избранных баз;
172
 
173
 
174
---------------------------------------------------------------------------
175
Установка:
176
 
177
    Для установки достаточно запустить скрипт ./install.pl
178
    Программа автоматически скопируется в заданный директивой --prefix каталог,
179
    по умолчанию установка производится в каталог /usr/local/fsbackup.
180
 
181
    После установки достаточно переименовать и отредактировать файл конфигурации
182
    cfg_example, следуя приведенным внутри cfg_example инструкциям. 
183
    Затем, отредактируйте скрипт запуска "create_backup.sh", при необходимости
184
    измените путь к хранилищу бэкапа и название список используемых файлов 
185
    конфигурации.
186
    Активируйте периодический запуск подсистема бэкапа в crontab:
187
    18 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s"`name -n` backup report" root
188
    При использовании бэкапа SQL сервера или системы отредактируйте скрипты
189
    в директории ./scripts (mysql_backup.sh, pgsql_backup.sh, sysbackup.sh).
190
 
191
    Например:
192
	>su
193
	# ./install.pl 
194
	# cd /usr/local/fsbackup
195
	# vi cfg_example
196
	# mv cfg_example server_backup.conf
197
	# vi create_backup.sh
198
	# crontab -e
199
	# cd scripts
200
	# vi sysbackup.sh
201
	# vi pgsql_backup.sh
202
	# exit
203
	>
204
 
205
--------------------------------------------------------------------------
206
Файл конфигурации:
207
 
208
Подробное описание всех параметров файла конфигурации смотрите в файле 
209
cfg_example.
210
 
211
Внимание, при описании директорий для бэкапа нельзя указывать путь к символической 
212
ссылке, только полный путь к реальной директории. Например, если указано 
213
/home, а это символическая ссылка на /usr/home, то в бэкап будет помещены 
214
данные о символической ссылке, а не содержание директории.
215
 
216
Рекомендуется, описать бэкап разных участков файловой системы в нескольких
217
файлах конфигурации. Например, мной используется следующие несколько файлов 
218
конфигурации:
219
    server_etc.conf - описывает создание бэкапа директории /etc и секретных 
220
		      данных с использованием PGP шифрования;
221
    server_local.conf - бэкап /usr/local, за исключением временных файлов, 
222
		      бэкап БД.
223
    server_home.conf - бэкап директорий пользователей (/home или /usr/home)
224
 
225
Внимание, директории для сохранения бэкапа в каждом конфигурационном файле
226
должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и
227
той же директории нескольких, описанных разными .conf файлами, бэкапов не 
228
допустимо.
229
 
230
---------------------------------------------------------------------------
231
Восстановление данных:
232
 
233
Полная резервная копия может быть восстановлена в короткий промежуток времени 
234
без использования дополнительных, входящих в комплект fsbackup утилит.
235
Например, если архив бэкапа сохранен в директории /mnt/full_backup, для полного 
236
восстановления достаточно набрать:
237
    # cd /
238
    # tar xzf /mnt/full_backup/full_backup.tar.gz
239
    # sh /mnt/full_backup/full_backup.dir
240
 
241
Для полного восстановления данных из инкрементального бэкапа  может 
242
использоваться скрипт scripts/fsrestore.sh,  для восстановления просто 
243
отредактируйте пути внутри скрипта и запустите его.
244
 
245
В случае частичного бэкапа файловой системы, без бэкапа файлов операционный 
246
системы, восстановить исходный набор установленных в момент бэкапа пакетов 
247
(должен быть разрешен запуск scripts/sysbackup.sh в create_backup.sh) поможет
248
скрипт scripts/sysrestore.sh. После установки ОС, скрипт автоматически 
249
установит недостающие пакеты для FreeBSD и Linux.
250
 
251
При бэкапе данных с SQL сервера PostgreSQL или Mysql, восстановление производится
252
командами: psql -d template1 -f sqlbackupfile или mysql < sqlbackupfile.
253
 
254
Таким образом можно привести типовой процесс полного восстановления системы:
255
    - базовая установка ОС (без дополнительных пакетов)
256
    - монтирование диска с бэкапом.
257
    - редактирование путей и запуск scripts/sysrestore.sh для установки нужных
258
      пакетов.
259
    - редактирование путей и запуск scripts/fsrestore.sh
260
    - запуск SQL сервера и восстановление баз.
261
 
262
 
263
Назначение файлов при инкрементальном бэкапе (для не инкрементального - формат 
264
"имя.ext"):
265
  имя-время-том.tar.gz  архив - бэкапа 
266
                        (имя_бэкапа-YYYY.MM.DD.HH.MM.SS-номер_тома.tar.gz).
267
  имя-время.del     список удаленных с момента предыдущего бэкапа файлов
268
  имя-время.hash    хэш таблица с контрольными суммами.
269
  имя-время.list    список файлов в архиве.
270
  имя-время.dir     команды для восстановления прав доступа и пустых директорий.
271
 
272
 
273
---------------------------------------------------------------------------
274
Виды бэкапа:
275
 
276
 
277
Вид бэкапа в файле конфигурации определяется параметром $cfg_backup_style:
278
    backup - инкрементальный бэкап в архив. Копируются только 
279
	     изменившиеся с момента последнего бэкапа файлы, уровень 
280
	     инкрементальности задается параметром $cfg_increment_level, 
281
	     параметр определяет через какого числа итераций файлы с 
282
	     инкрементальными копиями будут объединены в один файл. Например, 
283
	     при  $cfg_increment_level = 7 - 6 раз будут помещаться только 
284
	     изменения,  на 7 раз бэкап будет объединен в один файл. 
285
 
286
	     отследить изменения (и восстановить данные) на любой момент со
287
	     времени первой итерации, в архив копируются только измененные и 
288
	     новые данные, что значительно экономит трафик и место на диске.
289
	     Подходит для ежедневного бэкапа динамично меняющейся или критичной 
290
	     к потере информации.
291
 
292
    full_backup - полный бэкап в архив, без хэша. В бэкап всегда помещаются
293
	     все файлы отмеченные в файле конфигурации для резервного 
294
	     копирования). На сервере где сохраняется бэкап рекомендуется
295
	     проводить вторичное резервирование, например, в crontab раз
296
	     в неделю дублировать бэкап в другую директорию. Недостатки - 
297
	     огромный трафик для копирования бэкапа по сети и высокие 
298
	     требования к объему хранилища бэкапа. Достоинство - экономия
299
	     процессорных ресурсов и памяти на создание и поддерживание хэша.
300
	     Прекрасно подходит для бэкапа маломощных машин с ограниченными 
301
	     ресурсами или при статичности резервируемых данных (например, 
302
	     бэкап выносных рутеров раз в месяц).
303
 
304
    sync     - синхронизация дерева (только для типа хранилища ssh или local).
305
	     Почти то же, что и full_backup или backup (в зависимости от задания 
306
	     ключа -c при запуске fsbackup.pl), за исключением того, что копия 
307
	     не хранится в архиве, а область файловой системы отмеченная для 
308
	     бэкапа полностью воссоздается в заданной директории на бэкап сервере.
309
	     Предназначено для параллельного хранения (синхронизации дерева)
310
	     исходных текстов, содержимого web-сервера, синхронизации проектов
311
	     с рабочей машины разработчика на сервер и т.д.
312
 
313
    hash    - только генерация хэша, без помещения файлов в архив (опция -h).
314
              Может применяться для пометки помещения файлов в бэкап, без 
315
	      физического их перемещения, для отслеживания изменений в файловой
316
	      системе для обнаружения подмены файлов злоумышленниками и т.д.
317
 
318
 
319
Скрипт fsbackup.pl, поддерживает ряд ключей задаваемых в командной строке:
320
    fsbackup.pl [-n|-f|-h|-c] файл_конфигурации
321
	-n - создаем новый архив независимо от состояния хэша.
322
	-f - full_backup - полный бэкап в архив, без хэша.
323
	-h - hash - только генерация хэша, без помещения файлов в архив.
324
	-c - clean - очистка хранилища с инкрементальным бэкапом и создание 
325
	     нового бэкапа.
326
 
327
---------------------------------------------------------------------------
328
Типы хранилища для архива бэкапа:
329
 
330
Определение типа хранилища для бэкапа определяется в файле конфигурации 
331
переменной $cfg_type. Поддерживается 3 типа хранилищ: local, remote_ssh 
332
и remote_ftp.
333
 
334
    - local - сохранение бэкапа в локальной файловой системе.
335
	Конфигурация:
336
	$cfg_type="local";
337
	$cfg_local_path="/var/backup"; # Путь к хранилищу.
338
 
339
    - remote_ssh - сохранение бэкапа на удаленном компьютере, данные передаются
340
	через шифрованное соединение организованное с использованием SSH.
341
	На системе с которой производится бэкап должен быть установлен ssh клиент,
342
	на удаленном - ssh сервер. Метод remote_ssh является наиболее защищенным,
343
	но и достаточно ресурсоемким. Предварительно необходимо настроить доступ
344
	бэкап клиента на сервер с использованием шифрованных ключей, без ввода 
345
	пароля. Это делается следующим образом:
346
 
347
	Примем: локальная машина -  машина с которой будет производиться бэкап и 
348
	на которой будем запускать скрипт fsbackup.pl. Удаленная машина - машина
349
	на которую будут копироваться файлы с бэкапом.
350
	Запускаем на локальной машине программу ssh-keygen, на все задаваемые 
351
	вопросы принимаем значения по умолчанию (поле passphrase оставляем 
352
	пустым). Далее, запускаем программу ssh-copy-id user@remotehost, где 
353
	user - пользователь удаленной машины remotehost - адрес удаленной машины,
354
	( или вручную, на удаленной машине в директории ~/.ssh, создаем файл 
355
	authorized_keys, куда копируем содержимое файла identity.pub с локальной 
356
	машины). Для увеличения безопасности в файл ~/.ssh/authorized_keys на 
357
	удаленной машине добавляем перед ключом (разделив пробелом) строку
358
	from="localhost", где localhost - адрес локальной машины 
359
	(from="localhost" 1024 23 1343.....).
360
 
361
	Конфигурация:
362
 
363
	$cfg_type="remote_ssh";
364
	$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
365
	$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
366
	$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
367
 
368
    - remote_ftp - сохранение бэкапа на удаленном компьютере, данные передаются
369
	по протоколу ftp, на удаленном хосте должен быть запущен ftp сервер.
370
	Так как пароль хранится в файле конфигурации в открытом виде, желательно
371
	ограничить доступ к хосту к удаленному хосту через tcpwrapper или firewall,
372
	а так же ограничить вход пользователя, под которым будет храниться бэкап,
373
	только через chroot ftp. Положительными сторонами копирования по ftp, 
374
	является высокая производительность закачки и небольшая нагрузка на CPU.
375
 
376
	Конфигурация:
377
 
378
	$cfg_type="remote_ftp";
379
	$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
380
	$cfg_remote_password="Test1234"; # пароль для входа по ftp.
381
	$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
382
	$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
383
 
384
 
385
---------------------------------------------------------------------------
386
Шифрование бэкапа:
387
 
388
Для шифрования бэкапа в системе должна быть установлена программа PGP шифрования
389
GnuPG: http://www.gnupg.org (рекомендуется) или PGP: http://www.pgpi.org
390
 
391
Далее:
392
    Локальная машина - машина на которой производится резервное копирование.
393
    Удаленная машина - машина куда сохраняется архив бэкапа.
394
 
395
Рекомендации по работе с PGP программами для создания шифрованного бэкапа 
396
(для pgp2.6, pgp5.0, gnupg):
397
 
398
Для создания публичного и секретного ключей наберите (на удаленной машине):
399
pgp2.6> pgp -kg
400
pgp5.0> pgpk -g
401
gnupg> gpg --gen-key  # если генерация ключа занимает слишком много времени 
402
			воспользуйтесь ключом gpg --quick-random
403
 
404
Экспортируйте созданный публичный ключ в файл (на удаленной машине):
405
pgp2.6> pgp -akx <UserID> <файл куда будет записан ключ>
406
pgp5.0> pgpk -ax <UserID> <файл куда будет записан ключ>
407
gnupg> gpg --export -a <UserID> > <файл куда будет записан ключ>
408
 
409
Затем, добавте созданный публичный ключ (на локальной машине):
410
pgp2.6>pgp -ka <файл с ключом с удаленной машины>
411
pgp5.0>pgpk -a <файл с ключом с удаленной машины>
412
gnupg>gpg --import <файл куда будет записан ключ>
413
# Для pgupg необходимо заверить ключ:
414
gnupg>gpg --sign-key <имя ключа>
415
 
416
Для расшифровки необходимо запустить (на удаленной машине):
417
pgp2.6>cat encrypted.tar.gz | pgp -f -z'пароль' > расшифрованный.tar.gz
418
pgp5.0>cat encrypted.tar.gz | pgpv -f -z'пароль' > расшифрованный.tar.gz
419
gnupg>cat encrypted.tar.gz | gpg --decrypt > расшифрованный.tar.gz
420
 
421
Для шифрования используется (на локальной машине):
422
pgp2.6>cat input| pgp -ef userid > output
423
pgp5.0>cat input| pgpe -f userid > output
424
gnupg>cat input| gpg -e -r userid > output
425
 
426
 
427
 
428
---------------------------------------------------------------------------
429
Благодарности:
430
Alex Sokoloff. <sokoloff@mail.ru>
431
	- Предложение о введении уровней говорливости (verbose mode).
432
	- Изменить запуск программы (ввести проверку на длину
433
          письма), вынести ее в файл fsbackup.cron.
434
	- Написал небольшой скрипт fsfind.pl для поиска файла в архивах он 
435
	  просматривает файлы list в директории с архивами. Может кому-то 
436
	  будет полезен. Работает с локальными архивами.
437
	- скрипт для бэкапа Interbase баз.
438
 
439
Oleg S. Gints <oleg@cec.amur.elektra.ru>:
440
	- Предложение по введению дополнительного резервирования при 
441
	  использовании инкрементального бэкапа.
442
	- Обнаружение ошибки в mysql_backup.sh (для варианта полного архива 
443
	  пропущен ключ --all-databases)
444
	- Сообщение о неправильном определении уровня инкрементальности для 
445
	  локального бэкапа.
446
	- Замечание об отсутствии лидирующих нулей в новом формате именования
447
	  файлов в бэкапе.
448
 
449
Носков Илья <phantom@highway.ru>, Сергей Баукин <teq@highway.ru>:
450
	- Идея разбивки слишком больших файлов на несколько частей, 
451
	  предложения и патчи по создания архивов занимающих несколько Гб.
452
 
453
Aleksey Kuznetsov <ahk@spb.edu>
454
	- Сообщение о пропуске ключа --all-databases в mysql_backup.sh
455
 
456
Pavel Stoliarov <admin@tzto.infopac.ru>
457
	- Исправление ошибки приводящей к некорректной работе при локальном 
458
	  бэкапе.
459
	- Предложение по сохранению старых бэкапов после инкремента.
460
 
461
Alexandr Zhukov <sacha@ic.vrn.ru>
462
	- Замечание по неправильной работе правила для исключения 
463
	  директории из бэкапа.
464
 
465
Zherdev Anatoly <tolyar@mx.ru>
466
	- Патч и идея введения директивы $cfg_stopdir_prune, для отключения
467
	  рекурсивного просмотра директорий, запрещаемых для помещения в бэкап.
468
 
469
Priamikov Alexei <apriam@info.novsu.ac.ru>
470
	- Обнаружение ошибки в fsrestore.sh