
Я работаю над миграцией сервера и столкнулся со следующей проблемой:
Я запускаю rsync для переноса всех данных, но по какой-то причине существует ограничение на глубину папки... Это делается с помощью команды rsync через ssh:
rsync -raz --verbose --update --delete --exclude-from 'rsync-exclude.txt' /home 192.168.70.50:/
70.50 — это новый сервер, и я запускаю команду на старом сервере. Структура папок чрезвычайно глубокая, до 20 папок в глубину.
Итак, большинство файлов и папок копируются, но все из папки глубиной 10 и выше не копируются. Если я указываю более глубокие папки
rsync -raz --verbose --update --delete --exclude-from 'rsync-exclude.txt'/home/user/blablabla/domain/web to 192.168.70.50:/home/user/blablabla/domain
он начинает рекурсивно копировать оставшиеся папки...
Кто-нибудь может это исправить?
решение1
rsync не имеет ограничений на глубину подкаталогов, которые он будет проходить. А точнее, он превышает лимит файловой системы Linux. Я только что скопировал что-то глубиной около 500 уровней, и rsync скопировал это просто отлично.
Если у вас возникла эта проблема, проверьте следующее:
- Неужели целевая файловая система не способна обработать такое количество подкаталогов?
- место назначения заполнено?
- указывает ли файл --exclude-from на что-то, что ограничивает файлы?
- превышает ли общая длина пути («d/d/d/d» — это 4 уровня, но 7 символов) допустимую файловой системой?
- заставляет ли отключение инкрементальной рекурсии работать?
--no-inc-recursive
(это более новый алгоритм, и вы могли обнаружить ошибку) - работает ли копия с использованием какой-либо другой техники?
- проблема исчезает при сжатии (или без него)?
-z
Вот еще один метод, который можно попробовать. Если он работает, но rsync
не работает, то вы, возможно, нашли ошибку в rsync
:
Это позволит tar
на одной стороне отправить файлы tar-файла на stdout, подключиться по ssh к другой стороне и распаковать файлы там.
SOURCEDIR=/path/to/source
DESTHOST=machinename
DESTDIR=/path/to/destination
cd "$SOURCEDIR" && tar -c -v -f - . | ssh "$DESTHOST" "cd $DESTDIR && tar -x -p -f -"
Предупреждение: если в $DESTDIR есть пробелы или специальные символы, то приведенное выше необходимо будет заключить в кавычки более тщательно.