systemd
Да я догадался. Только systemd тут ни при чём, т.к. в спецификации про него не указано.
Полазил по лайву стартеркита xfce с systemd, посмотреть как это там устроено.
Мыслил так:
Переменной XDG_RUNTIME_DIR присваивает значение /lib64/security/pam_systemd.so
$ export | grep XDG_RUNTIME_DIR
declare -x XDG_RUNTIME_DIR="/run/user/500"
Но непонятно было, что создаёт каталог /run/user/$UID и когда.
Спросил гугл:
https://unix.stackexchange.com/questions/162900/what-is-this-folder-run-user-1000Парни говорят, что /run/user/$UID создаёт pam_systemd.so и он же присваивает это значение переменной XDG_RUNTIME_DIR.
С кодом Си, это мягко говоря не ко мне, но в комментарии, в строках 483-488, увидел отказ присвоения переменной, если каталог не корректный:
https://github.com/systemd/systemd/blob/main/src/login/pam_systemd.cТ.е. получается что pam_systemd.so создаёт каталог /run/user/$UID с нужными правами
# ll /run/user
итого 0
drwxr-xr-x 33 root root 800 дек 11 2021 ../
drwx------ 9 altlinux altlinux 220 дек 11 2021 500/
drwxr-xr-x 3 root root 60 дек 11 2021 ./
и он же присваивает этот путь переменной
# strings /lib64/security/pam_systemd.so | grep 'XDG_RUNTIME_DIR\|run/user'
XDG_RUNTIME_DIR
/run/user/%u
Not setting $XDG_RUNTIME_DIR, as the directory is not in order.
/run/userdb
Сам каталог находится в tmpfs
# mount | grep run/user
tmpfs on /run/user/500 type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1630992k,nr_inodes=407748,mode=700,uid=500,gid=500)
gvfsd-fuse on /run/user/500/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=500,group_id=500)
И судя по всему, создаётся он на логине пользователя:
# ll /run/user
итого 0
drwxr-xr-x 33 root root 800 дек 11 2021 ../
drwx------ 9 altlinux altlinux 220 дек 11 2021 500/
drwxr-xr-x 3 root root 60 дек 11 2021 ./
# grep 50[0-3] /etc/group
altlinux:x:500:
tester:x:501:
# who
altlinux tty1 2021-12-11 04:16 (:0)
root pts/1 2021-12-11 01:20 (localhost)
В альтовых системах на sysv, авторизация сломана.
И судя по соощению Лёши Гладкова, починить её в альтах, не представляется возможным:
https://lists.altlinux.org/pipermail/devel/2019-November/208963.htmlСделать бы хотя бы грубую прикидку, как бы выкрутить этот XDG_RUNTIME_DIR в альтах на sysv.
Если не трогать альтовые пакеты, на ум пришёл костыль, который положить в пакет polkit-sysvinit:
В /etc/xdg/autostart ложить desktop-файл с командой создающей /run/user/$UID, устанавливающей chmod 0700 и присваивающей значение XDG_RUNTIME_DIR. Но работать это будет только при входе пользователя в X-сессию.
Как это сделать лучше, чтобы было и при логине через tty в runlevel 3, всё в тумане.
Но эта проблема, порождает другую проблему:
Как грохнуть каталог /run/user/$UID на выходе из сессии.