rsync и символические ссылки

69

Я хочу сделать резервную копию моего домашнего каталога на внешний диск каждую ночь, используя cronзадание для выполнения rsync. Я не уверен в точном поведении rsyncфлагов символических ссылок России.

  1. rsync's -aфлаг включает в себя -lфлаг (то есть "копировать символические ссылки как символические ссылки"). Означает ли это, что он просто скопирует ссылку или будет следовать по ссылке и скопировать все в каталоге ссылки? Я хочу избежать этого, потому что у меня есть ссылки на каталоги, заполненные мультимедийными файлами, которые включают копирование сотен гигабайт, резервное копирование которых мне не нужно.
  2. Опасаясь (но не уверен), что rsync -aбудут копироваться все эти медиа-файлы, я вместо этого добавил --no-linksфлаг. Это не похоже на поведение, которое я хочу. Он просто игнорирует копирование любой ссылки, что проблематично, потому что у меня есть ссылки, которые я хочу скопировать (например, ссылки на общие заголовочные файлы из разных каталогов проекта).
  3. Если предположить, --no-linksчто я действительно хочу № 1 (без флага), это то, что я действительно хочу, и он просто копирует ссылку, не копируя файлы, на которые ведут ссылки, будут ли ссылки разрываться при резервном копировании? Например , я , возможно , rsyncисточник каталога /home/me/projects/miscв /media/extdrive/backup/home/me/projects/misc. В этом случае я полагаю, что rsyncон недостаточно умен и не пытается исправить содержимое символических ссылок для относительных изменений каталога. Это верно? Это нормально, это не имеет значения, если ссылки в каталогах резервных копий будут повреждены, если они будут исправлены и работают, если наступит такое время, когда их нужно будет восстановить.
Sean
источник
3
Флаг -L, вероятно, то, что вы хотите. На справочной странице rsync в Centos Linux: «-L, --copy-links преобразует символическую ссылку в референтный файл / dir». Я рекомендую проверить это с некоторыми примерами каталогов и ссылок, чтобы убедиться, что вы не перезаписываете данные, которые не собираетесь использовать. Отредактировано, чтобы включить предупреждение о возможной потере данных. ;)
Мик Т

Ответы:

90
  1. «Копировать символические ссылки как символические ссылки» означает именно то, что говорится: если rsync увидит символическую ссылку в исходном каталоге, он создаст идентичную символическую ссылку в месте назначения. Ничего больше.

    (Несколько строк на странице справочника, другая опция, --copy-linksописывает противоположное поведение (всегда копирование данных), которое вы назвали нежелательным.)

    Смотрите также раздел «Символические ссылки»:

    Если --linksуказан, то символические ссылки воссоздаются с той же целью в месте назначения.

  2. Это не то поведение, которое вам нужно, потому что вы неправильно истолковываете то, что --linksделает, и поэтому просите о неправильном поведении (см. Ответ № 1).

  3. По умолчанию он точно копирует место назначения .

    То есть, если ссылка указывает на абсолютный путь (например /home/me/projects), она будет продолжать указывать на тот же путь; он не сломается , он просто продолжит указывать на файл в вашем домашнем каталоге, а не на тот, который находится в вашей резервной копии.

    Между тем, если ссылка указывает на относительный путь (например ../../projects), она также будет продолжать указывать на тот же путь, но, поскольку она связана с расположением символической ссылки, символическая ссылка в вашей резервной копии также будет указывать на файл в вашей резервной копии.

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

grawity
источник
2
ммм так какая разница между --copy-linksа --links?
Александр Миллс
--copy-links= -Lи --links= -l. См. Описание из документации в моем ответе здесь: superuser.com/a/1388910/425838
Габриэль Стейплс
12

У @grawity отличный ответ, но вот скриншот с некоторой соответствующей информацией из документации. Вот точная формулировка -lи -Lвариант, например, которые кажутся наиболее значимыми из них идет речь:

введите описание изображения здесь

Источник: https://linux.die.net/man/1/rsync или man rsyncсправочные страницы по Linux.

Также обратите внимание, что опция -a( --archive) также включает в себя эту -lопцию, которая является удивительной, поскольку мне действительно нравится использовать эту -lопцию, чтобы сохранить мои символические ссылки из источника в качестве символических ссылок на месте назначения. Из справочных страниц:

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)

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

... делать холостые прогоны, протоколирование потоки вывода в (отдельные) файлы, показывая статистику, используя заголовочный файл путь и исключить файл , и т.д., см моего полный ответа здесь под 2 - ем секции, под названием " 2. Rsync командной строки инструмент (Linux, Windows с Cygwin) ": https://superuser.com/a/1464264/425838

Габриэль Стейплс
источник