Почему не удается синхронизировать запись в файл конфигурации на подключенной внешней файловой системе?

Резюме проблемы

Я пытаюсь запустить 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 не сделав его владельцем всей смонтированной файловой системы?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *