Всегда рекомендуется делать резервные копии важных данных (документов, изображений, музыки и т. д.),
Например. худший случай для студентов – потерять данные дипломов или курсовых работ.
Резервная копия должна храниться на флэш-накопителе USB.
Но я также хотел сохранить удаленные файлы на пару дней, в случае случайного удаления файлов.
Есть много способов выполнить эту задачу, но я решил использовать для этой цели rsync и cronjob.
Оба инструмента делают процесс резервного копирования очень гибким.
Очень легко управлять временем процесса резервного копирования cronjobs, а rsync упрощает изменение адресата (например, другой папки, устройства или удаленного хоста).
Моя идея состояла в том, чтобы добавить cronjob, чтобы запустить скрипт bash, который использует rsync для копирования каталогов и файлов на флешку.
Но имена устройств флеш-накопителей меняются, если вы подключаете их в другом порядке.
Чтобы избежать этой проблемы, я добавил правило udev для создания символической ссылки каждый раз, когда флешка подключена.
Добавьте правило udev для создания символической ссылки
Прежде всего, нужно было выяснить имя устройства флеш-накопителя.
Поэтому я подключил его и посмотрел на разделы:
$ cat /proc/partitions
Эти две строки были наиболее интересными из результатов:
major minor #blocks name [...] 8 0 1007616 sda 8 1 1007584 sda1
Название моего USB-накопителя на 1 ГБ – /dev/sda1.
Но мне нужно было больше информации (идентификатор продавца, идентификатор продукта и серийный номер) флеш-накопителя, чтобы добавить правило udev. я использовал
$ lsusb -v
чтобы получить подробную информацию обо всех устройствах USB, которые подключены.
Вот выдержка из вывода со всей необходимой мне информацией:
Bus 001 Device 005: ID 03ce:2d4f Kingston Technology Company Inc. Device Descriptor: [...] idVendor 0x03ce Kingston Technology Company Inc. idProduct 0x2d4f DataTraveler [...] iSerial 3 917C140607D8 [...]
Правила udev находятся в /etc/udev/rules.d и имеют «специальное» имя файла.
Префикс – это число, за которым следует имя, а суффикс – .rules.
Все правила udev обрабатываются в лексическом порядке, т. е. вы можете установить порядок правил udev с префиксом правила.
Я создал файл с именем 80-backup.rules в файле /etc/udev/rules.d.
Содержимое файлов правил udev является ключевыми, парами значений, и для этой цели наиболее важными являются KERNEL и ATTR.
Значение KERNEL сопоставляется с именем устройства ядра, а значения ATTR сопоставляются с атрибутами устройства (я не хочу вдаваться в подробности).
Я использовал “?” чтобы избежать изменения имен устройств флеш-накопителя. Это содержание моего созданного правила udev:
KERNEL=="sd?1", ATTRS{idVendor}=="03ce", ATTRS{idProduct}=="2d4f", \ ATTRS{serial}=="917C140607D8", SYMLINK+="usbbackup"
Значение SYMLINK usbbackup – это имя символической ссылки, которая создается в /dev каждый раз, когда устройство подключено, т. е. Символическая ссылка автоматически указывает на правильное устройство.
Вам необходимо перезагрузить правила udev или перезапустить демон udev, чтобы «активировать» правило udev.
В моем случае (Slackware Linux) я использовал:
$ /etc/rc.d/rc.udev restart
Теперь правило udev активируется и будет создавать символическую ссылку каждый раз, когда устройство будет подключено.
Обновить:
В Arch Linux вам не нужно перезагружать демон udev, он автоматически обнаруживает изменения.
Просто подключите USB-накопитель снова, и символическая ссылка должна быть доступна.
Скрипт резервного копирования
Следующий скрипт отражает данные каталоги в BACKUP_FOLDERS на флеш-накопитель, то есть если вы удалите файл в исходном каталоге, он также будет удален на флеш-накопителе, и восстановить эти файлы не удастся.
Но у rsync есть опция –backup-dir для перемещения всех удаленных файлов в исходный каталог.
Это хороший вариант, поскольку зеркальная папка на флеш-накопителе будет обновлена, и все удаленные файлы будут сохранены в другом каталоге.
Я использовал переменную DELFILES для определения папки всех удаленных файлов.
Я также хотел знать, был ли процесс резервного копирования успешным или произошла ошибка.
Скрипт добавляет каждый вывод в LOGFILE, который окружен сообщением о запуске и остановке резервного копирования.
#!/bin/bash
DEST_DRIVE="/dev/usbbackup" # Backup will be stored on this device
DEST_MOUNT="/mnt/flashdrive" # Mount point of flash drive
BACKUP_FOLDERS=("/path/to/dir1" "/path/to/dir2") # Backup folders
LOGFILE="/var/log/mybackup.log" # Logfile
DELFILES="$DEST_MOUNT/delted_files" # Path to folder for deleted files
THRESHOLD=10 # keep deleted files for 10 days
# write first parameter $1 to logfile
function write_to_log
{
# get current date and time
bkp_date=$(date +%Y-%m-%d@%H:%M:%S)
echo -e "$bkp_date : $1" >> $LOGFILE
}
# Append log entry
write_to_log "====== Starting Backup ======"
# test whether symbolic link to flash drive exists
if [ ! -h $DEST_DRIVE ]; then
write_to_log "[X] Error: Backup drive not available"
write_to_log "====== Backup finished ======\n\n"
exit 1
fi
# check whether mount point is in use
if [ ! -z "$(mount -l | grep ${DEST_MOUNT})" ]; then
write_to_log "[X] Error: Mount point already in use"
write_to_log "====== Backup finished ======\n\n"
exit 1
fi
# Mount flash drive
mount $DEST_DRIVE $DEST_MOUNT
if [ $? -ne 0 ]; then
write_to_log "[X] Error: Could not mount flash drive"
write_to_log "====== Backup finished ======\n\n"
exit 1
fi
# delete all files from $DELFILES older than $THRESHOLD days
if [ -d "${DELFILES}" ]; then
find $DELFILES -type f -mtime $THRESHOLD -delete >> $LOGFILE
fi
# copy files (create backup)
for f in ${BACKUP_FOLDERS[@]}; do
# check if given file is directory and readable
if [ -d $f ] && [ -r $d ]; then
rsync -avbuz --delete --backup-dir=$DELFILES $f $DEST_MOUNT >> $LOGFILE
fi
done
# flush file system buffer
sync
# unmount flash drive
umount $DEST_MOUNT
if [ $? -ne 0 ]; then
write_to_log "[X] Error: Could not unmount flash drive"
fi
write_to_log "====== Backup finished ======\n\n"
Настройка задания cron
Последний шаг – добавить cronjob для запуска скрипта в данный момент времени.
Демон cron предоставляет четыре каталога cron.hourly, cron.daily, cron.weekly и cron.monthly для запуска скриптов / программ.
Я скопировал скрипт в каталог cron.daily, чтобы ежедневно запускать скрипт.
Убедитесь, что скрипт является исполняемым («chmod u + x backup.sh»), и флеш-устройство подключено.
Вы можете посмотреть время выполнения ежедневных cronjobs на crontab:
$ crontab -l
Вот выдержка из моего вывода:
# Run hourly cron jobs at 47 minutes after the hour:
47 * * * * /usr/bin/run-parts /etc/cron.hourly 1> /dev/null
#
# Run daily cron jobs at 4:40 every day:
40 4 * * * /usr/bin/run-parts /etc/cron.daily 1> /dev/null
#
# Run weekly cron jobs at 4:30 on the first day of the week:
30 4 * * 0 /usr/bin/run-parts /etc/cron.weekly 1> /dev/null
#
# Run monthly cron jobs at 4:20 on the first day of the month:
20 4 1 * * /usr/bin/run-parts /etc/cron.monthly 1> /dev/null
В моем случае скрипт резервного копирования будет выполнен в 04:40.
Если вы хотите изменить время, вы можете использовать:
# crontab -e
Чтобы создавать резервные копии с помощью Time Machine, требуется лишь внешний накопитель. После того как вы подключите накопитель и выберите его в качестве диска резервного копирования , Time Machine будет автоматически выполнять почасовое резервное копирование за последние 24 часа, ежедневное резервное копирование за последний месяц и еженедельное резервное копирование за все прошедшие месяцы. Самые старые резервные копии удаляются по мере заполнения диска.