Задача
Снимки «раз в N минут» слишком редки, классический бэкап слишком медленный для оперативного восстановления. После ошибки оператора или логической порчи данных состояние нужно вернуть не «примерно», а максимально близко к моменту сбоя.
dm-timemachine решает это через CDP (continuous data protection): вместо редких снимков - непрерывный журнал изменений между контрольными точками. Можно откатить том к нужному моменту времени, разобрать инцидент на уровне блоков и строить восстановление с предсказуемым RPO.
Как работает
Ядерный модуль встраивается в путь записи на уровне Device Mapper и журналирует каждую значимую операцию записи. Ключевое решение - логирование как параллельный канал рядом с основным вводом-выводом, а не вместо него: рабочая запись всё равно доходит до диска, а слой защиты живёт отдельной подсистемой со своими метриками, контролем перегрузки и политиками деградации.
Путь данных:
- Приложение или файловая система пишет в устройство Device Mapper.
target.cполучаетbioи передает запись вio_engine.c.policy.cрешает, захватывать операцию или отбросить: размер записи, списки устройств, ограничение частоты.metadata.cсобирает заголовок (временная метка, сектор, размер, версия, флаги),log_store.cпишет его вместе с полезной нагрузкой в кольцевой буфер.- Исходный
bioперенаправляется на нижележащее устройство. - Пользовательское пространство читает журнал через
/dev/dm_timemachine_log, экспортирует метрики или воспроизводит данные.
Модуль разделён на изолированные слои (core, target, io_engine, metadata, policy, log_store, read_api), чтобы режим хранения, политики и API восстановления можно было развивать, не переписывая путь данных.
Возможности
- Кольцевой буфер с фиксированным потреблением памяти; хранение в RAM для быстрого стенда или на отдельном блочном устройстве для персистентности
- Политики захвата: ограничение размера записи, allow/deny-списки устройств, лимит записей в секунду
- Read API: чтение журнала из пользовательского пространства через символьное устройство
- Экспортер Prometheus на Python и дашборды Grafana:
captured,dropped,log_used, задержки - Скрипты воспроизведения: проверка без записи, откат состояния, восстановление до заданной временной отметки
- Дымовые и интеграционные проверки: жизненный цикл
dmsetup, воспроизведение, персистентность
Результат
Рабочий CDP-контур: том Device Mapper с непрерывным журналом изменений, восстановлением на момент времени и наблюдаемостью через Prometheus/Grafana. Проверяется дымовыми и интеграционными тестами в воспроизводимой среде (виртуальная машина, Docker, devcontainer).
Технический стек
- Ядерный модуль: C (Linux kernel API)
- Инструменты пользовательского пространства: Python
- Мониторинг: Prometheus, Grafana, Docker Compose
- Тестирование: KUnit, дымовые и интеграционные проверки
- Окружение: devcontainer, виртуальная машина, Docker
