
В Solaris временные файлы сессий пользователей по умолчанию сохраняются в каталоге /tmp или /var/tmp. Это создает потенциальные риски: утечка конфиденциальных данных, конфликты при одновременном доступе, а также проблемы с очисткой файлов после завершения сеанса. Особенно критично для систем с высокими требованиями к безопасности или ограниченными ресурсами дискового пространства.
Отключение механизма tmps через профиль пользователя – эффективный способ локализовать изменения без модификации глобальных настроек системы. Для этого используются переменные окружения TMPDIR и TMP, а также параметры в файлах .profile, .bash_profile или .kshrc. Важно учитывать, что Solaris поддерживает разные оболочки (Bourne, Korn, Bash), и синтаксис команд может отличаться.
Перед внесением изменений проверьте текущие настройки с помощью env | grep TMP. Если переменные не заданы, система использует стандартные пути. Для отключения tmps добавьте в профиль строку unset TMPDIR TMP или переназначьте их на несуществующий каталог, например: export TMPDIR=/nonexistent. Это заставит приложения либо использовать альтернативные пути, либо завершаться с ошибкой, что упростит диагностику.
Для проверки результатов выполните su - <пользователь> и запустите команду echo $TMPDIR. Если переменная пуста или указывает на некорректный путь, настройка применена успешно. Учтите, что некоторые приложения (например, vi, sudo) могут игнорировать эти переменные, поэтому дополнительно настройте их конфигурационные файлы или используйте pam_tmpdir для принудительного перенаправления.
Проверка текущих настроек tmps в системе Solaris

Для анализа текущих параметров tmps в Solaris используйте команду svcs -l svc:/system/volatile:default. Она выведет состояние сервиса, путь к манифесту и параметры конфигурации, включая размер и расположение временного хранилища. Обратите внимание на строку tmpsize – она указывает максимальный объём в мегабайтах, выделенный под tmpfs. Если параметр отсутствует, система использует значение по умолчанию, равное половине физической оперативной памяти.
Просмотрите настройки в файле /etc/vfstab, если tmpfs монтируется через него. Ищите строки с типом tmpfs – они содержат параметры монтирования, включая размер и права доступа. Пример записи: /tmp - /tmp tmpfs - yes size=1024m,mode=1777. Если файл пуст или отсутствует, проверьте конфигурацию через SMF (svccfg -s svc:/system/volatile:default listprop).
Для проверки ограничений по пользователям используйте prctl $$ (для текущего процесса) или prctl -n project.max-shm-memory <PID>. Значение project.max-shm-memory влияет на максимальный объём памяти, доступный tmpfs для проекта. Если оно установлено слишком низким, tmpfs не сможет использовать весь выделенный размер. Уточните текущий проект пользователя командой id -p и сравните с настройками в /etc/project.
В системах с зонами Solaris проверьте настройки tmpfs отдельно для каждой зоны. Выполните zonecfg -z <zone_name> info и ищите ресурс capped-memory. Если он задан, tmpfs в зоне будет ограничен указанным значением, даже если на уровне глобальной зоны выделено больше памяти. Для диагностики проблем с tmpfs в зонах используйте zlogin <zone_name> df -h /tmp и сравните с глобальными настройками.
Определение профиля пользователя для изменения параметров
В Solaris профили пользователей хранятся в файлах /etc/profile, ~/.profile или ~/.bash_profile (в зависимости от используемой оболочки). Для отключения временных файлов в tmpfs через профиль необходимо определить, какой именно файл отвечает за настройки текущего пользователя. Команда echo $SHELL покажет активную оболочку, а grep -l «TMPDIR\|tmpfs» /etc/profile ~/.profile ~/.bash_profile поможет выявить существующие упоминания временных каталогов.
Если требуется изменить параметры для всех пользователей, редактируйте /etc/profile, добавив строку unset TMPDIR или переопределив переменную TMPDIR=/var/tmp для перенаправления временных файлов в постоянное хранилище. Для индивидуальных настроек используйте ~/.profile или ~/.bash_profile, где аналогичные изменения будут применяться только к конкретному пользователю. Убедитесь, что файл имеет корректные права доступа (chmod 644 ~/.profile), иначе изменения не вступят в силу.
Редактирование файла .profile или .bash_profile для отключения tmps

В Solaris временные файлы (tmps) часто создаются в каталогах, таких как /tmp или /var/tmp, и могут влиять на производительность системы при активной работе пользователя. Чтобы отключить их генерацию через профиль, откройте файл ~/.profile или ~/.bash_profile в текстовом редакторе, например, vi или nano. Добавьте следующие строки для переопределения переменных окружения:
export TMPDIR=/dev/null– перенаправляет временные файлы в/dev/null, блокируя их создание.unset TMPиunset TEMP– удаляют стандартные переменные, используемые приложениями для хранения временных данных.export TEMPDIR=/nonexistent– указывает несуществующий путь, что заставит многие программы игнорировать запись в tmps.
Некоторые приложения, особенно системные утилиты Solaris, могут игнорировать пользовательские настройки и продолжать использовать /tmp. В таких случаях дополнительно настройте /etc/profile или создайте символическую ссылку ln -s /dev/null /tmp/user_tmps, чтобы перенаправить запросы. Учтите, что радикальные методы, такие как монтирование /tmp в tmpfs с ограниченным размером, требуют прав root и могут нарушить работу критически важных процессов.
После внесения изменений протестируйте работу ключевых приложений. Например, запустите mktemp – если команда завершится с ошибкой или вернет /dev/null, настройки применены успешно. Для отката изменений удалите добавленные строки из профиля и восстановите стандартные переменные окружения, выполнив unset TMPDIR TEMPDIR и export TMP=/tmp.
Добавление команд для временного отключения tmps в сессии
Для временного отключения tmps в рамках текущей сессии пользователя добавьте следующие команды в файл ~/.profile или ~/.bash_profile. Метод подходит для Solaris 10/11 и не требует прав root. Основная задача – перенастроить переменные окружения, влияющие на работу tmps, без модификации системных конфигураций.
- Добавьте строку для отключения tmps через переменную
TMPDIR:export TMPDIR=/var/tmp/no_tmps
Создайте каталог вручную, если он отсутствует:
mkdir -p /var/tmp/no_tmps
- Исключите использование tmps для временных файлов приложений, переопределив
TMPиTEMP:export TMP=/var/tmp/no_tmps export TEMP=/var/tmp/no_tmps
- Для приложений, использующих
mktemp, задайте принудительный путь:alias mktemp='mktemp -p /var/tmp/no_tmps'
Для отмены изменений удалите добавленные строки из профиля или закомментируйте их символом #. Альтернативный способ – временное отключение через сессию SSH с параметром:
ssh user@host -t "TMPDIR=/var/tmp/no_tmps bash --login"
Этот метод не сохраняется после завершения сессии и не требует редактирования файлов.
Настройка постоянного отключения tmps через системные файлы
В Solaris механизм tmps (temporary filesystem) по умолчанию монтируется в /tmp как tmpfs, что может приводить к нежелательному расходу оперативной памяти. Для его отключения на постоянной основе требуется модификация системных конфигурационных файлов. Основной файл – /etc/vfstab, где хранится информация о файловых системах, монтируемых при загрузке. Найдите строку с tmpfs и закомментируйте её символом # или удалите. Пример оригинальной записи: swap - /tmp tmpfs - yes size=2g. После изменений перезагрузите систему или выполните umount /tmp и mount -a для применения настроек без перезагрузки.
Альтернативный способ – использование файла /etc/system, где можно задать параметры ядра. Добавьте строку set tmpfs:tmpfs_minfree=0, чтобы предотвратить автоматическое монтирование tmpfs в /tmp. Однако этот метод менее надёжен, так как не блокирует монтирование напрямую, а лишь ограничивает минимальный объём свободного пространства. Для гарантированного отключения предпочтительнее редактировать vfstab. Перед внесением изменений создайте резервную копию файла: cp /etc/vfstab /etc/vfstab.bak.
Если в системе используется SMF (Service Management Facility), проверьте сервисы, связанные с tmpfs. Выполните svcs -a | grep tmpfs для поиска активных сервисов. Отключите их командой svcadm disable <имя_сервиса>. Например, в Solaris 11 может присутствовать сервис svc:/system/filesystem/tmp:default. Отключение через SMF предотвращает повторное монтирование tmpfs даже после перезагрузки, но не заменяет правку vfstab.
Проверка корректности изменений в профиле пользователя
Для проверки применения изменений без перезагрузки сеанса используйте source ~/.profile или . ~/.profile. Если после выполнения команды переменные не обновились, убедитесь, что файл профиля не переопределяется другими скриптами (например, ~/.bashrc или /etc/environment). Проверьте порядок загрузки профилей с помощью echo $SHELL и изучите документацию для конкретной оболочки (sh, bash, ksh).
Запустите тестовую команду, зависящую от временных файлов, например: mktemp -t test.XXXXXX. Если файл создается в каталоге, отличном от указанного в TMPDIR, проверьте права доступа к новому пути (ls -ld /new/tmp/path) и убедитесь, что переменная экспортирована (export TMPDIR=/new/tmp/path). В Solaris также проверьте наличие системных ограничений через ulimit -a.
Для диагностики проблем с профилем используйте truss -f -o /tmp/profile_trace.log bash -l. Анализируйте лог на предмет ошибок загрузки файлов профиля или игнорирования переменных. В Solaris особое внимание уделите конфликтам с системными скриптами в /etc/profile или /etc/default/login, которые могут переопределять пользовательские настройки.
Если изменения не применяются для всех пользователей, проверьте глобальные профили: /etc/profile и /etc/default/init. В Solaris переменные окружения можно задавать через SMF-сервисы, поэтому выполните svcs -l system/environment и при необходимости отредактируйте манифест сервиса. После любых правок перезапустите сервис: svcadm restart system/environment.
Перезагрузка сессии или системы для применения настроек
Изменения в профиле пользователя Solaris, включая отключение временных каталогов (например, через переменные окружения или модификацию ~/.profile), требуют перезагрузки сессии для вступления в силу. Простейший способ – завершить текущую сессию и авторизоваться заново. Для этого выполните команду exit или нажмите Ctrl+D в терминале. Если настройки применяются к системным профилям (например, /etc/profile), потребуется перезагрузка всей системы или перезапуск соответствующих сервисов, зависящих от окружения.
В случаях, когда перезагрузка сессии невозможна (например, при работе через SSH без доступа к физической консоли), используйте команду source для принудительного применения изменений в текущем сеансе. Синтаксис: source ~/.profile или . ~/.profile. Однако этот метод не затрагивает процессы, запущенные до выполнения команды, – для них потребуется перезапуск вручную. Например, если настройки влияют на работу tmux или screen, закройте и заново откройте сессию в этих утилитах.
Для проверки корректности применения настроек используйте команды env или printenv, чтобы убедиться в отсутствии переменных, связанных с TMP или TMPDIR. Если изменения не отразились, проверьте права доступа к файлам профиля (ls -l ~/.profile) и наличие ошибок синтаксиса (запустите sh -n ~/.profile). В корпоративных средах с централизованным управлением профилями (например, через LDAP или NIS) изменения могут переопределяться системными политиками – уточните это у администратора.
При необходимости глобального отключения временных каталогов для всех пользователей отредактируйте /etc/profile или создайте файл в /etc/profile.d/ с расширением .sh. После этого выполните перезагрузку системы (reboot или init 6) либо перезапустите все активные пользовательские сессии. Для серверов с критическими нагрузками используйте поэтапный перезапуск: сначала завершите некритичные процессы, затем перезагрузите сессии администраторов, и только потом – основные сервисы.
Устранение возможных ошибок после отключения tmps
После отключения tmps в профиле пользователя Solaris приложения, зависящие от временных файлов в /tmp, могут завершаться с ошибками ENOSPC или EACCES. Проверьте логи /var/adm/messages и dmesg на наличие записей вида «No space left on device» или «Permission denied». Если ошибки связаны с конкретными процессами, уточните их требования к временным файлам – некоторые приложения (например, java, gcc) используют жестко заданные пути и не учитывают переменные окружения.
Для диагностики проблем с правами доступа выполните ls -ld /tmp и убедитесь, что каталог имеет режим 1777 (sticky bit + права на запись для всех). Если режим сброшен, восстановите его командой chmod 1777 /tmp. При наличии квот на файловую систему проверьте лимиты с помощью quota -v – некоторые процессы могут превышать их после перенаправления временных файлов в другие каталоги.
Если приложение ожидает наличия /tmp как отдельной файловой системы, но она смонтирована как часть корневого раздела, создайте символическую ссылку или переопределите переменную TMPDIR в профиле пользователя. Например, добавьте в ~/.profile строку: export TMPDIR=/var/tmp/user_$LOGNAME, предварительно создав каталог с нужными правами (mkdir -p /var/tmp/user_$LOGNAME && chmod 700 /var/tmp/user_$LOGNAME). Учтите, что /var/tmp не очищается при перезагрузке, в отличие от /tmp.
Ошибки типа Segmentation Fault после отключения tmps часто указывают на некорректную работу библиотек, использующих shm_open() или mkstemp(). Проверьте зависимости приложения с помощью ldd /путь/к/бинарнику и убедитесь, что все библиотеки доступны. В случае проблем с разделяемой памятью временно восстановите монтирование tmpfs командой mount -F tmpfs swap /tmp и проанализируйте поведение процесса с помощью truss -f -t open,shm_open /путь/к/бинарнику.
Для долгосрочного решения замените жестко закодированные пути в скриптах и конфигурациях приложений. Например, в cron-задачах используйте mktemp -d -p /var/tmp вместо прямых обращений к /tmp. Если приложение не поддерживает переопределение TMPDIR, рассмотрите возможность патчинга исходного кода или использования LD_PRELOAD для перехвата системных вызовов open() и mkstemp() с помощью пользовательской библиотеки.
