
Ако управлявате Linux сървъри или просто имате компютър с данни, които не можете да си позволите да загубите, научаването на използването им... rsync за автоматизиране на архивирането Това е практически задължително. Няма нужда да настройвате скъп пакет или да разчитате на собствени инструменти: с няколко добре обмислени команди можете да имате солидна, ефективна и лесна за поддръжка система за архивиране.
В цялото това ръководство ще видите От основите на rsync до разширено редактиранеЛокални архиви, отдалечени архиви чрез SSH, архиви в стил Time Machine със снимки, готови за производство скриптове, cron, системни таймери, изключения, ротации и проверка. Вижте нашите Сравнение на методите за архивиране да се определи стратегия. Идеята е да завършите статията с ясен план и команди, които можете практически да копирате и адаптирате към вашата среда.
Какво е rsync и защо се използва толкова много за архивиране?
Rsync е инструмент за команден ред, предназначен за синхронизиране на файлове и директории между две местоположения, или на един и същ компютър, или между различни машини, обикновено чрез SSH или със собствен демон rsyncd.
Предимството на rsync пред обикновен cp или scp е, че той имплементира интелигентен алгоритъм на диференциален блоков трансферСравнява източника и местоназначението и изпраща само промените, а не целия файл всеки път. Ако имате много данни и променяте само малки части, спестяването на време и трафик е огромно.
Освен това, rsync може запазване на почти всички метаданниразрешения, собственици, групи, времеви отметки, символни връзки, устройства… Ето защо е толкова полезен за „сериозни“ архиви, където не само съдържанието е важно, но и как е настроена файловата система.
Друго важно предимство е, че rsync работи както локално, така и дистанционноМожете да го използвате, за да синхронизирате две папки на един и същ сървър, да изтеглите данни от отдалечен сървър към вашата машина за архивиране или да прехвърлите данни към отдалечен NAS или VPS, използвайки SSH.

Инсталирайте и тествайте rsync на различни дистрибуции
Въпреки че много дистрибуции вече идват с инсталиран rsync, това е добра идея Проверете инсталацията и актуализирайте до по-нова версия. както на изходната, така и на целевата машина, преди да монтирате автоматичните си резервни копия.
На Debian или Ubuntu-базирани системи можете да направите нещо толкова просто, като:
rsync --version
sudo apt update
sudo apt install rsync
В дистрибуции като RHEL, CentOS, Rocky Linux или други производни, процедурата би била много подобна, като се променя мениджърът на пакети, но със същата идея за уверете се, че rsync е наличен и актуален в двете крайности.
rsync --version
sudo dnf install rsync # En sistemas modernos
sudo yum install rsync # En sistemas más antiguos
Основни опции за rsync, които ще използвате през цялото време
Въпреки че rsync има добър арсенал от параметри, на практика за архивиране ще прекарате 90% от времето си, използвайки... малък набор от опции това трябва да се запомни.
Цялостната структура на командата е доста проста, но има един детайл, който добавя много възможности: наклонената черта в края на пътеките променя поведението.
Общ синтаксис:
rsync ORIGEN DESTINO
Ключовата разлика се крие в начина, по който се третира директорията с изходния код:
# Copia el directorio como tal dentro del destino
rsync -av /source/dir /backup/
# Копиране САМО на съдържанието на директорията до местоназначението
rsync -av /source/dir/ /backup/
Някои от най-често използваните опции за архивиране са особено практични, защото Те съчетават много неща в кратък текст.:
- -a: файлов режим. Еквивалентно на -rlptgoD (рекурсивен, запазва символни връзки, разрешения, времеви марки, група, собственик и специални файлове).
- -v: „Подробен“ режим. Показва какво прави и до кои файлове осъществява достъп.
- -z: компресира данни по време на прехвърляне, идеално за отдалечени копия през интернет.
- -h: прави размерите да изглеждат „хубави“ (MB, GB…), идеални за хора.
- -P: комбинира файлове за напредък и частични файлове, за да се види как вървят нещата и да може да се възобнови.
- -Изтрий: изтрива в местоназначението файловете, които вече не съществуват в източника, оставяйки точно копие.
- -n / –dry-run: симулира изпълнението, без да докосва нищо, фантастично е, за да не се объркат нещата.
- –изключване / –изключване-от: ви позволява да изключите шаблони или пълен списък с маршрути, които не искате да копирате.
- –линк-дестинация: създава твърди връзки с предишно копие, основата на инкременталните архиви от типа на Time Machine.
Ръчни локални копия и първи примери
Първата стъпка преди автоматизиране на каквото и да е е да имате ясни и доказани команди за ръчно копиранеНека разгледаме типични случаи, които по-късно ще използваме в скриптове.
Ако искате да клонирате домашната си директория в локален резервен дискМинималната команда би изглеждала така:
rsync -av /home/usuario/ /mnt/disco_backup/usuario/
Този rsync сканира вашия началната страница е пълна, запазвайки разрешенията, датите и структуратаи копира само това, което липсва или се е променило от последния път, което вече е много спретнато инкрементално копие, без да усложнява нещата.
Друг класически пример е синхронизацията данни за проекта, снимки или документи между две папки на един и същ сървър или дори на различни дискове, за да имате винаги достъпна втора локална игра.
rsync -av /media/fotos/ /backup/fotos/
Когато става въпрос за чувствителни системни данни, като например /etc или /var/wwwНормално е да искате копие, което е точно огледално копие, премахвайки от резервното копие това, което изчезва в оригинала. Тук се намесва известната опция за изтриване.
rsync -av --delete /var/www/ /backup/www/
Защитени отдалечени архиви с SSH
Където rsync наистина блести, е когато го комбинирате с SSH за изпращане на копия от сървъраПо този начин можете да съхранявате данните си на друг възел във вашата мрежа, NAS или VPS в интернет. По този начин не сте зависими от едно-единствено устройство и спазвате част от известното правило 3-2-1 (поне едно копие извън сайта).
В идеалния случай трябва да конфигурирате удостоверяване с публичен ключ, вместо да въвеждате пароли ръчно през цялото време. След като копирате ключа на резервния сървър, командите стават много интуитивни.
# Empujar datos locales a un servidor remoto de backup
rsync -avz /etc/ backup@servidor-remoto:/backups/etc/
# Пренасяне на данни от отдалечен сървър към вашата машина за архивиране
rsync -avz backup@remote-server:/var/www/ /backups/www/
В малко по-прецизни сценарии можете да коригирате SSH криптиране, порт или компресия от самия rsync с -e, например, ако вашият сървър слуша на различен порт или искате да оптимизирате бавна връзка.
rsync -avz \
-e "ssh -p 2222 -c -o Compression=no" \
/origen/ backup@servidor-remoto:/destino/
Полезен трик, когато има слаби връзки или споделени мрежи, е да използвате –bwlimit, за да се избегне претоварване на връзката и да не оставяте никого без интернет, докато стартирате мащабно архивиране.
rsync -avz --bwlimit=5000 /datos/ backup@servidor-remoto:/backups/datos/
Пълни, диференциални и инкрементални резервни копия с rsync
Въпреки че rsync вече извършва диференциални трансфери на блоково ниво, от гледна точка на стратегията за архивиране си струва да се обмисли. три вида копия: пълни, диференциални и инкременталникоито можете да имплементирате директно с опциите на rsync.
Пълното копие е лесно: то пресъздава цялото съдържание на източника в местоназначението, идеално като първоначално архивиране или за да имате чиста референция.
# Copia completa de un árbol de directorios
rsync -a /ruta/origen/ /ruta/destino/
Диференциалното копиране се основава на тази основа и се фокусира върху поддържане на съответствие между местоназначението и източника, копиране на промените и премахване на това, което вече не съществува. Това обикновено имате предвид, когато говорите за... имат огледало на системата.
# Copia diferencial, manteniendo el destino idéntico al origen
rsync -a --delete /ruta/origen/ /ruta/destino/
Най-сочното е „истинското“ инкрементално архивиране, където освен синхронизирането, Запазвате истории по дата, без да дублирате данниТук влиза в действие опцията –link-dest, която създава твърди връзки към предишно копие за файлове, които не са се променили.
# Copia incremental apoyada en una copia previa
rsync -a --link-dest=/ruta/a/copiaprevia \
/ruta/origen/ /ruta/destino-incremental/
С този подход всяка папка за архивиране изглежда като пълно копие, но вътрешно Идентични файлове споделят блокове на дискаТова значително намалява използваното пространство и позволява лесна навигация през историческите моментни снимки.
Архивиране в стил Time Machine със снимки и твърди връзки
Много хора искат да възпроизведат в Linux удобството на macOS Time Machine със своите моментни снимки по датаС rsync това е напълно възможно чрез комбиниране на --link-dest, малко shell и известна организация.
Идеята е да се поддържа текуща директория, която сочи към последното добро архивиране, и едновременно с това да се създава папки с времева маркировка (дата-час) които представляват всяка снимка. Непроменените файлове са свързани с твърди връзки към предишната снимка, а нови блокове се записват само когато има действителни разлики.
Типична команда в тази схема може да бъде нещо подобно:
rsync -avPh --delete \
--link-dest="$TARGETDIR/current" \
"$SOURCEDIR/$USER/" \
"$TARGETDIR/$USER-$TIMESTAMP"
След това скрипт се грижи за актуализирането на символната връзка актуален, така че винаги да сочи към най-новата снимкаи да поддържате малка история, организирана по дата. С това можете да преглеждате по-стари копия, просто като влезете в папката, която ви интересува.
Автоматизацията идва естествено: запазвате скрипта в нещо подобно /usr/local/bin/rsync-времева-машина и го планирайте да се изпълнява ежедневно с cron в най-удобното за вас време.
0 5 * * * bash /usr/local/bin/rsync-time-machine
Автоматизирайте архивирането с cron ежедневно
Идва момент, в който правенето на копия на ръка вече няма смисъл; нормалното нещо, което трябва да се направи, е Планиране на архивиране с cron така че да се стартират автоматично извън пиковите часове (например рано сутрин) и да можете да забравите за тях, освен да проверявате логовете от време на време.
Процесът винаги е един и същ: подготвяте скрипт, който прави пълното копие с всички опции (изключения, лог файлове и т.н.), давате му права за изпълнение и го включвате в crontab на съответния потребител или в root, ако това включва достъп до цялата система.
Пример за прост скрипт за локално копиране може да бъде:
#!/bin/bash
SOURCE_DIR="/home"
BACKUP_DIR="/backup/home"
LOG_FILE="/var/log/backup/rsync-local.log"
DATE=$(date +"%Y-%m-%d %H:%M:%S")
mkdir -p «$BACKUP_DIR» «$(име_на_директория «$LOG_FILE»)»
echo "Локалното архивиране е стартирано" >> "$LOG_FILE"
rsync -av –изтриване
–изключване='*.tmp'
–изключване='.кеш'
–exclude='Изтегляния/*' \
«$SOURCE_DIR/» «$BACKUP_DIR/» >> «$LOG_FILE» 2>&1
ако; тогава
echo » Архивирането е завършено успешно» >> «$LOG_FILE»
още
echo » Архивиране с грешки» >> «$LOG_FILE»
fi
След като например имате скрипта, /usr/local/bin/rsync-local-backup.sh И маркиран като изпълним файл, го добавяте към cron, така че да се изпълнява в определено време.
sudo chmod +x /usr/local/bin/rsync-local-backup.sh
sudo crontab -e
Вътре в crontab можете да поставите нещо подобно:
0 2 * * * /usr/local/bin/rsync-local-backup.sh
Systemd таймери: модерна алтернатива на cron
В съвременните системи често си струва Използвайте системни таймери вместо cronособено ако искате по-добре да интегрирате услуги, да управлявате мрежовите зависимости или да имате централизирани лог файлове в journalctl.
Идеята е да се дефинира услуга, която изпълнява вашия скрипт за архивиране, и таймер, който показва кога да се стартира. Услугата може да бъде нещо подобно:
Description=Rsync Backup Service
After=network-online.target
Wants=network-online.target
Тип=еднократно
ExecStart=/usr/local/bin/rsync-remote-backup.sh
Потребител=root
StandardOutput=дневник
StandardError=дневник
Време за изчакване = 7200 сек.
WantedBy = multi-user.target
И свързаният таймер би бил дефиниран както следва, за a ежедневно архивиране в 2:00 ч. с известна случайност, за да не се претовари всичко наведнъж:
Description=Daily Rsync Backup Timer
Requires=rsync-backup.service
В Календар=*-*-* 02:00:00
Постоянно=вярно
РандомизираноЗакъснениеСек=10мин
WantedBy=timers.target
С това остава само да презаредите systemd, да активирате таймера и да проверите дали програмира правилно и че Сервизният дневник показва, че копията се стартират, когато му дойде времето.
sudo systemctl daemon-reload
sudo systemctl enable --now rsync-backup.timer
systemctl list-timers
journalctl -u rsync-backup.service
Организирайте ротиращи се резервни копия: ежедневно, седмично и месечно
Ако искате нещо малко по-сложно от едно статично копие, можете да настроите структура от ротиращи резервни копия: ежедневно, седмично и месечноизползване на твърди връзки за пестене на място и намиране за почистване на стари файлове.
Класическият модел включва наличието на текуща директория, която се актуализира всеки път с rsync, и след това клониране на това дърво с твърди връзки към дневни, седмични и месечни папки в зависимост от деня.
#!/bin/bash
SOURCE_DIR="/var/www"
BACKUP_ROOT="/backup/www"
CURRENT="$BACKUP_ROOT/current"
DAILY="$BACKUP_ROOT/daily"
WEEKLY="$BACKUP_ROOT/weekly"
MONTHLY="$BACKUP_ROOT/monthly"
DATE=$(date +%Y%m%d)
DOW=$(date +%u)
DOM=$(date +%d)
mkdir -p «$ТЕКУЩ» «$ДНЕВНО» «$СЕДМИЧНО» «$МЕСЕЧНО»
rsync -av –delete –link-dest=»$CURRENT» \
«$SOURCE_DIR/» «$CURRENT/»
&& cp -al «$CURRENT» «$DAILY/$DATE»
&& cp -al «$CURRENT» «$WEEKLY/$DATE»
&& cp -al «$ТЕКУЩ» «$МЕСЕЧЕН/$ДАТА»
намиране на «$DAILY» -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;
намиране на „$WEEKLY“ -maxdepth 1 -type d -mtime +28 -exec rm -rf {} \;
намиране на „$МЕСЕЧНО“ -maxdepth 1 -type d -mtime +365 -exec rm -rf {} \;
С тази система имате сравнително разумен исторически прозорец без да се запълва дискът с пълни копия, а всяка снимка остава достъпна като нормална папка.
Ако данните ви се променят бързо или са много големи, можете да коригирате периодите на съхранение, честотата или дори да комбинирате това със снимки на LVM или ZFS, за да осигурите съгласуваност на базите данни или виртуалните машини.
Следете, проверявайте и открийте дали вашите резервни копия са полезни.
Ежедневното изпълнение на задачи за архивиране е чудесно, но ако никой не провери резултата Няма да ти помогне много. Важно е да настроиш някакъв основен мониторинг, за да знаеш дали и кога е направено последното архивиране.
Една проста тактика е да оставяте малък маркер в целевата папка всеки път, когато архивирането завърши успешно, например файл .last-backup-success с датата. След това външен скрипт или дори проверка от Nagios/Icinga може да ви предупреди, ако този файл е твърде стар.
MARKER="/backup/www/.last-backup-success"
if ; then
echo "Marcador de backup no encontrado"
exit 1
fi
Друг здравословен навик е да проверявате Проверете лог файловете на rsync за грешки или необичайни скорости на трансферСкрипт, който извлича статистически данни като „Брой файлове“, „Общ размер“, „Ускорение“ и други подобни, ви дава бърза представа за това как вървят нещата.
И, разбира се, това, което наистина прави разликата, е да свикваш с това от време на време. да се направи истинска реставрацияВземете конкретен файл, възстановете версия от вчера или миналата седмица и проверете дали се отваря правилно. Това е единственият начин да сте сигурни, че ако един ден всичко се обърка, вашите резервни копия ще се справят със задачата.
Ако обедините всички тези части – добре конфигуриран rsync, автоматизация с cron или systemd, разумна ротация, мониторинг и тестване за възстановяване – ще получите надеждна, гъвкава и евтина система за архивиране на Linux, който се възползва максимално от предимствата на безплатния софтуер, без да ви принуждава да се отказвате от удобството или надеждността.
