Вопрос или проблема
Я пытаюсь изучить пространство имен UTS. Я хочу записывать лог-записи как из родительского пространства имен, так и из дочернего пространства имен UTS. Это демонстрация, поэтому не важно, пишет ли rsyslog
в один и тот же файл журнала или в отдельные файлы для каждого пространства имен. Единственное, что имеет значение, это то, чтобы дочернее пространство имен записывало логи с другим именем хоста по сравнению с родительским пространством имен. Но у меня не получается сохранить два разных имени хостов.
Вот моя последняя попытка:
У меня открыты два SSH терминала, оба под пользователем.
Перейдите в Терминал 1
me@localhost: sudo unshare --uts /bin/bash
root@localhost: hostname api1
root@localhost: hostname
api1
root@localhost: rsyslogd -n -i /var/run/rsyslogd-child.pid -f /etc/rsyslog.conf &
root@localhost: logger foochild1
Перейдите в Терминал 2
me@localhost: logger fooparent1
Теперь в моем /var/log/syslog
обе записи были зарегистрированы с именем хоста из дочернего пространства имен:
Mar 8 22:47:12 api1 root: foochild1
Mar 8 22:47:33 api1 me: fooparent1
Может кто-нибудь предложить мне способ записывать файлы журналов из разных пространств имен, сохраняя при этом имя хоста соответствующего пространства?
Ответ или решение
Для работы с rsyslog
и различными именами хостов в различных UTS неймспейсах в Linux важно понимать, как система обрабатывает идентификацию хоста при записи логов. В данном контексте, вы хотите продемонстрировать передачу различных имен хостов из различных неймспейсов, сохраняя их уникальность в системных логах.
Теория
Основой данной задачи является концепция UTS неймспейсов (Unix Timesharing System), которые позволяют создавать изолированные окружения в пределах одной системы Linux, включая уникальную маску имени хоста и доменного имени. Утилита unshare
используется для создания дочернего неймспейса с отличными сетевыми параметрами, такими как имя хоста. Важной частью является и настройка rsyslog
, который занимается сбором и централизованным хранением логов.
UTS неймспейсы могут использовать разные имена хостов, и ваша цель — сохранить и зафиксировать эти различия в логах. Однако, как вы уже заметили, проблемы могут возникать из-за глобальных настроек rsyslog
, который видит все записи логов как поступающие из одного источника, если процесс, записывающий логи, управляется единой инстанцией rsyslog
.
Пример
Ваш метод запуска процесса rsyslog
в дочернем неймспейсе правильный, но есть некоторые моменты, которые требуют внимания:
-
Убедитесь, что
rsyslogd
в обоих неймспейсах, и родительском и дочернем, работают как отдельные процессы и имеют правильные конфигурационные файлы и PID файлы. -
Убедитесь, что ваш
rsyslog
настроен на прием логов из разных источников. Это можно сделать черезrsyslog.conf
или создав отдельные конфигурации в/etc/rsyslog.d/
.
Применение
-
Настройка и запуск
rsyslog
в родительском неймспейсе.Запустите
rsyslogd
в родительском неймспейсе, убедившись, что он использует основной конфигурационный файл и PID. Убедитесь, что записи, сделанные в родительском пространстве имен, читаются корректно.service rsyslog start
-
Использование отдельного процесса
rsyslog
в дочернем неймспейсе.Задача — настроить
rsyslog
так, чтобы он учитывал уникальные имена хостов из дочерних неймспейсов. Вы можете сделать это, добавив в конфигурациюrsyslog
условия маршрутизации на основе имени хоста. Чтобы внедрить такое поведение:sudo unshare --uts --fork /bin/bash hostname api1 rsyslogd -n -i /var/run/rsyslogd-child.pid -f /etc/rsyslog_child.conf &
-
Настройка конфигурации для дочернего неймспейса:
Создайте файл конфигурации
/etc/rsyslog_child.conf
, который будет содержать настройки для логации событий с отдельным именем файла или каталога:# rsyslog_child.conf $ModLoad imuxsock $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat *.info;mail.none;authpriv.none;cron.none /var/log/syslog_child
Таким образом, вы отдельно маршрутизируете записи дочернего неймспейса в локальный файл.
-
Тестирование.
Проверьте, что переменные окружения или специфичные конфигурации указаны так, чтобы при логировании через команду
logger
использовался конфигурационный файл дочернегоrsyslog
, и чтобы имя хоста изменялось средствами UTS.-
В родительском неймспейсе:
logger -t parentns "Лог из родительского неймспейса"
-
В дочернем неймспейсе:
logger -t childns "Лог из дочернего неймспейса"
Убедитесь, что логи в
/var/log/syslog
и/var/log/syslog_child
отображают правильные имена хостов. -
Таким образом, при правильно настроенных конфигурациях и продуманной маршрутизации логов вы сможете добиться различных записей с уникальными именами хостов из разных неймспейсов, что позволит полноценно продемонстрировать и изучить функциональность UTS неймспейсов и rsyslog
в контексте Linux систем.