6

На машине RHEL 7.2, если я создаю общую память POSIX в сеансе консоли, а затем запрашиваю ее присутствие в /dev/shm из сеанса SSH, он показывает файл общей памяти в первый раз, но после этого он таинственно удаляется ,

Наконец, я разбил контрольный пример на следующие шаги:

  1. На box1, touch /dev/shm/sample
  2. tailf /dev/shm/sample on box1. Это будет доступно.
  3. На box2 выполните ssh user@box1 "ls -l /dev/shm/"

    -rw------- 1 user user        1 Aug 25 17:12 sample
    
  4. Повторите шаг 3, и на этот раз я не вижу файл.
  5. На коробке 1 tailf показывает, что файл был удален.

    tail: '/dev/shm/sample' has become inaccessible: No such file or directory
    

Я заметил, что все файлы, соответствующие этому конкретному пользователю, удаляются из /dev/shm , даже если это дерево каталогов, содержащих файлы.

Я пытался контролировать файл, strace на sshd и т.д.

Я пробовал Audit по следующим правилам, но не повезло:

## This file is automatically generated from /etc/audit/rules.d
-D
-b 1024
# monitor unlink() and rmdir() system calls.
-a exit,always -S unlink -S rmdir

Может кто-нибудь объяснить, что здесь происходит не так?

2 ответа2

11

Из моего ответа:

После нескольких часов поиска и чтения я нашел виновника. Это настройка для systemd. /etc/systemd/logind.conf содержит параметры конфигурации по умолчанию, каждый из которых закомментирован. По умолчанию для параметра RemoveIPC установлено значение yes . Эта опция указывает systemd очистить межпроцессное взаимодействие (IPC) для "учетных записей пользователей", которые не вошли в систему. Это не влияет на "системные учетные записи"

В моем случае файлы и каталоги создавались для учетной записи пользователя, а не для системной учетной записи.

Есть два возможных решения:

  1. Создайте файлы с / для системного пользователя - пользователя, созданного с помощью системной опции (adduser -r или adduser --system)
  2. Отредактируйте /etc/systemd/logind.conf , раскомментируйте строку RemoveIPC=yes , измените ее на RemoveIPC=no , сохраните и перезагрузите систему

В моем случае я выбрал вариант № 2, потому что пользователь уже был создан.

Рекомендации:

-1

/dev/shm обеспечивает представление разделяемой памяти, которая выглядит как файловая система. Существуют системные вызовы для создания, использования и удаления сегментов общей памяти. Общая память предназначена для использования взаимодействующими программами, чтобы обеспечить доступ к общим структурам данных. В зависимости от режима, в котором они были созданы, сегменты разделяемой памяти могут быть удалены, если их не использует ни один процесс. Это предотвращает потерю разделяемой памяти, если программы, использующие их, аварийно завершают работу или иным образом завершают работу без очистки.

Если у вас есть ядро, которое монтирует /dev/shm , то оно должно быть указано как таковое в /etc/mtab . Права доступа должны быть drwxrwxrwxt что не позволяет другим пользователям, кроме root, удалять файлы. Если файлы для конкретного пользователя удаляются из /dev/shm , их удалит либо тот пользователь, либо пользователь root. Проверьте: процессы, запущенные от имени пользователя; cronjobs работает как пользователь; или скрипты запускаются во время входа / выхода.

Попробуйте войти в систему несколько раз, не выходя из системы и не проверяя файл. Если файл задерживается, то вряд ли это процесс, выполняющийся от имени пользователя или записи crontab. Если он удаляется при первом выходе из системы, то, скорее всего, сценарий очистки запускается при выходе из системы.

Если вы хотите создать файловую систему в памяти, существует файловая система tmpfs . Это обычно используется для /tmp , /var/run и других файловых систем, которые должны быть пустыми после перезагрузки. Файлы в tmpfs могут быть выгружены в файлы подкачки, если память используется для других целей.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .