Rsync -avzHP следует за жесткими ссылками, а не копирует их как жесткие ссылки

Я использую rsnapshot для создания ежечасных / ежедневных / еженедельных / ежемесячных резервных копий моего "рабочего" ресурса. Сейчас я пытаюсь скопировать весь каталог резервного копирования на внешний диск с помощью rsync.

Я использовал эту команду / параметры в сеансе экрана (да, rsync-exclude.txt находится в папке, из которой я запускаю команду)

rsync -avzHP --exclude-from 'rsync-exclude.txt' /share/backup/ /share/eSATADisk1/backup/;

Все это работает на QNAP TS-439, внутренний диск представляет собой EXT4 с одним диском (без RAID), внешний диск - EXT3.

Происходит следующее: Rsync следует за каждой жесткой ссылкой и копирует реальный файл вместо воссоздания обновленной жесткой ссылки на внешнем диске. Я не сразу узнал об этом, поэтому внешний диск оказался поврежденным xxx копиями тех же файлов.

Чего я хочу добиться: скопировать всю файловую структуру, сгенерированную rsnapshot, на внешний диск, сохранив жесткие ссылки для экономии места. Примечание: это не обязательно должно быть сделано с помощью rsync.

Спасибо за ваши идеи и время. Буду признателен за вашу помощь, большое время.

Обновление: я узнал, что rsnapshot не использует символические ссылки, он использует жесткие ссылки, поэтому теперь я использую опцию -H, которая должна сохранять структуру жестких ссылок в соответствии с Rsnapshot для нескольких назначений (или поддерживать структуру жестких ссылок), но все равно не будет работать... что мне здесь не хватает?

Обновление 2: я нашел другое мнение / утверждение по этой теме здесь: rsync с --hard-links замораживает Стивен Понедельник предлагает не пытаться rsync больших файловых структур, содержащих жесткие ссылки, так как он поглощает много памяти и является сложной задачей для rsync. Поэтому, возможно, лучшим решением было бы создание.img структуры данных, которую я пытаюсь сделать резервной копией. Как вы думаете?

4 ответа

Решение

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

Точное местоположение этого порога может зависеть от вашей оперативной памяти и общего количества жестких ссылок (и, возможно, ряда других вещей), но я обнаружил, что нет смысла пытаться определить его точно. Что действительно важно, так это то, что этот порог слишком легко преодолеть в реальных ситуациях, и вы не будете знать, что вы его преодолели, пока не настанет день, когда вы попытаетесь запустить rsync -aH или cp -a что борется и в конечном итоге терпит неудачу.

Я рекомендую следующее: скопируйте жестко связанную файловую систему как единое целое, а не как файлы. То есть скопируйте весь раздел файловой системы как один большой двоичный объект. Для этого есть ряд инструментов, но наиболее распространенным является dd,

При наличии стоковой прошивки ваш QNAP NAS должен иметь dd встроенный, а также fdisk, С fdiskсоздайте на целевом диске раздел размером не менее исходного раздела. Затем используйте dd создать точную копию вашего исходного раздела на только что созданном разделе назначения.

В то время как dd копирование выполняется, вы должны убедиться, что в исходной файловой системе ничего не изменится, чтобы в конечном итоге вы не получили поврежденную копию в месте назначения. Один из способов сделать это umount источник перед началом процесса копирования; Другой способ - подключить источник в режиме только для чтения.

Это долгий путь, но если вы не можете найти другое решение, я бы посоветовал отформатировать USB-накопитель как EXT4. Может быть, это может быть проблема: https://bugzilla.samba.org/show_bug.cgi?id=7670

При наличии достаточно жестких ссылок в исходной папке и достаточно небольшого целевого тома копирование с помощью rsync --hard-links может завершиться неудачно. Rsync терпит неудачу из-за исчерпания максимального количества жестких ссылок в месте назначения <...> реальная проблема не в rsync, а в базовой файловой системе.

-l для символических ссылок, зачем делать что-то для жестких ссылок?

(Извините, это ответ, а не комментарий, у меня еще нет прав на комментарии, и на этот ответ нужен ответ)

Еще одно замечание, которое должно быть комментарием: это все аппаратное обеспечение или вы на виртуальной машине, монтируете сеть?

редактировать

игнорировать мой предыдущий комментарий о том, почему вы используете жесткие ссылки, я пропустил rsnapshot комментарий.

Было бы полезно иметь тест, который сначала проверяет rsync между двумя локальными каталогами на локальном диске, а затем на вашем удаленном диске. Этот маленький тест показывает -H Вариант работы, как и ожидалось. -i вариант для ls показывает inode, таким образом показывая, что ссылки были сохранены, без дополнительных копий.

$ rsync -avzHP src/ dest
sending incremental file list
created directory dest
./
file111_prime.txt
           9 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/3)
file111.txt => file111_prime.txt

sent 156 bytes  received 59 bytes  430.00 bytes/sec
total size is 18  speedup is 0.08

$ ls -liR
.:
total 8
414044 drwxrwxr-x. 2 nhed nhed 4096 Feb 25 09:58 dest
414031 drwxrwxr-x. 2 nhed nhed 4096 Feb 25 09:58 src

./dest:
total 8
414046 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111_prime.txt
414046 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111.txt

./src:
total 8
414032 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111_prime.txt
414032 -rw-rw-r--. 2 nhed nhed 9 Feb 25 09:57 file111.txt

Последующий тест rsync -avzHP src/ host:/tmp на удаленный хост по-прежнему сохраняются жесткие ссылки

Вы пытались добавить -l вариант?

Я знаю, что на странице руководства написано, что она включена в -a но справочные страницы не всегда на 100% точны.

Другие вопросы по тегам