/dev/log отсутствует. как мне починить?

На моей машине (16.04.1) кажется, что /dev/log отсутствует. Это, вероятно, всегда отсутствовало.

Реальная причина, по которой я здесь обращаюсь за помощью, заключается в том, что я использую virtualmin с csf и SYSLOG_CHECK опция всегда терпела неудачу (даже когда ОС была еще верной 14.04).

Вот что происходит, когда я запускаю регистратор:

# logger hi there
logger: socket /dev/log: No such file or directory

Я также попробовал "Python" способ делать вещи, в соответствии с этим вопросом:

# python -c 'import syslog; syslog.syslog("Hello World")'
(nothing is outputted, or appears in syslog)

Итак, глядя на /dev/ папка Я заметил, что там нет "журнала" вообще.

Я проверил на другой машине (v14.04), и это имеет: srw-rw-rw- 1 root root 0 Dec 16 20:34 log=

Основные различия между этими двумя машинами заключаются в том, что первая была запущенным экземпляром с vultr.com (с использованием поставляемой ими установки с поддержкой cloud-init) по сравнению с последней машиной (которая работает), которая использовала ISO-образ Ubuntu (давно).

Итак, к вопросу: как мне решить проблему, почему у меня нет /dev/log файл, который какое-то приложение (csf), вероятно, пытается записать? Обратите внимание, что другие сообщения появляются в /var/log/syslogтак что это все немного сбивает с толку меня.

Любая помощь приветствуется.

Редактировать:

Содержимое /lib/systemd/system/systemd-journald-dev-log.socket:

[Unit]
Description=Journal Socket (/dev/log)
Documentation=man:systemd-journald.service(8) man:journald.conf(5)
DefaultDependencies=no
Before=sockets.target

IgnoreOnIsolate=yes

[Socket]  
Service=systemd-journald.service  
ListenDatagram=/run/systemd/journal/dev-log
Symlinks=/dev/log  
SocketMode=0666
PassCredentials=yes  
PassSecurity=yes

ReceiveBuffer=8M
SendBuffer=8M  

2 ответа

Решение

Проверьте, есть ли у вас /run/systemd/journal/dev-log; это должен быть сокет:

$ ls -l /run/systemd/journal/dev-log
srw-rw-rw- 1 root root 0 Dec 16 09:17 /run/systemd/journal/dev-log

Если это подтвердится, то вы можете просто сделать символическую ссылку из /dev/log в /run/systemd/journal/dev-log:

sudo ln -s /run/systemd/journal/dev-log /dev/log

Для меня это оказалось проблемой с тем, как модуль imuxsock, используемый в rsyslog, работал с systemd.

В документации imuxsock они рассказывают, как модуль должен работать для systemd. Шаг 1 был где я видел проблемы:

Шаг 1: Выберите имя системного сокета

  1. Если пользователь явно не выбрал для установки SysSock.Use="off", тогда имя сокета прослушивателя по умолчанию (иначе, "сокет системного журнала" или просто "системный сокет") устанавливается в /dev/log. В противном случае, если пользователь явно установил SysSock.Use="off", тогда rsyslog не будет прослушивать /dev/log ИЛИ ни один сокет, определенный параметром SysSock.Name, а остальная часть этого раздела не применяется.

  2. Если пользователь указал sysSock.Name="/path/to/custom/socket" (и не указал явным образом SysSock.Use="off"), то имя сокета слушателя по умолчанию перезаписывается с помощью / path / to / custom / socket,

  3. В противном случае, если rsyslog работает в systemd AND /run/systemd/journal/syslog, существует (И пользователь явно не установил SysSock.Use="off"), тогда имя сокета слушателя по умолчанию перезаписывается с помощью / run / systemd / journal / системный журнал.

Система должна перейти к шагу 3 и изменить путь по умолчанию на "/run/systemd/journal/syslog", но вместо этого она осталась "/var/log". Это означало, что модуль imuxsock попытается (и иногда удастся) создать сокет в /dev/log, где вместо него должна быть символическая ссылка, созданная systemd-journald-dev-log.socket. В случае, если не удастся создать настоящий сокет, символическая ссылка все равно будет удалена.

Эта документация была результатом этой проблемы на rsyslog github. Если вы хотите пропустить обсуждение и сразу перейти к изменениям, см. PR#1 и PR#2 соответственно.

Мое решение состояло в том, чтобы просто настроить модуль imuxsock для использования пути systemd в моем /etc/rsyslog.conf:

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

Это, похоже, исправило мою проблему и звучит как хорошее решение здесь, поскольку это объясняет, почему символическая ссылка может снова исчезнуть после того, как вы создадите ее вручную.

Если вы просматриваете свою систему, а "/run/systemd/journal/syslog" отсутствует, посмотрите на "syslog.socket", чтобы увидеть, успешно ли он запускается, так как именно он отвечает за создание сокета.

systemctl status syslog.socket

Возможно, ваша версия rsyslog.service не определяет syslog.service как псевдоним, который необходим, так как syslog.socket пытается активировать эту службу.

Что бы это ни стоило, я работаю на встраиваемой версии Linux, так что это не идеальная копия проблемы здесь, но она казалась достаточно актуальной, чтобы поделиться.

Просто перезапустите systemd-journald.service и все будет хорошо

sudo systemctl перезапустить systemd-journald.service

Вы уверены, что rsyslog установлен? В моем случае мне пришлось установить rsyslog для решения проблемы в Ubuntu 16.04:

sudo apt-get install -y rsyslog

Обратите внимание, что еще до того, как я установил rsyslog, мой /lib/systemd/system/systemd-journald-dev-log.socket содержал тот же контент, который вы показываете в своем посте.

Другие вопросы по тегам