Торстен Кукук (Thorsten Kukuk), лидер группы по развитию технологий будущего в компании SUSE (Future Technology Team, развивает openSUSE MicroOS и SLE Micro), ранее 10 лет руководивший проектом SUSE LINUX Enterprise Server, предложил избавиться от файла /var/run/utmp в дистрибутивах для полного решения проблемы 2038 года в Glibc. Все приложения, использующие utmp, wtmp и lastlog, предлагается перевести на получение списка пользователей при помощи systemd-logind.
19 января 2038 года произойдёт переполнение счётчиков эпохального времени, заданных 32-разрядным типом time_t. В библиотеке Glibc, несмотря на внедрение 64-разрядного типа time_t, для сохранения совместимости с 32-разрядными приложениями пространства пользователя в некоторых случаях на 64-разрядных платформах продолжает применяться 32-разрядный тип time_t. Одним из таких случаев является файл /var/run/utmp, хранящий данные о пользователях, в данный момент работающих в системе. Поле с временем в utmp задаётся с использованием 32-разрядного значения time_t.
Просто заменить поле со временем в utmp с 32-разрядного на 64-разрядный тип не получится, так как это приведёт к изменению ABI Glibc (изменится тип в функциях, подобных login(), getutid() и utmpname()) и нарушению совместимости с приложениями, использующими utmp, в числе которых w, who, uptime, login, su, sudo, useradd, systemd, sysvinit, tcsh, xterm дисплейные менеджеры, emacs, openssh, qemu, samba, rsyslog и т.п. Из-за обилия возможных подводных камней и трудоёмкости идея замены в utmp разрядности типа time_t была отвергнута разработчиками Glibc. По той же причине был отброшен вариант с использованием имеющегося в структуре utmp свободного пространства для добавления дополнительного 64-разрядного поля для времени.
Кроме того, изменение разрядности типа в utmp не решает другие имеющиеся проблемы, от которых также хотелось бы избавиться. Например, для записи в utmp требуются специальные права, что требует предоставления процессам дополнительных привилегий. Ещё одна проблема связана с тем, что архитектура utmp допускает совершение локальными пользователями DoS-атак, приводящих к нарушению работы сервиса utmp через манипуляции с блокировками на файл, из-за чего нельзя быть уверенным, что содержимое utmp отражает реальное состояние в системе. Для обработки доступа к utmp предлагалось использовать дополнительный фоновый процесс, но для подобных задач уже существует процесс systemd-logind и запуск ещё одного специализированного процесса не является целесообразным (приложениям придётся передавать данные одновременно в два обработчика).
При этом даже при решении проблемы с DoS-атаками содержимое utmp остаётся лишь информационным, не гарантирующим отражение реальной действительности. Например, разные эмуляторы и мультиплексоры терминалов по разному отражают своё состояние - запуск пяти терминалов GNOME приведёт к отражению в utmp одного пользователя, а запуск пяти терминалов konsole или xterm в KDE - шести. Аналогично отличается поведение screen и tmux, в первом случае каждый сеанс учитывается как отдельный пользователь, а во втором отражается только один пользователь на все сеансы.
В итоге в качестве наиболее простого решения предлагается перевести все приложения на использование уже существующего альтернативного сервиса systemd-logind и после того как не останется актуальных программ, обращающихся к utmp, прекратить запись в utmp. Для замены wtmp предлагается подготовить программные интерфейсы для записи и чтения информации о пользователях при помощи systemd-journald.В кодовую базу следующего выпуска systemd 254 уже включены необходимые функции для предоставления заменяющих utmp данных через libsystemd с использованием API sd-login.h или через DBUS.
// cc-by opennet.ru
// converted with crypt’s opennet autoreposter
<<<

Лезть программам в файлы напрямую без энкапсуляции (например библиотекой со стандартным API) было изначально плохой идеей. В этом плане Windows разумнее устроен.
а разве glibc сама по себе не является вот этим самым API, который отделяет прикладные программы от файла?
glibc умеет читать
/var/run/utmp? Тогда в чём проблема и почему предлагают новый API черезlibsystemd?а, не умеет, да…
Файлы в юниксах и есть API
При записи несколькими программами в один и тот же файл всё может сломаться. Или по крайней мере не забисаться один из результатов.
тут надо признать, что под этим имеются ввиду файлы, которые можно читать при помощи вызовов glibc. а если это какой-то кастомный utmp-бинарный формат, то это не особо и UNIX-way. это как бинарные журналы systemd.
p.s.
а аватарка твоя отстой. пришлось тебя пока заигнорить, чтобы не портила вид. так вот рендомно включил ответы в топике, почитал, ответил.
Аватарок бояться – в интернет не ходить.
а я особо и не хожу
а напомни мне, как там в виндовс обстоит дело с комбинированными бинарниками 32/64 бита? емнип, у них же было какое-то решение?
что-то я не могу разобраться, как фотошоп комбинирует сразу 32 и 64 версию.
Никак. Windows так не умеет. Умеет только комбинировать 16 битные DOS бинарники, которые обычно пишут “This program can’t be run in DOS mode.” и выходят.
«а аватарка твоя отстой. пришлось тебя пока заигнорить, чтобы не портила вид» Какие мы нежные! Зы: у тебя адблока нет что ли?
после переезда в этот инстанс для клуба еще не поставил. думал, что не понадобится.
А причем здесь клуб, ты настолько Ъ, на другие сайты в интернете не ходишь?