1

У меня есть два компьютера (оба MacBook Air), для которых я синхронизирую по одному дереву каталогов в обоих, но не весь жесткий диск или какие-либо другие каталоги.

Допустим, на компьютере A каталог /Users/aellett/projects

Допустим, на компьютере B каталог /Users/bellett/projects

Обычно я подключаюсь к компьютеру B а затем удаленно подключаюсь к компьютеру A как пользователь 'aellett'. Как супер пользователь я синхронизирую две директории проекта следующим образом:

rsync -av /Volumes/aellett/projects/ /Users/bellett/projects/

и это работает как ожидалось.

На обоих компьютерах у меня есть другой файл letter.txt в другом каталоге, который не синхронизируется.

Допустим, на компьютере A файл находится в /Users/aellett/letters

На компьютере B файл находится в /Users/bellett/correspondence

Как правило, я не хочу делиться тем, что не включено в /Users/<username>/projects . Но я хочу поделиться этим конкретным файлом.

Так что на обоих компьютерах я сделал correspondence в projects . И тогда я сделал жесткие ссылки следующим образом

На компьютере A:

ln /Users/aellett/letters/letter.txt   /Users/aellett/projects/correspondence/letter.txt

На компьютере B:

ln /Users/bellett/correspondence/letter.txt   /Users/aellett/projects/correspondence/letter.txt

В следующий раз, когда я синхронизировал два компьютера, я сделал следующее

rsync -av -H /Volumes/aellett/projects/ /Users/bellett/projects/

Когда я проверил на компьютере B , /Users/bellett/projects/correspondence/letter.txt был правильно синхронизирован. Но жесткой ссылки на /Users/bellett/correspondence/letter.txt больше не было. Другими словами, /Users/bellett/projects/correspondence/letter.txt был идентичен /Users/aellett/projects/correspondence/letter.txt но отличался от /Users/bellett/correspondence/letter.txt . Поскольку эти два файла были жестко связаны на обоих компьютерах, я ожидал, что они все еще будут иметь жесткую связь.

Почему мои жесткие ссылки не сохраняются?

1 ответ1

3

Я не уверен, что могу объяснить это лучше, чем справочная страница rsync :

-H, --hard-links Указывает rsync искать жестко связанные файлы при передаче и связывать вместе соответствующие файлы на принимающей стороне. Без этой опции жестко связанные файлы в передаче обрабатываются как отдельные файлы.

При обновлении непустого места назначения этот параметр гарантирует, что файлы, которые жестко связаны друг с другом в источнике, жестко связаны вместе в месте назначения. В настоящее время он НЕ пытается разорвать уже существующие жесткие ссылки в месте назначения, которые не существуют между исходными файлами. Однако обратите внимание, что если один или несколько дополнительных связанных файлов имеют изменения содержимого, они будут не связаны после обновления (при условии, что вы не используете опцию --inplace ).

Обратите внимание, что rsync может обнаруживать только жесткие ссылки между файлами, которые находятся внутри набора передачи. Если rsync обновит файл, который имеет дополнительные жесткие связи с файлами за пределами передачи, эта связь будет нарушена. Если вы склонны использовать опцию --inplace, чтобы избежать этой поломки, будьте очень внимательны, чтобы знать, как обновляются ваши файлы, чтобы вы были уверены, что не произойдет непреднамеренных изменений из-за устаревших жестких ссылок (и посмотрите --inplace вариант для большего количества предостережений).

Обратите внимание, что -a не подразумевает -H , и даже если вы добавите -H другая сторона ссылки не будет частью той же передачи (и не может быть, потому что структура окружения каталогов отличается), rsync не видит обе стороны ссылки одновременно, и, следовательно, не может обновить связанный файл в обоих местах. То есть, когда он обновляет /Users/bellett/projects/correspondence/letter.txt, он может сказать, что он связан с чем-то другим (по количеству ссылок), но не знает, где эта ссылка существует. --inplace может решить проблему на месте, но может вызвать и другие проблемы; см. его раздел справочной страницы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .