асинхронный ввод-вывод нового поколения и VPN прямо в ядреnext-generation async I/O and a VPN right in the kernel

Linux 5.x: io_uring, WireGuard и разговоры о RustLinux 5.x: io_uring, WireGuard, and talk of Rust

Три года без единого драматического взлома безопасности (в отличие от предыдущей ветки) — вместо этого системный пересмотр того, как Linux делает асинхронный I/O, слияние стороннего VPN-протокола в мейнлайн за рекордные сроки и годы публичных обсуждений Rust в ядре, которые так и не завершились мержем внутри самой этой ветки.Three years without a single dramatic security crisis (unlike the previous branch) — instead, a systemic rethink of how Linux does async I/O, a third-party VPN protocol merging into mainline in record time, and years of public debate about Rust in the kernel that never quite closed with a merge within this branch itself.

io_uring 2019–2022

Что этоWhat it is

Ветка 5.x охватывает три с половиной года — с 3 марта 2019 (5.0.0) до 31 июля 2022 (5.19, последний релиз перед сменой номера на 6.0). Модель разработки не менялась четвёртый раз подряд. Главный технический сюжет ветки — io_uring (5.1, май 2019), новый интерфейс асинхронного ввода-вывода, спроектированный так, чтобы наконец закрыть многолетние ограничения POSIX AIO и epoll через общие кольцевые буферы между ядром и userspace. Второй заметный сюжет — WireGuard (5.6, март 2020), VPN-протокол, слившийся в мейнлайн необычно быстро для внешнего проекта такого масштаба. Третий, менее очевидный на момент событий — многолетние публичные обсуждения Rust в ядре, начавшиеся именно в этот период, но фактически завершившиеся мержем инфраструктуры лишь в следующей ветке, 6.1 (декабрь 2022) — за пределами формальных рамок 5.x.The 5.x branch spans three and a half years — from March 3, 2019 (5.0.0) to July 31, 2022 (5.19, the last release before the number changed to 6.0). The development model didn't change for the fourth time running. The branch's main technical story is io_uring (5.1, May 2019), a new asynchronous I/O interface designed to finally close the long-standing limitations of POSIX AIO and epoll via shared ring buffers between kernel and userspace. The second notable story is WireGuard (5.6, March 2020), a VPN protocol that merged into mainline unusually fast for an external project of that scale. The third, less obvious at the time — years of public debate about Rust in the kernel, which began during this period but only actually closed with an infrastructure merge in the next branch, 6.1 (December 2022) — outside 5.x's formal boundaries.

версияversionдатаdateчто именно изменилосьwhat actually changed
5.0.02019-03-03снова чисто нумерационный жест (см. 3.x, 4.x) — минорная цифра 4.20 разрослась; по содержанию прямое продолжение 4.20 без архитектурного разрываagain a purely numerical gesture (see 3.x, 4.x) — the 4.20 minor number had grown unwieldy; content-wise a direct continuation of 4.20 with no architectural break
5.12019-05-05io_uring — новый интерфейс асинхронного ввода-вывода поверх общих кольцевых буферов submission/completion между ядром и userspace, поддержка и буферизованного, и небуферизованного I/O, плюс асинхронный polled I/O; масштабная переработка VFS для снятия ограничений старого дизайна mount(2)io_uring — a new async I/O interface built on shared submission/completion ring buffers between kernel and userspace, supporting both buffered and unbuffered I/O plus async polled I/O; a large-scale VFS rework to remove limitations of the old mount(2) design
5.42019-11-24exFAT входит в staging-область ядра — впервые не через сторонний модуль, а как часть исходников самого ядра (Microsoft передала спецификацию и патчи); последний крупный релиз 2019 годаexFAT lands in the kernel's staging area — for the first time not as a third-party module but as part of the kernel's own source tree (Microsoft contributed the spec and patches); the last major 2019 release
5.62020-03-29WireGuard сливается в мейнлайн — компактный, легко аудируемый VPN-протокол вместо громоздкого IPsec; попутно: time namespaces, начальная поддержка USB4, асинхронный TRIM для SSD в Btrfs, ранний Multipath TCPWireGuard merges into mainline — a compact, easily auditable VPN protocol replacing bulky IPsec; alongside it: time namespaces, initial USB4 support, asynchronous SSD trimming in Btrfs, early Multipath TCP
5.102020-12-13LTS-релиз (запланированная поддержка до 2026 — на год дольше, чем у 5.4): fast commits в ext4 для резкого сокращения задержки при частых файловых операциях, поддержка ARMv8.5 memory tagging, поддержка Amazon Nitro enclavesan LTS release (support planned through 2026 — a year longer than 5.4's): ext4 fast commits sharply reducing latency for frequent file operations, ARMv8.5 memory tagging support, Amazon Nitro enclave support
5.152021-10-31LTS-релиз: новый драйвер NTFS (замена устаревшего, изначально экспериментального), начальная поддержка графики Intel Xe HPG/DG2, IOMMU-драйвер для Apple M1 — первые шаги в сторону поддержки Apple Siliconan LTS release: a new NTFS driver (replacing the older, originally experimental one), initial Intel Xe HPG/DG2 graphics support, an IOMMU driver for the Apple M1 — the first steps toward Apple Silicon support
5.172022-03-20переписанный слой fscache, инструмент RTLA для анализа realtime-свойств ядра, поддержка CO-RE (Compile Once — Run Everywhere) для BPF-программ, переносимых между версиями ядра без перекомпиляцииa rewritten fscache layer, the RTLA tool for analyzing the kernel's realtime properties, CO-RE (Compile Once — Run Everywhere) support letting BPF programs run across kernel versions without recompiling
5.182022-05-22переход с устаревшего стандарта C89 на C11 для сборки самого ядра; продолжение доработки io_uring; RSA-шифрование для virtio-cryptothe kernel's own build switches from the outdated C89 standard to C11; continued io_uring refinement; RSA encryption for virtio-crypto
5.192022-07-31последний релиз ветки — поддержка новых процессоров и GPU; на момент выхода Торвальдс уже публично рассуждал о возможном мерже Rust-инфраструктуры «в одной из ближайших версий», но реальный merge случится только в 6.1the branch's final release — support for new CPUs and GPUs; at release time Torvalds was already publicly discussing a possible Rust-infrastructure merge "in one of the upcoming versions," but the actual merge wouldn't happen until 6.1

История: как это былоHistory: how it happened

01

Май 2019: io_uring закрывает многолетнюю проблему асинхронного I/OMay 2019: io_uring closes a long-standing async I/O problem

До io_uring у Linux было два неидеальных инструмента для асинхронного ввода-вывода: POSIX AIO, поддерживавший по сути только небуферизованный (O_DIRECT) файловый I/O с массой оговорок, и epoll, отлично работавший для сетевых сокетов, но не для обычных файловых операций. Автор io_uring, Йенс Аксбое (Jens Axboe), спроектировал принципиально другой механизм: приложение и ядро делят два кольцевых буфера в общей памяти — submission queue (SQ) для отправки запросов и completion queue (CQ) для получения результатов — что позволяет отправлять операции ввода-вывода и забирать их результаты почти без системных вызовов на каждую операцию, резко снижая накладные расходы под высокой нагрузкой. Возможность появилась в 5.1 (5 мая 2019) сразу поддерживающей и буферизованный, и небуферизованный I/O, а также асинхронный polled режим, и с самого начала была спроектирована так, чтобы расширяться далеко за пределы файлового I/O — что в последующие годы и произошло: сеть, таймеры, множество других операций.Before io_uring, Linux had two imperfect tools for async I/O: POSIX AIO, which in practice only really supported unbuffered (O_DIRECT) file I/O with a long list of caveats, and epoll, which worked great for network sockets but not for regular file operations. io_uring's author, Jens Axboe, designed a fundamentally different mechanism: the application and kernel share two ring buffers in shared memory — a submission queue (SQ) for sending requests and a completion queue (CQ) for retrieving results — letting I/O operations be submitted and their results collected with almost no per-operation syscalls, sharply cutting overhead under heavy load. The feature landed in 5.1 (May 5, 2019), supporting both buffered and unbuffered I/O plus an async polled mode right from the start, and was designed from day one to expand well beyond file I/O — which is exactly what happened in the following years: networking, timers, and many other operations.

02

Ноябрь 2019: exFAT входит в дерево ядра напрямуюNovember 2019: exFAT enters the kernel tree directly

exFAT — файловая система Microsoft, широко используемая на SD-картах и флешках большого объёма, — годами поддерживалась в Linux только через сторонние модули (FUSE-реализации или неофициальные патчи) из-за патентных опасений. Ситуация изменилась, когда Microsoft сама передала спецификацию и код в сообщество: 5.4 (24 ноября 2019) впервые включила exFAT в staging-область непосредственно исходников ядра — промежуточный этап перед полной интеграцией в основное дерево, пройденный уже в следующих релизах. Это показательный пример того, как патентная политика крупного вендора может годами определять судьбу вполне зрелой технической возможности в open-source ядре.exFAT — Microsoft's filesystem, widely used on large SD cards and flash drives — had for years been supported in Linux only through third-party modules (FUSE implementations or unofficial patches) due to patent concerns. That changed when Microsoft itself contributed the spec and code to the community: 5.4 (November 24, 2019) first included exFAT in the kernel source tree's staging area — an intermediate step before full integration into the main tree, completed in later releases. It's a telling example of how a large vendor's patent policy can determine a perfectly mature technical feature's fate in an open-source kernel for years.

03

Март 2020: WireGuard проходит путь от стороннего проекта до мейнлайна за рекордные срокиMarch 2020: WireGuard goes from a third-party project to mainline in record time

WireGuard разрабатывался Джейсоном Донефилдом (Jason A. Donenfeld) как принципиально более простая альтернатива IPsec и OpenVPN: минималистичный кодбейс, который проще формально верифицировать и аудировать, современная криптография без legacy-опций и режимов согласования, конфигурация в несколько строк вместо страниц настроек. Торвальдс лично хвалил качество кода задолго до мержа, называя его «произведением искусства» на фоне остального сетевого стека. WireGuard попал в дерево network maintainer'а Дэйва Миллера в декабре 2019, а Торвальдс подтянул его в свою ветку уже к 5.6 (29 марта 2020) — необычно быстрый путь для стороннего проекта такого масштаба в мейнлайн, обычно занимающий годы. Этот же релиз принёс менее заметные, но полезные вещи: time namespaces (независимое системное время для контейнеров, полезное, например, для тестирования time-travel сценариев) и асинхронный TRIM для SSD в Btrfs.WireGuard was developed by Jason A. Donenfeld as a fundamentally simpler alternative to IPsec and OpenVPN: a minimal codebase easier to formally verify and audit, modern cryptography with no legacy negotiation modes or options, configuration in a few lines instead of pages of settings. Torvalds personally praised the code's quality well before the merge, calling it "a work of art" against the rest of the networking stack. WireGuard landed in network maintainer Dave Miller's tree in December 2019, and Torvalds pulled it into his own branch already by 5.6 (March 29, 2020) — an unusually fast path to mainline for a third-party project of that scale, which usually takes years. The same release brought less visible but useful additions: time namespaces (independent system time for containers, useful for testing time-travel scenarios, for instance) and asynchronous SSD trimming in Btrfs.

04

2020–2021: два спокойных LTS-релиза2020–2021: two calm LTS releases

На фоне предыдущей ветки, потратившей почти год на аварийные патчи Meltdown/Spectre, 5.10 (13 декабря 2020) и 5.15 (31 октября 2021) выглядят почти спокойно — плановая инженерная работа без пожаротушения. 5.10 получила расширенный жизненный цикл поддержки (до 2026 года, на год дольше 5.4) и fast commits в ext4, резко сокращающие задержку при частых файловых операциях за счёт упрощённого журналирования небольших изменений. 5.15 принесла новый драйвер NTFS (пришедший на смену старому, изначально помеченному экспериментальным ещё в прошлых десятилетиях) и первые шаги в сторону поддержки Apple Silicon — IOMMU-драйвер для Apple M1, за несколько лет до того, как полноценная поддержка этого железа стала обыденностью для пользователей Asahi Linux и подобных проектов.Against the backdrop of the previous branch, which spent nearly a year on emergency Meltdown/Spectre patches, 5.10 (December 13, 2020) and 5.15 (October 31, 2021) look almost calm — planned engineering work without firefighting. 5.10 got an extended support lifecycle (through 2026, a year longer than 5.4's) and ext4 fast commits, sharply cutting latency for frequent file operations through simplified journaling of small changes. 5.15 brought a new NTFS driver (replacing the old one, originally flagged experimental decades earlier) and the first steps toward Apple Silicon support — an IOMMU driver for the Apple M1, years before full support for that hardware became routine for Asahi Linux users and similar projects.

05

2022: Rust обсуждается публично, но мерж откладывается за пределы ветки2022: Rust is discussed publicly, but the merge slips past this branch

Разговоры о поддержке Rust в ядре начались задолго до формального мержа: ещё весной Торвальдс упоминал версию 5.14 как возможную цель, срок сдвигался несколько раз. К моменту выхода 5.19 (31 июля 2022, последний релиз ветки) Торвальдс уже открыто говорил, что Rust-инфраструктура может попасть «в одну из ближайших версий» — формулировка, которая на тот момент означала неопределённость, а не близкий финиш. Фактический мерж базовой инфраструктуры (позволяющей писать отдельные драйверы на Rust, не переписывая ядро целиком) состоялся только в 6.1 в декабре 2022 — уже за пределами 5.x. Приписывать эту веху ветке 5.x, как иногда делают задним числом из-за многолетних анонсов внутри неё, — историческая неточность: обсуждения были здесь, реализация — нет.Talk about Rust support in the kernel started well before any formal merge: as early as spring, Torvalds had mentioned 5.14 as a possible target, and the timeline slipped several times. By the time 5.19 shipped (July 31, 2022, the branch's last release), Torvalds was already openly saying Rust infrastructure might land "in one of the upcoming versions" — phrasing that at the time signaled uncertainty, not an imminent finish line. The actual merge of the base infrastructure (letting individual drivers be written in Rust without rewriting the whole kernel) only happened in 6.1 in December 2022 — outside 5.x entirely. Attributing this milestone to the 5.x branch, as sometimes happens retroactively because of the years of announcements made within it, is a historical inaccuracy: the discussions lived here, the implementation didn't.

Архитектура на конец веткиArchitecture by the branch's end

К 5.19 ядро получило современный интерфейс асинхронного I/O (io_uring), ставший фундаментом для высокопроизводительных приложений (баз данных, event-loop'ов, серверов) в последующие годы, штатный VPN-протокол (WireGuard) вместо необходимости городить IPsec или полагаться на сторонние модули, и файловую систему exFAT прямо в дереве ядра. Модель разработки не изменилась — та же непрерывная схема с 2.6. Rust оставался темой обсуждений, а не реализованной возможностью: инфраструктура появится лишь в следующей ветке. По контрасту с 4.x, где почти год ушёл на аварийное реагирование, 5.x — пример спокойного, планового развития без единого события уровня Meltdown/Spectre.By 5.19 the kernel had a modern async I/O interface (io_uring) that became the foundation for high-performance applications (databases, event loops, servers) in subsequent years, a standard VPN protocol (WireGuard) instead of having to wrangle IPsec or rely on third-party modules, and the exFAT filesystem right in the kernel tree. The development model hadn't changed — the same continuous scheme from 2.6. Rust remained a topic of discussion rather than a shipped feature: the infrastructure would only arrive in the next branch. In contrast to 4.x, where nearly a year went to emergency response, 5.x is an example of calm, planned development without a single Meltdown/Spectre-level event.

Грабли и мифыGotchas & myths

«Rust появился в ядре в ветке 5.x» — нет, только обсуждался"Rust arrived in the kernel in the 5.x branch" — no, it was only discussed

Многолетние публичные анонсы Торвальдса о возможном скором мерже Rust создают у многих впечатление, что поддержка появилась ещё в 5.x — старые версии этого самого материала повторяли ту же ошибку. Формальный merge базовой Rust-инфраструктуры состоялся только в 6.1 (декабрь 2022), за пределами формальных границ 5.x, которая закончилась на 5.19 в июле того же года.Torvalds's years of public hints about a possible upcoming Rust merge leave many people with the impression that support arrived already in 5.x — earlier versions of this very material repeated the same mistake. The formal merge of the base Rust infrastructure only happened in 6.1 (December 2022), outside 5.x's formal boundary, which ended at 5.19 in July of that year.

io_uring — не просто «более быстрый epoll»io_uring isn't just "a faster epoll"

Упрощение «io_uring ускоряет то, что раньше делал epoll» скрывает главное отличие: epoll — это механизм уведомления о готовности (readiness notification), сам ввод-вывод всё равно выполняется отдельными системными вызовами; io_uring — механизм подачи и завершения самих операций через общую память, минимизирующий число системных вызовов как таковых, а не просто ускоряющий цикл уведомлений. Это разные модели, а не два варианта одного и того же API с разной скоростью.The simplification "io_uring speeds up what epoll used to do" hides the key difference: epoll is a readiness-notification mechanism — the actual I/O still happens via separate syscalls; io_uring is a mechanism for submitting and completing the operations themselves through shared memory, minimizing the number of syscalls as such, not just speeding up a notification loop. These are different models, not two speed variants of the same API.

exFAT в мейнлайне не отменяет патентную осторожность у дистрибутивовexFAT in mainline doesn't erase distros' patent caution

Включение кода exFAT в дерево ядра само по себе не гарантирует, что каждый дистрибутив включит его сборку по умолчанию или что все патентные вопросы сняты во всех юрисдикциях — некоторые сборки и по сей день собирают ядро без этого модуля или держат его опциональным, в зависимости от политики конкретного дистрибутива и региона распространения. Наличие кода в апстриме и его фактическое присутствие в конкретном установленном дистрибутиве — разные вещи.Including exFAT code in the kernel tree doesn't by itself guarantee every distro ships it built in by default, or that every patent question is settled in every jurisdiction — some builds to this day compile the kernel without that module or keep it optional, depending on the specific distro's policy and distribution region. Code being present upstream and its actual presence in a specific installed distro are different things.

ТерминыTerms

io_uring
новый интерфейс асинхронного ввода-вывода в Linux (5.1, 2019), построенный на общих кольцевых буферах между ядром и приложением вместо системного вызова на каждую операцию. Приложение кладёт запросы в один буфер и забирает результаты из другого, почти не переключаясь в режим ядра, — это резко снижает накладные расходы под высокой нагрузкой по сравнению со старыми механизмами (POSIX AIO, epoll).a new asynchronous I/O interface in Linux (5.1, 2019), built on shared ring buffers between the kernel and the application instead of a syscall per operation. The application puts requests into one buffer and picks up results from another, with almost no switching into kernel mode — sharply cutting overhead under heavy load compared to the older mechanisms (POSIX AIO, epoll).
асинхронный ввод-выводasync I/O
модель, при которой приложение отправляет запрос на операцию чтения или записи и сразу продолжает работать дальше, не дожидаясь её завершения, — результат приходит позже, отдельным сигналом. Противоположность синхронному I/O, где выполнение программы блокируется до тех пор, пока операция не закончится. io_uring — очередная, наиболее радикальная попытка Linux сделать асинхронный I/O быстрым и удобным.a model where the application submits a read or write request and immediately keeps working without waiting for it to finish — the result arrives later, as a separate signal. The opposite of synchronous I/O, where program execution blocks until the operation completes. io_uring is Linux's latest, and most radical, attempt to make async I/O fast and convenient.
POSIX AIO
старый стандартный интерфейс асинхронного ввода-вывода в Unix-системах, предшественник io_uring. На практике поддерживал по сути только небуферизованный (O_DIRECT) файловый I/O и был обвешан оговорками и ограничениями — именно эти многолетние недостатки io_uring и был спроектирован закрыть.the older standard asynchronous I/O interface in Unix systems, io_uring's predecessor. In practice it really only supported unbuffered (O_DIRECT) file I/O and came wrapped in caveats and limitations — exactly the long-standing shortcomings io_uring was designed to close.
epoll
механизм уведомления о готовности файловых дескрипторов (в первую очередь сетевых сокетов) к чтению или записи. Сам ввод-вывод epoll не выполняет — он лишь сообщает приложению, что теперь можно безопасно вызвать read() или write(), не заблокировавшись. Отлично работал для сетей, но не для обычных файловых операций — в этом отличие от io_uring, который выполняет сами операции через общую память, а не просто уведомляет об их готовности.a mechanism for notifying an application that file descriptors (mainly network sockets) are ready to read or write. epoll doesn't perform the I/O itself — it just tells the application it can now safely call read() or write() without blocking. It worked great for networking but not for regular file operations — the key difference from io_uring, which carries out the operations themselves via shared memory rather than just signaling readiness.
submission queue / completion queue (SQ/CQ)
два кольцевых буфера в памяти, разделяемой между ядром и приложением в io_uring. Submission queue (SQ) — куда приложение кладёт запросы на операции ввода-вывода; completion queue (CQ) — откуда оно забирает результаты выполненных операций. Обмен через эти буферы почти не требует системных вызовов, в этом и состоит главный выигрыш io_uring в производительности.two ring buffers in memory shared between the kernel and the application in io_uring. The submission queue (SQ) is where the application places I/O requests; the completion queue (CQ) is where it picks up the results of finished operations. Exchanging data through these buffers needs almost no syscalls — that's the core of io_uring's performance gain.
VFS
Virtual File System — абстрактный слой ядра, единообразно представляющий разные файловые системы (ext4, Btrfs, NTFS и другие) для остального кода ядра и приложений: программе не важно, на какой именно ФС лежит файл, она работает через общий интерфейс VFS. В 5.1 (2019) этот слой прошёл масштабную переработку для снятия ограничений старого дизайна mount(2).Virtual File System — an abstract kernel layer presenting different filesystems (ext4, Btrfs, NTFS, and others) uniformly to the rest of the kernel and to applications: a program doesn't need to know which filesystem a file actually lives on, it works through VFS's common interface. In 5.1 (2019) this layer went through a large-scale rework to remove limitations of the old mount(2) design.
exFAT
файловая система Microsoft, широко используемая на SD-картах и флешках большого объёма. Годами поддерживалась в Linux только через сторонние модули из-за патентных опасений; в 5.4 (2019), после того как Microsoft сама передала спецификацию сообществу, впервые вошла в staging-область исходников самого ядра.Microsoft's filesystem, widely used on large SD cards and flash drives. For years it was supported in Linux only through third-party modules due to patent concerns; in 5.4 (2019), after Microsoft itself contributed the spec to the community, it first entered the kernel's own source tree as part of the staging area.
WireGuard
компактный, современный VPN-протокол, спроектированный как более простая и легко аудируемая альтернатива IPsec и OpenVPN: минималистичный кодбейс, современная криптография без legacy-режимов согласования, конфигурация в несколько строк. Слился в мейнлайн в 5.6 (2020) необычно быстро для стороннего проекта такого масштаба.a compact, modern VPN protocol designed as a simpler, more easily auditable alternative to IPsec and OpenVPN: a minimal codebase, modern cryptography with no legacy negotiation modes, configuration in a few lines. Merged into mainline in 5.6 (2020) unusually fast for a third-party project of that scale.
time namespacestime namespaces
вид изоляции (namespace), дающий процессу или контейнеру собственное независимое системное время, отдельное от времени хост-системы. Появились в 5.6 (2020) вместе с WireGuard; полезны, например, для тестирования сценариев, зависящих от времени, без изменения часов на всей машине.a kind of isolation (namespace) giving a process or container its own independent system time, separate from the host system's clock. Arrived in 5.6 (2020) alongside WireGuard; useful, for instance, for testing time-dependent scenarios without changing the clock for the whole machine.
NTFS
файловая система Windows. В 5.15 (2021) в Linux появился новый драйвер её поддержки, заменивший старый, изначально помеченный экспериментальным ещё в прошлых десятилетиях.Windows's filesystem. In 5.15 (2021) Linux got a new driver supporting it, replacing the old one, originally flagged experimental decades earlier.
fscache
слой кеширования сетевых файловых систем на локальном диске: данные, полученные по сети, сохраняются локально, чтобы повторный доступ к ним не требовал нового сетевого запроса. Переписан в 5.17 (2022).a caching layer for network filesystems on local disk: data fetched over the network is stored locally so repeated access doesn't require a fresh network request. Rewritten in 5.17 (2022).