- Вопрос или проблема
- Ответ или решение
- Почему rsync не устанавливает правильные разрешения файлов при передаче с локального на удаленный сервер
- Основная проблема
- 1. Настройки Samba
- 2. Установка разрешений при передачи через rsync
- 3. Поведение rsync при удаленной передаче
- 4. Установка битов исполнения
- Заключительные рекомендации
Вопрос или проблема
Я пытаюсь скопировать файл с сервера A (Raspberry Pi) на сервер B (NAS). На сервере A файл имеет -rw-rw-r--
. Я хочу, чтобы файл имел права -rw-r--r--
после передачи.
umask равен 0022
на каждом сервере. Если я создаю файл на сервере B… touch test file
, он получает такие права:
-rw-r--r-- 1 root root 0 Oct 20 16:21 testfile
Когда я выполняю эту команду rsync с сервера B (удаленно на локальный):
rsync -itrvv --info=progress2 --include="*mymovie*" --exclude="*" "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
После передачи права файла: -rwxr-xr-x
Я уже не понимаю, почему все биты выполнения установлены?
Вместо этого, если я запускаю это с сервера B (удаленно на локальный):
rsync -itrvvp --info=progress2 --include="*mymovie*" --exclude="*" --chmod=F644 "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
Теперь после передачи права файла: -rw-r--r--
как и ожидалось. Но я не понимаю, почему мне пришлось специально установить права, чтобы получить стандартные права файла -rw-r--r--
для этого сервера?
Но если я запускаю эти команды с сервера A, права файла никогда не бывают -rw-r--r--
после передачи.
Когда я выполняю эти команды с сервера A (локально на удаленный):
rsync -itrvv --info=progress2 --include="*mymovie*" --exclude="*" "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
sudo rsync -itrvvp --info=progress2 --include="*mymovie*" --exclude="*" --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
sudo rsync -itrvvp --info=progress2 --include="*mymovie*" --exclude="*" --chmod=F644 "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
В каждом случае после передачи на сервер B (NAS) права файла всегда: -rwxr--r--
.
Мой вопрос: Как мне дать файлу mymovie.mp4
права -rw-r--r--
после использования rsync для передачи с сервера A на сервер B когда я запускаю команду rsync с сервера A? (т.е.: локально на удаленный). Почему добавляются биты выполнения?
Некоторая дополнительная информация: Исходные и конечные папки (на серверах A и B) открыты как Samba ресурсы. На сервере B (NAS) так определен ресурс:
[Harddisk]
comment = Жесткий диск
path = /media/hdd
guest ok = Да
read only = Нет
valid users = root kids
admin users = root
force create mode = 0600
force directory mode = 0700
wide links = да
follow symlinks = да
А затем я монтирую это с сервера A (Pi), используя -cifs в systemd вот так:
[Unit]
Description=Монтировать внутренний HDD на сервере B (NAS) на сервер A (Raspberry Pi):
[Mount]
What=//192.168.1.104/Harddisk
Where=/media/hdd/movies
Type=cifs
Options=x-mount.mkdir,noperm,_netdev,nofail,uid=1000,gid=1000,dir_mode=0755,file_mode=0644,credentials=/etc/login.cred
TimeoutSec=30
[Install]
WantedBy=multi-user.target
Обновление: Относительно моего первого теста выше: Запуск команды rsync с сервера B (удаленно на локальный). Почему все биты выполнения устанавливаются после передачи файла?
Я внес изменения в параметры -cifs, которые автоматически монтировали samba ресурс, с которого копировался файл (сервер A) c другим file_mode 0644
и dir_mode 0755
, и теперь биты выполнения не устанавливаются. Но я всё ещё не полностью это понимаю.
Что касается остальной части моего запроса: Запуск команды rsync с сервера A (локально на удаленный). Я также обновил параметры -cifs, чтобы уточнить использование file_mode и dir_mode, как указано выше. Я также поэкспериментировал с определениями ресурса Samba на сервере B (smb.conf) и, комбинируя force create mode
с create mask
, я смог заставить файлы иметь определенные права, когда rsync копирует их в этот Samba ресурс. Однако я все еще не могу заставить rsync давать файлам любые права, которые он хочет, после их передачи на удалённый Samba ресурс. Я установил unix extensions = Yes
, но они, похоже, не соблюдаются.
Ответ или решение
Почему rsync не устанавливает правильные разрешения файлов при передаче с локального на удаленный сервер
Передача файлов между серверами — часто встречающаяся задача в области IT, и использование инструмента, такого как rsync
, может показаться идеальным решением. Однако, как показывает ваш опыт, возникают проблемы с разрешениями файлов. В этой статье мы разберем, почему rsync
может не устанавливать разрешения файлов так, как вы ожидаете, при передаче файлов от серверов A (Raspberry Pi) к серверу B (NAS), и предложим рекомендации для решения этой проблемы.
Основная проблема
Ваша задача заключается в том, чтобы передать файл mymovie.mp4
с разрешением -rw-r--r--
с сервера A на сервер B. Однако после передачи вы получаете -rwxr--r--
, что указывает на то, что бит выполнения добавляется к файлу. Это поведение можно объяснить несколькими причинами.
1. Настройки Samba
Ваши настройки Samba на сервере B содержат параметры force create mode
и force directory mode
, которые могут влиять на разрешения создаваемых файлов. Но это лишь часть решения. Вы также указали file_mode
и dir_mode
в параметрах монтирования CIFS на сервере A, что влияет на разрешения файлов, создаваемых на смонтированном ресурсе.
Рекомендация: Убедитесь, что ваши параметры Samba (включая create mask
) и настройки монтирования CIFS согласованы. Это может включать и использование опции create mask
в вашем файле конфигурации Samba:
create mask = 0644
2. Установка разрешений при передачи через rsync
Когда вы выполняете передачу с помощью rsync
от сервера A к серверу B, исходные разрешения файлов в основном определяются конфигурацией на стороне удаленного сервера (в вашем случае — сервер B). Чтобы установить конкретные разрешения, вы можете использовать опцию --chmod
.
В вашем случае, вы смогли добиться нужных разрешений с помощью команды:
rsync -itrvvp --info=progress2 --include="*mymovie*" --exclude="*" --chmod=F644 "/media/ubuntu/movie/mymovie.mp4" /media/hdd/movies
3. Поведение rsync при удаленной передаче
При передаче файлов с сервера B на сервер A, вы заметили, что выполнение rsync
с определением управления разрешениями не дает результата. Это связано не только с тем, как rsync
обрабатывает файлы, но и как система (в данном случае Samba) управляет разрешениями.
Система Samba может обрабатывать установленные разрешения в соответствии с либо force create mode
, либо create mask
, что может привести к неправильному отображению разрешений файлов, перенаправленных из одной системы в другую.
4. Установка битов исполнения
Проблема, из-за которой установка битов исполнения проявляется (например, -rwxr-xr-x
), может быть связана с тем, как передача файлов происходит через CIFS. Когда Samba обрабатывает монтирование, она может установить биты исполнения в соответствии с текущими настройками монтирования и разрешениями, установленными для файлов. У вас уже есть некоторые коррективы, но если биты установки все еще появляются, это может указывать на несоответствие между настройками CIFS и Samba.
Заключительные рекомендации
-
Проверьте настройки Samba: Убедитесь, что конфигурация Samba позволяет установить ожидаемые разрешения. Используйте
create mask
, чтобы установить маски разрешений, которые применяется к создаваемым файлам. -
Используйте параметры chmod rsync: Если вам нужно обеспечить корректные разрешения, обязательно используйте флаг
--chmod
в вашей команде rsync для контроля разрешений файлов. -
Консистентность монтирования: Убедитесь, что параметры
dir_mode
иfile_mode
в файле монтирования CIFS соответствуют вашим ожиданиям относительно разрешений файлов и папок. -
Тестирование и отладка: Протестируйте различные конфигурации на небольших наборах данных, чтобы понять, какие изменения в конфигурации дают желаемые результаты.
Следуя вашим наблюдениям и рекомендациям, вы сможете устранить проблемы с установкой разрешений файлов при передаче данных с одного сервера на другой, и добиться того, чтобы все передаваемые файлы имели правильные разрешения.