PrivateTmp: хук записал файл, но куда он делся?
Приватное временное пространство имён скрывает файл, а не удаляет его. Проверьте корень процесса перед изменением юнита, а затем дайте общим данным настоящий путь.
Хуки сообщают об успехе, а тот же путь из оболочки всё ещё выглядит пустым. Оба утверждения могут быть верны одновременно, потому что служба systemd может жить в собственном пространстве имён монтирования с приватным временным каталогом. Когда это понято, интересным становится вопрос, удалась ли запись вообще.
Два временных каталога, один путь
Настройка изоляции даёт юниту приватный вид на временные каталоги, а не делает их доступными только для чтения. Процессы вне юнита не видят, что он туда пишет, а всё, что он оставляет после себя, отбрасывается при остановке юнита. Поэтому путь, напечатанный хуком, и путь, проверенный из оболочки, могут указывать на разные объекты с одним и тем же именем.
Это проблема видимости, и она выглядит как проблема потери данных. Ничего не было удалено, потому что файл просто находится в пространстве имён, членом которого оболочка не является. Та же команда ведёт себя иначе при запуске внутри юнита, и именно это наблюдение обычно разрешает спор. Прочитайте настройки юнита, прежде чем делать какие-либо выводы о записи.
Отделите невидимое от незаписываемого
Успешная запись и неудачное открытие дают разные доказательства, и это различие определяет исправление. Если хук говорит, что файл создан, но внешний читатель не может его найти, у вас вопрос о пространстве имён. Если хук сообщает об ошибке прав или неудачном открытии, файл никогда не был записан, и никакое изменение пространства имён не поможет.
systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-stateПуть через корень процесса показывает собственный вид службы на файловую систему, зависящий от проверок прав на этот процесс, пока он ещё работает. Читайте журнал юнита в том же сеансе, потому что ошибку записи и отсутствующий файл легко перепутать, когда кто-то уже решил причину.
Дайте общим данным явное место
Данные, которые нужны только службе, принадлежат её приватному временному каталогу. Данные, которые должен читать другой процесс, требуют пути, определённого для обоих, с указанным владельцем, режимом и сроком действия. Решите, какой из двух случаев у вас, прежде чем редактировать юнит. Большинство таких инцидентов происходит из-за того, что приватный файл считается общим.
[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750Каталог времени выполнения помещает папку в системную область времени выполнения, создаёт её для настроенных пользователя и группы юнита и удаляет её при остановке юнита. Добавьте его через drop-in, чтобы юнит пакета остался нетронутым, затем перезагрузите менеджер и перезапустите этот экземпляр, приняв, что его клиенты переподключатся.
Сохраняйте любой каталог времени выполнения, который уже требует установленный юнит. Замена списка вместо добавления к нему — распространённый способ сломать несвязанную функцию, которую никто не связывает с изменением.
Два слоя привилегий могут не совпадать
Менеджер служб создаёт каталог для настроенного пользователя юнита, тогда как демон VPN может отдельно перейти на свою собственную учётную запись перед запуском хука соединения. Это разные слои, и они могут называть разные личности.
Каталог, принадлежащий root, с ограничительным режимом полностью виден демону, который уже отказался от привилегий, и всё же недоступен ему для записи. Тогда ошибка читается как проблема прав, хотя путь существует именно там, где вы ожидали. Сравните владельца каталога с личностью, которую сообщает хук. Когда они различаются, режим никогда не был вопросом.
Проверьте, от имени какой личности хук действительно работает, прежде чем менять владельца. Смена пользователя выполнения службы, чтобы исправить каталог, может изменить доступ к устройствам и сетевые привилегии в другом месте, что является высокой ценой за маленькую проблему.
Проверьте всю передачу
Подтвердите четыре вещи сразу: хук пишет под своей настоящей личностью, предполагаемый читатель может использовать файл, посторонние пользователи не могут, а остановка юнита убирает всё как задумано. Появление файла в общем временном каталоге хоста не является требованием и обычно служит признаком того, что обмен так и не получил собственный путь. Проверяйте читателя после перезапуска, а не только при первом запуске. Поведение очистки — часть замысла, поэтому наблюдайте за ним, а не предполагайте его.
Постоянное состояние принадлежит месту с подходящим временем жизни, поскольку каталог времени выполнения предназначен исчезать. Выбирайте место по времени жизни, а не по удобству. Эта привычка предотвращает следующую версию того же расследования.