Резюме проблемы
Я пытаюсь запустить Syncthing как системную службу через systemd на Raspberry Pi, на котором запущен образ сервера Raspberry Pi Ubuntu. Я хочу переместить каталог конфигурации Syncthing и файлы из его местоположения по умолчанию (домашнего каталога пользователя, запускающего его) на внешний диск, смонтированный с помощью /etc/fstab.
Проблема, с которой я столкнулся, заключается в том, что Syncthing не может записывать в каталог конфигурации в смонтированной файловой системе, когда пользователь, запускающий Syncthing, не владеет файлами, даже если пользователь должен иметь rw- унаследован от своей группы.
У меня нет проблемы, когда файлы / каталоги в смонтированной файловой системе принадлежат пользователю, запускающему Syncthing.
Конфигурация
Система
- Raspberry Pi 4
- Ubuntu 20.04.2
- Ядро 5.4.0-1036-распи
- Syncthing версии 1.17.0, установленной из https://apt.syncthing.net/
- Системный 245.4-4ubuntu3.7
Настраивать
Я создал пользователя syncuser для запуска службы синтеза. Вот результат id для этого пользователя:
$ id syncuser
uid=1001(syncuser) gid=1001(syncuser) groups=1001(syncuser),1200(drives)
Я установил жесткий диск с этим /etc/fstab Вход:
UUID=<UUID_HERE> /mnt/external-drive ntfs defaults,auto,users,rw,nofail,noatime,uid=1000,gid=1200,dmask=0007,fmask=0117,x-systemd.device-timeout=30 0 0
Системная служба включена после эта документация.
$ systemctl enable syncthing@syncuser.service
$ systemctl start syncthing@syncuser.service
Это стандартный файл модуля systemd:
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
StartLimitIntervalSec=60
StartLimitBurst=4
[Service]
User=%i
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logflags=0
Restart=on-failure
RestartSec=1
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Я отменяю ExecStart в блоке с использованием sudo systemctl edit syncthing@.service чтобы указать каталог конфигурации:
[Service]
ExecStart=
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --home=/mnt/external-drive/syncthing-config/ --logflags=0
Вот как выглядит каталог:
$ ls -al /mnt/external-drive/syncthing-config/
drwxrwx--- 1 ubuntu drives 4096 Jun 20 12:02 .
drwxrwx--- 1 ubuntu drives 4096 Jun 20 04:10 ..
-rw-rw---- 1 ubuntu drives 7783 Jun 20 12:02 config.xml
Детали проблемы
/mnt/external-drive/syncthing-config/config.xml это файл, в который Syncthing не может записывать. Пользователь, запустивший службу, syncuser и принадлежит к группе drives.
Сразу после запуска сервиса вижу это в journalctl журналы:
WARNING: chmod /mnt/external-drive/syncthing-config: operation not permitted
Затем все работает, как ожидалось, пока я не попытаюсь выполнить действие (через графический интерфейс Syncthing), которое изменяет конфигурацию / настройки. При попытке сохранить настройки вижу в логах:
WARNING: Saving config: chmod /mnt/external-drive/syncthing-config/config.xml: operation not permitted
WARNING: Failed to save config: chmod /mnt/external-drive/syncthing-config/config.xml: operation not permitted
Вопрос
Если я изменю владельца файлов / каталогов на того же пользователя, у которого запущена служба Syncthing (syncuser) все работает, как ожидалось, и я не вижу ошибок выше, однако я не хочу, чтобы этот пользователь владел всем в смонтированной файловой системе, потому что другие программы будут работать в других каталогах.
Как разрешить Syncthing писать на /mnt/external-drive/syncthing-config не сделав его владельцем всей смонтированной файловой системы?
