The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Предложение по переводу системных логов lastlog, btmp, utmp и wtmp на использование SQLite

13.03.2026 08:11 (MSK)

В списке рассылки linux-api выставлено на обсуждение предложение (RFC) заменить устаревшие бинарные форматы системных журналов lastlog, btmp, utmp и wtmp на новые разделяемые библиотеки, использующие SQLite в качестве бэкенда. Инициатива направлена на решение накопившихся проблем, среди которых переполнение 32-разрядных счётчиков времени в 2038 году, отсутствие расширяемости, низкая производительность запросов и отсутствие атомарности при записи.

В настоящее время для хранения данных о сеансах и попытках аутентификации в Linux используются следующие бинарные файлы, имеющие фиксированную структуру:

  • /var/log/lastlog - время последнего входа (структура "struct lastlog" с полем "ll_time" 32-разрядного типа time_t);
  • /var/log/btmp - неудачные попытки входа;
  • /var/run/utmp - текущие сеансы;
  • /var/log/wtmp - история входов и выходов.

Формат данных файлов был разработан несколько десятилетий назад и имеет ряд фундаментальных ограничений:

  • Поле "tv_sec" в структуре "utmpx" и поле "ll_time" в "lastlog" имеют тип "int32_t", значение счётчиков времени на основе которого переполнится 19 января 2038 года. Из-за требований ABI‑совместимости даже на 64-разрядных системах эти поля остаются 32-разрядными, поэтому проблема затронет все установки Linux.
  • Фиксированный размер записей не позволяет добавлять новые поля (например, идентификатор контейнера, имя сервиса, IP-адрес) без полной замены формата и перекомпиляции всех утилит.
  • Утилиты last, lastb, who и lastlog вынуждены линейно перебирать содержимое файлов. При большом размере журналов без использования индексов, позволяющих эффективно фильтровать записи, нагрузка на систему ввода/вывода и задержки при выполнении запросов становятся неприемлемыми.
  • Запись в бинарный файл не является атомарной операцией. При сбое запись может быть частично повреждена.
  • Для исключения конфликтов при одновременной записи в журтал несколькими процессами (например, sshd и login) используются flock-блокировки, которые не гарантируют атомарность и могут приводить к взаимным блокировкам.

Автор RFC предлагает полностью отказаться от бинарных форматов в пользу специализированных разделяемых библиотек, использующих SQLite. Для каждого типа журналов создаётся отдельная библиотека с единообразным C-интерфейсом: liblastlog2, libbtmp2, libutmp2 и libwtmp2. Все библиотеки работают с БД, схема которых включает 64-разрядные временные метки (тип INTEGER) и индексы по пользователю и времени. Имеется возможность добавления новых полей без нарушения совместимости (через ALTER TABLE).

Среди доводов в пользу использования SQLite упоминается использование 64-разрядного типа INTEGER для хранения эпохального времени, задействование индексов для снижения ввода/вывода за счёт выборочного обращения к записями вместо полного сканирования, возможность добавления новых полей без изменения существующих записей, поддержка ACID-транзакций, режим WAL (Write-Ahead Logging) для конкурентного доступа без блокировок, проверенная надёжность работы SQLite.

Для обеспечения плавного перехода предлагается стратегия "двойной записи" (dual-write):

  • Программы, которые пишут в бинарные файлы (login, sshd, sudo, cron и др.), модифицируются так, чтобы одновременно выполнять запись и в старый бинарный файл, и в новую SQLite-базу через соответствующую библиотеку.
  • Разрабатываются новые версии утилит (last2, lastb2, who2, lastlog2), которые читают данные из SQLite-баз, используя индексы для быстрой работы. Старые утилиты продолжают работать с прежними файлами.
  • Через несколько лет, когда подавляющее большинство систем обновятся, поддержка записи в старые форматы может быть отключена, а старые утилиты - объявлены устаревшими.

Вопросы, выставленные для дополнительного обсуждения:

  • Целесообразность разделения на отдельные библиотеки или объединения в одну (например, libsession2).
  • Выбор имён для библиотек и утилит (сохранить исторические названия или перейти к более общим).
  • Расположение файлов баз данных (/var/lib/ как для состояния приложений или /var/log/ как для логов).
  • Механизм версионирования схемы и миграции.
  • Параметры производительности SQLite для различных сценариев (серверы, встраиваемые системы).
  • Предоставление fallback-бэкенда, хранящего журналы в упрощённом бинарном формате, для систем, на которых SQLite может оказаться избыточным (например, встраиваемые устройства с жёсткими ограничениями по памяти).


  1. Главная ссылка к новости (https://github.com/bakshansky/...)
  2. OpenNews: Для избавления Glibc от проблемы 2038 года предложено прекратить использование utmp
  3. OpenNews: Уязвимость в SQLite, позволяющая удалённо атаковать Chrome через WebSQL
  4. OpenNews: Проект Redka развивает реализацию протокола и API Redis поверх SQLite
  5. OpenNews: Эксперимент с использованием SQLite в качестве контейнера для архивирования файлов
  6. OpenNews: Google использовал большую языковую модель для выявления уязвимости в SQLite
Автор новости: Аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/64981-wtmp
Ключевые слова: wtmp, log, sqlite
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (53) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 08:25, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Чем metakit4 не угодил?
     
     
  • 2.15, Аноним (15), 08:42, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Написана на C++ - https://ru.wikipedia.org/wiki/MetaKit
     
  • 2.18, Жироватт (ok), 08:44, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Недостаточно стильно@модно@молодёжно и обновлялась не "в прошлом месяце"
    Хотя я не удивлён был бы, если бы туда по решению платинового спонсора предложили запихнуть sql server 2026 localDB
     
     
  • 3.20, Аноним (15), 08:56, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ну это уже перебор, хватит https://github.com/microsoft/FASTER
     
     
  • 4.32, Жироватт (ok), 09:15, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Почему перебор? Самый раз. Полноценный движок баз, который потом можно будет смигрировать на

    "
    Три файла БД – для логов царственных демонов в системдишных шатрах,
    Семь – для пользовательских профилей программ и гуртовщиков мыши,
    Девять – для всеъ, облечённых в сисопские права,
    Один движок запустит Владыка на облачном троне,
    В ядре по имени linux, где уже распростёрся мрак.

    Один ms sql server в системе покорит их, он соберет их,
    скуль сервер притянет их и в чёрную цепь скуёт их
    В ядре по имени linux, где уже распростёрся мрак.
    "

     
  • 3.21, Аноним (21), 08:56, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    - Для каждого типа журналов создаётся отдельная библиотека
    - задействование индексов
    - одновременно выполнять запись и в старый бинарный файл, и в новую SQLite-базу

    Странная система логирования. Мы точно логи пишем?

     
     
  • 4.33, Жироватт (ok), 09:16, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, для времени миграции с базы на базу - вполне.
    Далее старый способ фиксации логов отключается, когда новый уже достаточно отлажен
     
     
  • 5.44, Аноним (21), 09:46, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Уточню проблему, если кто не понял:

    - Для каждого типа журналов создаётся отдельная библиотека
    - задействование индексов

    Точно логи пишем?

     
  • 3.52, Аноним (52), 10:08, 13/03/2026 Скрыто ботом-модератором     [к модератору]
  • +/
     

  • 1.2, User (??), 08:25, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Автор RFC предлагает полностью отказаться

    Так вроде ж и отказались уже - в пользу journald?

     
  • 1.3, Аноним (52), 08:28, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    "Запись в бинарный файл не является атомарной операцией. При сбое запись может быть частично повреждена."

    Так это и к journald относится, разве нет?

     
     
  • 2.16, Олег (??), 08:42, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Да не слушай их. Программисты деградируют походу. Если записывать не больше страницы за раз, то вполне себе атомарная. А дальше уже работает журнал ФС. Sqlite хорошая штука, но зачем тащить её сюда,  не понятно.
     
  • 2.46, Аноним (21), 09:54, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > При сбое запись может быть частично повреждена

    Дак это и к скуляйту относится. Что они подразумевают под сбоем? Железо гикнулось? Система в панике? Приложение кривое? Первым двум скуляйт не поможет. Остаётся приложение. Если приложение глюкнуло - мы в логах ничего не увидим. Скуляйт намекает, что сервера логирование теперь нету, а записью занимается непосредственно само приложение.

     

  • 1.6, iCat (ok), 08:31, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Кому-то очень хочется внедрить нечитаемую систему протоколирования из мира Windows в мир GNU/Linux ?
    А зачем?
    Системды мало?
     
     
  • 2.9, Аноним (9), 08:32, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Когда свободу на хлеб, остаются и без свободы и без хлеба.          
     
  • 2.11, анон (?), 08:34, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Она и сейчас нечитаемая.
     
  • 2.28, Аноним (52), 09:12, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    А это "год линукса на десктопе против серверного линукса" ака "функциональность против простоты"
    И то, и другое имеет право на жизнь...
     
  • 2.36, aname (ok), 09:23, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Раст в ведро протащили, почему бы и не протащить SQLite
     

  • 1.7, Аноним (9), 08:31, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Хранение логов в тормозлайт худшая идея, какую можно придумать. Ещё это завязывает на стороннего разработчика, который неизвестно что может сделать и с продуктом и со своим форматом. Если они такие любители прокладок пусть пишут новые либы для нового бинарного собственного и если надо расширяемого формата. А не превращают всю систему в один единый тормозящий скуль.
     
     
  • 2.13, Фонтимос (?), 08:37, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Подтверждаю, линукс станет тормозом. Хотя по мне, пучть внедряют, быстрее все слиняют на ФриБиЭсДи.
     
     
  • 3.30, gz (?), 09:14, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    все ненадо, ато слиняют ведь и те внедрятели с чудесатыми предложениями сделать чтото во фряхе
     
  • 2.17, User (??), 08:43, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, в доelastic'овскую пору - я вот вполне себе делал центральный rsyslog с хранением в mysql - вполне себе работало.
     
     
  • 3.29, Аноним (52), 09:13, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    mysql и sqlite не сравнимы по скорости
     
     
  • 4.41, User (??), 09:39, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Ну да - sqlite в таких сценариях прям сильно быстрее будет.
     
  • 2.38, Аноним (38), 09:24, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > Хранение логов в тормозлайт

    По сравнению с чем SQLite тормозной?

     
  • 2.39, letsmac (ok), 09:36, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    1C в свое время такое уже пробовал. В итоге вернулись к бинарным журналам. Тормозило на больших файлах знатно.
     
  • 2.40, Аноним (38), 09:38, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > это завязывает на стороннего разработчика, который неизвестно что может сделать и с продуктом

    Ничего он не может сделать после того, как конкретная версия опубликована.

    > Если они такие любители прокладок пусть пишут новые либы для нового бинарного собственного и если надо расширяемого формата

    Да вон уже понаписали велосапедов; список в новости. В пятый раз наступать на те же грабли изобретением пятого велосапеда, видимо, не хотят.

    > А не превращают всю систему в один единый тормозящий скуль

    Тем временем в новости:

    "проблем, среди которых [...] низкая производительность запросов"

    Но в пятом велосапеде обязательно получится быстро!

     

  • 1.8, Аноним (8), 08:31, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А в чём проблема писать условный protobuf? Быстро, дёшево, достаточно атомарно
     
     
  • 2.57, Сталин (?), 10:16, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Возможно тем, что там нет индексов и поиск o(n), а не o(log n)
     

  • 1.12, Аноним (12), 08:35, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    т.е. если все равно переписывать, то они предлагают переписать так, чтобы сразу отсечь кору дуба и embedded системы, вместо того чтобы решить проблему создать новую
     
  • 1.19, Duck Fi (?), 08:45, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Идея неплохая, но мб пора задуматься и унифицировать не только это ?
    Почти каждый файл конфигурации и данных имеет свой формат.
    Например /etc/passwd,  мб что то по типу yaml применять.
    И обязательно сохранить текстовый формат, можно потерпеть скорость, потому что тут она не на что не влияет.
     
     
  • 2.22, User (??), 09:00, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Да сделали бы сразу "реестр linux - можно поверх sqlite'а", что ли - чего стесняться-то?
     
     
  • 3.25, Аноним (21), 09:03, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > можно поверх sqlite'а

    sqlite'а обязательно в контейнере

     
     
  • 4.34, Жироватт (ok), 09:21, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Внутри особой виртуальной машины
     
  • 3.31, Аноним (31), 09:15, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Было бы неплохо, если одним методом/способом модно было управлять настройками всего софта, как на системном, так и на пользовательском уровне. Вроде были попытки /etc в xml/json записать. Но это надо от религии отказаться. Потому что как и во всякой религии наибольшее сопротивление любому (даже самому здравому изменению) будет от упоротых фундамендалистов.
    Хотите чтобы все было как 20 лет назад? В чем проблема - скачайте из архива линукс 20 летней давности и пользуйте.

    Проблема виндового реестра в бинарности и монолитности, что легко решаемо технически. Но В еще большей мере в отсутствии документации, и зоопарком подходов чего и зачем там хранить.  

     
     
  • 4.35, Duck Fi (?), 09:21, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо, а то я уже думал что меня не поняли.
     
     
  • 5.42, Аноним (31), 09:45, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Это понимает любой, кому приходится часто лезть в потроха линуксовых систем. Ну а школота на то и школота - ей, как собачке, главное заявить о своем присутствии опИсав самый высокий столб/дерево/забор что они нашли в пределах своей видимости.
     
  • 4.43, User (??), 09:46, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    А не нужно уже. Проблема "в общем" решена дополнительными уровнями абстракции в виде terraform+(ansible|salt|черт-в-ступе) - _ты_ управляешь состоянием системы плюс-минус декларативно, описывая его да-да, вот этими вот yaml'ями плюс-минус в одном месте - а то, что "под капотом" там ошмётки потрохов с 70х еще годов... Ну вот у связистов еще с 40х наследие не разгребли до конца, а у энергетиков - так и вовсе девятнаха местами, и чО? Не переделывать же, право-слово.
     
  • 3.48, Аноним (52), 10:05, 13/03/2026 Скрыто ботом-модератором     [к модератору]
  • +/
     

  • 1.23, Аноним (23), 09:01, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Короче, нельзя поменять то, нельзя поменять сё, потому что совместимость. Тогда давайте все на sqlite переведем, ведь он остается совместимым с тем что было до него.
     
     
  • 2.49, Аноним (21), 10:05, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    > все на sqlite переведем

    Надо не забыть структуру полей лога тоже хранить в таблице скуляйт для переносимости и совместимости, и формат структуры тоже в таблице, и таблицу тоже в таблице.

     

  • 1.24, Аноним (21), 09:02, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > Фиксированный размер записей не позволяет добавлять новые поля

    А текстовый формат всё позволял.

     
     
  • 2.37, Жироватт (ok), 09:24, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Это не стильно, не модно, нужно знать grep+awk и иметь квалификацию повыше, чем one-button-monkey.
     
     
  • 3.50, Аноним (21), 10:06, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Для чтения бинарников или скуляйта что надо знать? :)
     
  • 3.54, Аноним (54), 10:12, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Короче, нужно по-дидовски и пердольно.
     

  • 1.26, Аноним (23), 09:08, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Предоставление fallback-бэкенда, хранящего журналы в упрощённом бинарном формате, для систем, на которых SQLite может оказаться избыточным (например, встраиваемые устройства с жёсткими ограничениями по памяти).

    А там что с изначальными ограничениями будет? Если их нет, то почему тогда этот fallback и не использовать везде вместо sqlite?

     
  • 1.27, Аноним (21), 09:10, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > не позволяет добавлять новые поля (например, идентификатор контейнера, имя сервиса, IP-адрес)
    > liblastlog2, libbtmp2, libutmp2 и libwtmp2... возможность добавления новых полей ... (через ALTER TABLE)

    Надо так: liblastlog2containerid liblastlog2servicename liblastlog2ipaddress libbtmp2containerid libbtmp2servicename  libbtmp2ipaddress libutmp2containerid libutmp2servicename  libutmp2ipaddress libwtmp2containerid libwtmp2servicename libwtmp2ipaddress

     
  • 1.45, мяв (?), 09:51, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    хорошая идея, надеюсь линус прочтет меня на опеннет.ру
     
  • 1.47, Диды (ok), 10:04, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Для исключения конфликтов при одновременной записи в журтал несколькими процессами (например, sshd и login) ....

    Чёт не понятно, как тут sqlite поможет

     
     
  • 2.51, Аноним (52), 10:06, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Механизм блокировки
     
     
  • 3.56, Аноним (21), 10:15, 13/03/2026 [^] [^^] [^^^] [ответить]  
  • +/
    Этот механизм эксклюзивный только для скуляйта? Больше нигде нельзя использовать?
     

  • 1.53, Аноним (21), 10:10, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Предоставление fallback-бэкенда, хранящего журналы в упрощённом бинарном формате, для систем, на которых SQLite может оказаться избыточным

    Получается, скуляйт более жрущий память и более тормозной, а не то, что расписали в новости.

     
  • 1.55, Аноним (55), 10:14, 13/03/2026 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    самый лучший формат в данном случае - это текстовый.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2026 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру