Проблема в том, что FUSE запрещает доступ к статистике другим пользователям, включая root. Rsync требует доступа к статистике для всех указанных исходных файлов и каталогов. Но когда процесс rsync, принадлежащий другому пользователю, указывает точку монтирования FUSE, FUSE отказывает этому процессу в доступе к атрибутам точки монтирования, в результате чего rsync выдает указанную ошибку «отказано в доступе». Решение Mauricio Villega работает, говоря rsync пропускать точки монтирования FUSE, перечисленные командой mount. Вот еще одна версия решения Villega, в которой указывается белый список типов файловых систем с помощью команды findmnt. Я выбрал ext3 и ext4, но вы можете добавить другие типы по мере необходимости.
#!/bin/sh
# Which paths to rsync (note the lack of trailing slash tells rsync to preserve source path name at destination).
SOURCES=(
/home
)
# Which filesystem types are supported.
FSTYPES=(
ext3
ext4
)
# Rsync each source.
for SOURCE in ${SOURCES[@]}; do
# Build exclusion list (array of "--exclude=PATH").
excludedPaths=$(findmnt --invert --list --noheadings --output TARGET --types $(IFS=',';echo "${FSTYPES[*]}"))
printf -v exclusionList -- "--exclude=%s " ${excludedPaths[@]}
# Rsync.
rsync --archive ${exclusionList[@]} --hard-links --delete --inplace --one-file-system ${SOURCE} /backup
done
Обратите внимание, что он создает список исключений внутри цикла, чтобы решить фундаментальную проблему этого решения. Эта проблема возникает из-за rsync из действующей системы, где пользователь может создавать новые точки монтирования FUSE во время работы rsync. Список исключений необходимо обновлять достаточно часто, чтобы включать новые точки монтирования FUSE. Вы можете разделить домашний каталог на каждое имя пользователя, изменив массив SOURCES, как показано ниже.
SOURCES=(
/home/user1
/home/user2
)
Если вы используете LVM, альтернативным решением является rsync из моментального снимка LVM. Моментальный снимок LVM обеспечивает простое (например, без точек монтирования FUSE) и фиксированное представление логического тома, с которым он связан. Недостатком является то, что вы должны зарезервировать место для действия копирования при записи моментального снимка LVM (COW). Крайне важно отказаться от моментального снимка LVM после того, как вы закончите с ним; в противном случае моментальный снимок LVM будет продолжать увеличиваться в размере по мере внесения изменений. Вот пример сценария, который использует моментальные снимки LVM. Обратите внимание, что нет необходимости создавать список исключений для rsync.
# Create and mount LVM snapshot.
lvcreate --extents 100%FREE --snapshot --name snapRoot /dev/vgSystem/lvRoot
mount -o ro /dev/mapper/snapRoot /root/mnt # Note that only root has access to this mount-point.
# Rsync each source.
for SOURCE in ${SOURCES[@]}; do
rsync --archive --hard-links --delete --inplace --one-file-system /root/mnt/${SOURCE} /backup
done
# Discard LVM snapshot.
umount /root/mnt
lvremove vgSystem/snapRoot
Использованная литература:
"Как FUSE может нарушить резервное копирование Rsync"
person
Aaron Arthurs
schedule
04.01.2019