#Симптом и границы применимости
После перевода службы Arch Linux на другого пользователя клиент больше не может подключиться к Unix-сокету. Нужно отличить сокет, который создаёт сама программа, от сокета, создаваемого systemd через .socket: права и настройки для них различаются.
#Возможные причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сокет принадлежит прежней учётной записиПосле смены пользователя файловые права не позволяют новому клиенту подключиться. | stat показывает старую группу и режим 600/660. | Изменить способ создания сокета или ограниченную группу доступа. |
| Файл создаёт systemd.socketВладелец и режим устанавливаются в SocketUser/SocketGroup/SocketMode. | systemctl list-sockets показывает unit для этого пути. | Настроить .socket, не трогая файлы во время работы. |
| Каталог недоступенДаже при верном режиме сокета не хватает права прохода через родительский каталог. | namei -l отмечает каталог без x для клиента. | Исправить каталог/ACL для согласованной группы. |
#Подробная диагностика и безопасные действия
- 1. Определите конкретный путь к сокетуВ терминале узнайте имя сокета по журналу приложения. Подставьте реальный путь вместо /run/ПРОГРАММА/app.sock. Если файла нет, проблема может заключаться не в разрешениях, а в том, что сервер не создал endpoint.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
ss -xlpnsystemctl list-sockets --all --no-pager
- 2. Посмотрите владельца, группу и режим
statпоказывает тип socket, права и учётную запись;namei -lвыявит недоступный родительский каталог. Обычныйlsне отображает эффективные ACL, поэтому при необходимости добавьте getfacl.Linux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.stat -c "%F %U:%G %a %n" /run/ПРОГРАММА/app.socknamei -l /run/ПРОГРАММА/app.sock
- 3. Установите, кто создаёт сокетЕсли он перечислен в systemctl list-sockets, откройте соответствующую .socket единицу и настройки SocketUser/SocketGroup/SocketMode. Если не перечислен, сокет вероятно создаёт само приложение; его режим нужно менять в настройках приложения, а не systemd.Linux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
systemctl cat ИМЯ.socketsystemctl show ИМЯ.socket -p Listen -p SocketUser -p SocketGroup -p SocketMode
- 4. Проверьте группы обоих участниковПодставьте фактические имена процесса-сервера и процесса-клиента;
idпоказывает группы каждой учётной записи. Для подключения через каталог необходимы x на каждом предке и разрешённый доступ к самому сокету. - Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
id ПОЛЬЗОВАТЕЛЬ_СЕРВЕРАid ПОЛЬЗОВАТЕЛЬ_КЛИЕНТАgetfacl /run/ПРОГРАММА/app.sock
- 5. Сверьте настройки процесса и запреты sandboxВ unit службы посмотрите User, Group, RuntimeDirectory, UMask; в пользовательском окружении различайте --user и системный .socket. При
ProtectSystemили PrivateTmp socket path может быть недоступен по другой причине. - Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
systemctl cat ИМЯ.servicesystemctl show ИМЯ.service -p User -p Group -p RuntimeDirectory -p UMask
- 6. Выполните безопасную точечную правкуЕсли сокет создаётся systemd, настройте SocketGroup/SocketMode для одной .socket единицы через drop-in и ограниченную группу, заранее согласовав, кто получит доступ. Если сокет создаёт приложение, найдите его официальную настройку umask/socket permissions. Команды chmod 777 здесь недопустимы.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoИзменение только параметров разрешённого сокета; дополнительный доступ предоставляет полномочия клиенту.
sudo systemctl edit ИМЯ.socketsudo systemctl daemon-reloadsystemctl cat ИМЯ.socketКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Проверяйте после согласованного перезапускаПерезапуск .socket способен оборвать новые и существующие соединения, а .service — активные операции. Запланируйте его, затем проверьте режим и подключение настоящим клиентом. При неуспехе верните старый drop-in и исследуйте журнал.
- Диагностическая команда в терминале Arch Linux, без изменения настроекLinux · Терминал (Bash)КомандаДиагностическая команда в терминале Arch Linux, без изменения настроек.
stat -c "%U:%G %a %n" /run/ПРОГРАММА/app.sockjournalctl -b -u ИМЯ.socket --no-pager -n 50
#Как понять, что проблема устранена
Повторите исходное действие, из-за которого возникла неисправность, и сверяйте не только код завершения команды, но и прикладной результат. Сохраните вывод последней диагностической команды и записи журнала до и после исправления. Если ошибка повторяется, верните только изменённую настройку из резервной копии и передайте специалисту точный симптом, имя программы/службы, версию системы и необходимые фрагменты журнала без паролей и закрытых ключей.
#Что делать, если не помогло
Не применяйте случайные советы для другого дистрибутива: в Arch Linux особенно опасны частичные обновления пакетов, а в Rocky Linux — отключение SELinux или неконтролируемый перезапуск системных служб. Остановитесь после неуспешного безопасного шага, зафиксируйте фактическое сообщение и вернитесь к соответствующей причине. Для загрузки, разделов диска и единственного удалённого подключения используйте резервную копию и локальную консоль.