Автор Тема: TMP и TMPDIR (решено)  (Прочитано 6741 раз)

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
TMP и TMPDIR (решено)
« : 16.04.2021 08:56:43 »
Альт Образование 9 со вчерашним dist-upgrade
Обнаруживаю, что переменные окружения TMP и TMPDIR отличаются друг от друга при входе в графику, что иной раз приводит к трудноуловимым багам.
Например, для юзера test:
TMP=/tmp/.private/test
TMPDIR=/home/test/tmp
или
TMPDIR=/tmp
в зависимости от наличия или отсутствия каталога /home/test/tmp

При логине через текстовую консоль они одинаковы:
TMP=/tmp/.private/test
TMPDIR=/tmp/.private/test

Это баг или фича? Если фича, то чем она обусловлена и почему не проявляется при входе через текстовую консоль?
« Последнее редактирование: 23.04.2021 12:52:03 от xdsl »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 18 551
    • Домашняя страница
    • Email
Re: TMP и TMPDIR
« Ответ #1 : 16.04.2021 14:03:55 »
Альт Образование 9 со вчерашним dist-upgrade
Обнаруживаю, что переменные окружения TMP и TMPDIR отличаются друг от друга при входе в графику, что иной раз приводит к трудноуловимым багам.
Например, для юзера test:
TMP=/tmp/.private/test
TMPDIR=/home/test/tmp
или
TMPDIR=/tmp
в зависимости от наличия или отсутствия каталога /home/test/tmp

При логине через текстовую консоль они одинаковы:
TMP=/tmp/.private/test
TMPDIR=/tmp/.private/test

Это баг или фича? Если фича, то чем она обусловлена и почему не проявляется при входе через текстовую консоль?
С control pam_mktemp enabled (по умолчанию) значения идентичны. Альт Образование 9.2.
С disabled - пустая строка и ~/tmp.
Андрей Черепанов (cas@)

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #2 : 16.04.2021 14:54:23 »
Сейчас только еще раз установил в virtualbox Альт Образование 9.1 далее->далее->, проверил, TMP и TMPDIR одинаковые, /tmp/.private/user
Обновил с помощью dist-upgrade, перезагрузился, вошел в графику получил из-под пользователя:
user@host-15 / $ env | grep TMP
TMP=/tmp/.private/user
TMPDIR=/tmp
Дальше смешнее:
user@host-15 / $ su- user
Password:
user@host-15 ~ $ env | grep tmp
TMP=/tmp/.private/user
TMPDIR=/tmp/.private/user
Но в реальности нифига не смешно. Ибо при различных TMP и TMPDIR запускаешь, скажем, Lazarus, после чего попытка выполнить su- вылетает с ошибкой. Если делаешь наоборот, то su- отрабатывает успешно, а Lazarus зависает.

И да, control pam_mktemp enabled

Оффлайн rabochyITs

  • Давно тут
  • **
  • Сообщений: 747
  • Евгений
Re: TMP и TMPDIR
« Ответ #3 : 16.04.2021 16:20:14 »
в xfce-sysv и server-sysv /старткиты, включая simply9 - каталоги идентичны
# env | grep tmp
TMP=/tmp/.private/root
TMPDIR=/tmp/.private/root
$ env | grep tmp
TMP=/tmp/.private/admin
TMPDIR=/tmp/.private/admin

на всех сборках
# control pam_mktemp
enabled


« Последнее редактирование: 16.04.2021 16:26:20 от rabochyITs »

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #4 : 16.04.2021 22:21:11 »
На статерките xfce и я сейчас сижу, у меня тоже все в порядке, правда последний dist-upgrade был с месяц назад. А на Альт Образование у меня вуз сидит, там вот такая печалька, хоть не обновляйся. Собственно все воспроизводимо, виртуалбокс, альт образование 9.1, dist-upgrade  и здравствуйте. 

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 18 551
    • Домашняя страница
    • Email
Re: TMP и TMPDIR
« Ответ #5 : 17.04.2021 07:58:09 »
Машины в домене?
Андрей Черепанов (cas@)

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #6 : 17.04.2021 08:27:05 »
Машины не в домене.
Испытываемая сейчас машина вообще в виртуалбоксе (1 RAM, 30 HDD) никуда не подключенная.
При установке Альт Образование 9.1 ни одной галочки дополнительной не установлено, все дефолтно, разбивка разделов swap и корневой.
Графический вход, запуск xfce-терминала, env | grep tmp, все нормально, значения одинаковые
В том-же терминале su-, dist-upgrade, ожидание обновления более 1000 пакетов, перезагрузка.
Графический вход, запуск xfce-терминала, env | grep tmp, все НЕ нормально, значения РАЗНЫЕ

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #7 : 17.04.2021 09:02:33 »
Пока не починят, выход вижу только один: control pam_mktemp disabled
В противном случае получается куча багов.
Практический пример:
При логине юзера через текстовую консоль или su- создается каталог TMPDIR, подозреваю, что через pam_mktemp. Таким образом рутом будет создан /tmp/.private/user и переданы на него права юзеру. Обратите внимание, что у /tmp/.private при этом будет владелец рут. Теперь юзер2 входит через графику, TMPDIR у него будет либо /tmp, либо /home/user2/tmp, а TMP - /tmp/.private/user2, при этом физически /tmp/.private/user2 отсутствует и создать его возможности у юзера нет.
Далее все зависит от особенностей работы конкретного приложения.
1) В идеальном варианте, приложение ищет временный каталог через TMPDIR и тогда все хорошо.
2) Теперь вариант похуже, но тоже рабочий. Приложение получает временный каталог через TMP, убеждается, что его нет или что создать его невозможно (/tmp/.private/ - рутовый!) и переходит на TMPDIR, все довольны, все счастливы
3) А теперь суровая правда жизни. Приложение  получает временный каталог через TMP, пытается его создать, или сразу в него пишет файлы, обламывается и вываливается с ошибкой, как вариант - зависает.

Есть и вариант 2.5, который обычно срабатывает вместо варианта 3, если переменная TMP отсутствует. Тогда приложение начинает перебирать TEMP, TMPDIR и т.п., пока не находит одну из таких переменных, после чего все развивается по варианту 2. Вот тут и поможет control pam_mktemp disabled

Но это все - костыли, проблему надо решать на уровне дистрибутива.

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #8 : 17.04.2021 09:16:08 »

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #9 : 17.04.2021 10:10:19 »
Подтверждаю, в свежеустановленной бете 9.2 все нормально с временными каталогами:
user@host-15 / $ env | grep TMP
TMP=/tmp/.private/user
TMPDIR=/tmp/.private/user

Но ситуацию с обновлением 9.1 это не решило

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 18 551
    • Домашняя страница
    • Email
Re: TMP и TMPDIR
« Ответ #10 : 17.04.2021 10:44:46 »
Посмотрю.
Андрей Черепанов (cas@)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 18 551
    • Домашняя страница
    • Email
Re: TMP и TMPDIR
« Ответ #11 : 17.04.2021 16:13:09 »
Значит, задаётся ранее. Смотрите /etc/profile.d/tmpdir.sh:
# If TMPDIR is not defined or is not a writable directory,
# set it to ~/tmp if the latter is a writable directory.

if [ -z "$TMPDIR" ] || [ ! -d "$TMPDIR" -o ! -w "$TMPDIR" ]; then
        if [ -d "$HOME/tmp" -a -w "$HOME/tmp" ]; then
                export TMPDIR="$HOME/tmp"
        elif [ -d "/tmp" -a -w "/tmp" ]; then
                export TMPDIR="/tmp"
        fi
fi
Андрей Черепанов (cas@)

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #12 : 19.04.2021 07:20:51 »
Уже пробовал этот файл удалить, пробовал в конец ему добавить export TMPDIR=/tmp/.private/$USER
Исход один: вводим логин-пароль для графического входа, жмем ок, и все зависает.

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 18 551
    • Домашняя страница
    • Email
Re: TMP и TMPDIR
« Ответ #13 : 19.04.2021 09:36:00 »
Уже пробовал этот файл удалить, пробовал в конец ему добавить export TMPDIR=/tmp/.private/$USER
Исход один: вводим логин-пароль для графического входа, жмем ок, и все зависает.
Что-то навалено всего, уж извините.
1. Переопределение TMPDIR можно сделать в отдельном файле /etc/profile.d/<любое_имя>.sh
После явного указания TMPDIR он уже на ~/tmp переопределяться не будет.
2. Проблема со входом не может быть связана с TMPDIR. Смотрите ~/.xsession-errors:0.
Андрей Черепанов (cas@)

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 238
Re: TMP и TMPDIR
« Ответ #14 : 20.04.2021 07:52:25 »
1. Переопределение TMPDIR можно сделать в отдельном файле /etc/profile.d/<любое_имя>.sh
После явного указания TMPDIR он уже на ~/tmp переопределяться не будет.
2. Проблема со входом не может быть связана с TMPDIR. Смотрите ~/.xsession-errors:0.

Еще раз все переустановил, чтобы уж совсем чистая система была. Все функционирует в virtualbox, дефолтная установка Образование 9.1., TMP и TMPDIR одинаковые. Делаем dist-upgrade, перезагрузка. TMP и TMPDIR разные. 

1. В конец /etc/profile.d/tmpdir.sh добавляем строку. Теперь файл выглядит так:
# If TMPDIR is not defined or is not a writable directory,
# set it to ~/tmp if the latter is a writable directory.

if [ -z "$TMPDIR" ] || [ ! -d "$TMPDIR" -o ! -w "$TMPDIR" ]; then
        if [ -d "$HOME/tmp" -a -w "$HOME/tmp" ]; then
                export TMPDIR="$HOME/tmp"
        elif [ -d "/tmp" -a -w "/tmp" ]; then
                export TMPDIR="/tmp"
        fi
fi

export TMPDIR="/tmp/.private/$USER"

2. После перезагрузки и графического входа юзера все зависает.
Смотрим .xsession-errors:0
Running Xsession[2832] /usr/bin/startxfce4
Agent pid 2876
/usr/bin/startxfce4: X server already running on display :0
xrdb:  "Xft.hinting" on line 8 overrides entry on line 5
xrdb:  "Xft.hintstyle" on line 10 overrides entry on line 6
_IceTransmkdir: ERROR: euid != 0,directory /tmp/.ICE-unix will not be created.

(xfce4-session:2832): xfce4-session-WARNING **: 03:41:46.007: Unable to open temporary file: Не удалось создать файл «/tmp/.private/slinkin/.xfsm-ICE-XOF410»: Нет такого файла или каталога

(xfce4-session:2832): xfce4-session-WARNING **: 03:41:46.018: xfsm_manager_load_session: Something wrong with /home/slinkin/.cache/sessions/xfce4-session-altedu:0, Does it exist? Permissions issue?

(xfwm4:3019): xfwm4-WARNING **: 03:41:46.138: Unsupported GL renderer (llvmpipe (LLVM 11.0.0, 256 bits)).
vmware-user: could not open /proc/fs/vmblock/dev

** (xfce4-screensaver:3256): WARNING **: 08:42:20.234: в этом сеансе уже запущен хранитель экрана

** (tracker-extract:3209): WARNING **: 08:42:22.517: Unknown desktop entry type 'Service'

(xfce4-session:2832): GLib-WARNING **: 08:42:33.987: GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). See the documentation of g_child_watch_source_new() for possible causes.
Произошла ошибка: Время ожидания истекло

Тот-же файл до изменения /etc/profile.d/tmpdir.sh:
Running Xsession[2960] /usr/bin/startxfce4
Agent pid 3004
/usr/bin/startxfce4: X server already running on display :0
xrdb:  "Xft.hinting" on line 8 overrides entry on line 5
xrdb:  "Xft.hintstyle" on line 10 overrides entry on line 6
_IceTransmkdir: ERROR: euid != 0,directory /tmp/.ICE-unix will not be created.

(xfce4-session:2960): xfce4-session-WARNING **: 08:49:25.319: xfsm_manager_load_session: Something wrong with /home/slinkin/.cache/sessions/xfce4-session-altedu:0, Does it exist? Permissions issue?

(xfwm4:3148): xfwm4-WARNING **: 08:49:25.445: Unsupported GL renderer (llvmpipe (LLVM 11.0.0, 256 bits)).

(xfwm4:3148): xfwm4-WARNING **: 08:49:25.451: Dismissing XPresent as unusable, error 3 (BadWindow (invalid Window parameter))
vmware-user: could not open /proc/fs/vmblock/dev

(wrapper-2.0:3177): Gtk-WARNING **: 08:49:26.527: Negative content width -3 (allocation 1, extents 2x2) while allocating gadget (node button, owner GtkToggleButton)

(wrapper-2.0:3171): Gtk-WARNING **: 08:49:26.807: Negative content width -3 (allocation 1, extents 2x2) while allocating gadget (node button, owner GtkToggleButton)

(wrapper-2.0:3174): Gtk-WARNING **: 08:49:27.015: Negative content width -3 (allocation 1, extents 2x2) while allocating gadget (node button, owner PulseaudioButton)

(wrapper-2.0:3173): Gtk-WARNING **: 08:49:27.581: Negative content width -1 (allocation 1, extents 1x1) while allocating gadget (node button, owner GtkButton)

(wrapper-2.0:3172): Gtk-WARNING **: 08:49:27.749: Negative content width -13 (allocation 1, extents 7x7) while allocating gadget (node button, owner PlacesButton)

** (xfce4-screensaver:3268): WARNING **: 08:49:27.776: в этом сеансе уже запущен хранитель экрана

** (tracker-extract:3213): WARNING **: 08:49:29.805: Unknown desktop entry type 'Service'

(xfce4-session:2960): GLib-WARNING **: 08:49:40.539: GChildWatchSource: Exit status of a child process was requested but ECHILD was received by waitpid(). See the documentation of g_child_watch_source_new() for possible causes.

Единственная значимое изменение, в первом файле есть, во втором - нет:
(xfce4-session:2832): xfce4-session-WARNING **: 03:41:46.007: Unable to open temporary file: Не удалось создать файл «/tmp/.private/slinkin/.xfsm-ICE-XOF410»: Нет такого файла или каталога
Проблема явно связана с временным каталогом. Временный файл не может быть создан, так как временный каталог отсутствует, либо нет прав для создания в нем файла.
Мои предположения: Если временный каталог создает pam_mktemp, то по каким-то причинам он не вызывается при логине в графике.