После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.2. Среди наиболее заметных изменений: разрешён приём кода под лицензией Copyleft-Next, улучшена реализация RAID5/6 в Btrfs, продолжена интеграция поддержки языка Rust, снижены накладные расходы при защите от атак Retbleed, добавлена возможность регулирования потребления памяти при обратной записи, для TCP добавлен механизм балансировки PLB (Protective Load Balancing), добавлен гибридный механизм защиты потока выполнения команд (FineIBT), в BPF появилась возможность определения собственных объектов и структур данных, в состав включена утилита rv (Runtime Verification), снижено энергопотребление в реализации блокировок RCU.
В новую версию принято 16843 исправлений от 2178 разработчиков,
размер патча – 62 МБ (изменения затронули 14108 файлов, добавлено 730195 строк кода, удалено 409485 строк). Около 42% всех представленных в 6.2 изменений связаны с драйверами устройств, примерно 16% изменений имеют
отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% – с файловыми системами и 3% c внутренними подсистемами ядра.
Основные новшества в ядре 6.2:
- Память и системные сервисы
- Разрешено включение в состав ядра кода и изменений, поставляемых под лицензией Copyleft-Next 0.3.1. Лицензия Copyleft-Next создана одним из авторов GPLv3 и является полностью совместимой с лицензией GPLv2, что подтверждено юристами компаний SUSE и Red Hat. По сравнению с GPLv2 лицензия Copyleft-Next значительно компактнее и проще для понимания (убрана вводная часть и упоминание устаревших компромиссов), определяет сроки и порядок устранения нарушений, автоматически снимает копилефт-требования для устаревшего когда, которому более 15 лет.
Copyleft-Next также содержит пункт о предоставлении прав на запатентованные технологии, что, в отличие от GPLv2, делает данную лицензию совместимой с лицензией Apache 2.0. Для обеспечения полной совместимости с GPLv2 в тексте Copyleft-Next явно указано, что производная работа может поставляться не только под исходной лицензией
Copyleft-Next, но и под лицензией GPL. - В состав включена утилита “rv”, предоставляющая интерфейс для взаимодействия из пространства пользователя с обработчиками подсистемы RV (Runtime Verification), предназначенной для проверки корректности работы на высоконадежных системах, гарантирующих отсутствие сбоев. Проверка производится во время выполнения через прикрепление обработчиков к точкам трассировки, сверяющих фактический ход выполнения с заранее определённой эталонной детерминированной моделью автомата, определяющей ожидаемое поведение системы.
- В устройстве zRAM, позволяющем хранить раздел подкачки в памяти в сжатом виде (в памяти создается блочное устройство на которое производится своппинг со сжатием), реализована возможность переупаковки страниц с использованием альтернативного алгоритма для достижения более высокого уровня сжатия.
Основная идея в предоставлении выбора между несколькими алгоритмами (lzo, lzo-rle, lz4, lz4hc, zstd), предлагающими свои компромиссы между скоростью сжатия/распаковки и уровнем сжатия или оптимальными в особых ситуациях (например, для сжатия больших страниц памяти). - Добавлен API “iommufd” для управления из пространства пользователя системой управления памятью ввода-вывода – IOMMU (I/O Memory-Management Unit). Новый API даёт возможность управлять таблицами страниц памяти ввода/вывода, используя файловые дескрипторы.
- В BPF предоставлена возможность создания типов, определения собственных объектов, построения своей иерархии объектов и гибкого формирования собственных структур данных, таких как связанные списки. Для преходящих в режим сна BPF-программ (BPF_F_SLEEPABLE) добавлена поддержка блокировок bpf_rcu_read_{,un}lock(). Реализована поддержка сохранения объектов task_struct. Добавлен map-тип BPF_MAP_TYPE_CGRP_STORAGE, предоставляющий локальное хранилище для cgroups.
- Для механизма блокировок RCU (Read-copy-update) реализован опциональный механизм “ленивых” callback-вызовов, в котором по таймеру в пакетном режиме разом обрабатывается несколько callback-вызовов. Применение предложенной оптимизации позволяет на 5-10% снизить энегропотребление на устройствах Android и ChromeOS за счёт откладывания RCU-запросов во время простоя или низкой нагрузки на систему.
- Добавлен sysctl split_lock_mitigate для управления реакцией системы при выявлении расщеплённых блокировок (“split lock”), возникающих при доступе к невыровненным данным в памяти из-за того, что при выполнении атомарной инструкции данные пересекают две линии кеша CPU. Подобные блокировки приводят к значительному падению производительности. При выставлении в split_lock_mitigate значения 0 выводится лишь предупреждение о наличии проблемы, а при выставлении значения 1 помимо вывода предупреждения также осуществляется замедление выполнения процесса, вызвавшего блокировку, чтобы сохранить производительность остальной системы.
- Для архитектуры PowerPC предложена новая реализация блокировок qspinlock, демонстрирующая более высокую производительность и решающая некоторые проблемы с блокировками, возникающие в исключительных случаях.
- Переработан код обработки прерываний MSI (Message-Signaled Interrupts), в котором устранены накопившиеся архитектурные проблемы и добавлена поддержка привязки отдельных обработчиков к разным устройствам.
- Для систем на базе архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей новый RISC ISA, похожий на MIPS и RISC-V, реализована поддержка ftrace, защиты стека, спящего и ждущего режимов.
- Предоставлена возможность присвоения имён областям разделяемой анонимной памяти (ранее имена могли назначаться только приватной анонимной памяти, закреплённой за конкретным процессом).
- Добавлен новый параметр командной строки ядра “trace_trigger”, предназначенный для активации триггера трассировки,
применяемого для привязки условных команд, вызываемых при срабатывании контрольной проверки (например, trace_trigger=”sched_switch.stacktrace if prev_state == 2″). - Повышены требования к версии пакета binutils. Для сборки ядра теперь требуется как минимум binutils 2.25.
- При вызове exec() добавлена возможность помещения процесса в пространство имён времени (time namespace), в котором время отличается от системного.
- Начался перенос из ветки Rust-for-Linux дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Поддержка Rust неактивна по умолчанию и не приводит к включению Rust в число обязательных сборочных зависимостей к ядру. Предложенная в прошлом выпуске базовая функциональность расширена возможностями для поддержи низкоуровневого кода, таких как тип Vec и макросы pr_debug!(), pr_cont!() и pr_alert!(), а также процедурный макрос “#[vtable]”, упрощающий работу с таблицами указателей на функции. Добавление высокоуровневых Rust-обвязок над подсистемами ядра, которые позволят создавать полноценные драйверы на Rust, ожидается в следующих выпусках.
- Используемый в ядре тип “char” теперь для всех архитектур по умолчанию объявлен как беззнаковый.
- Объявлен устаревшим механизм распределения памяти slab – SLOB (slab allocator), который был спроектирован для система с небольшим объёмом памяти. Вместо SLOB в обычных условиях рекомендуется использовать SLUB или SLAB. Для систем с небольшим объёмом памяти рекомендуется применять SLUB в режиме SLUB_TINY.
- Разрешено включение в состав ядра кода и изменений, поставляемых под лицензией Copyleft-Next 0.3.1. Лицензия Copyleft-Next создана одним из авторов GPLv3 и является полностью совместимой с лицензией GPLv2, что подтверждено юристами компаний SUSE и Red Hat. По сравнению с GPLv2 лицензия Copyleft-Next значительно компактнее и проще для понимания (убрана вводная часть и упоминание устаревших компромиссов), определяет сроки и порядок устранения нарушений, автоматически снимает копилефт-требования для устаревшего когда, которому более 15 лет.
- Дисковая подсистема, ввод/вывод и файловые системы
- В Btrfs внесены улучшения, нацеленные на исправление проблемы “write hole” в реализации RAID 5/6 (попытка восстановления RAID, если крах случился во время записи и невозможно понять какой блок на каком из устройств RAID записался корректно, что может привести к разрушению блоков, соответствующих недозаписанным блокам). Кроме того, для SSD теперь по возможности автоматически активируется по умолчанию асинхронное выполнение операции “discard”, позволяющее добиться более высокой производительности из-за эффективной группировки операций “discard” в очереди и обработки очереди фоновым обработчиком. Повышена производительность операций send и lseek, а также ioctl FIEMAP.
- Расширены возможности по управлению отложенной записью (writeback, фоновое сохранение изменённых данных) для блочных устройств. В некоторых ситуациях, например, при использовании сетевых блочных устройств или USB-накопителей, отложенная запись может приводить к большому потреблению оперативной памяти. Для того чтобы управлять поведением отложенной записи и держать размер страничного кэша в определённых рамках в sysfs (/sys/class/bdi/) преложены новые параметры strict_limit, min_bytes, max_bytes, min_ratio_fine и max_ratio_fine.
- В файловой системе F2FS реализована ioctl-операция атомарной замены, позволяющая выполнить запись данных в файл в рамках одной атомарной операции. В F2FS также добавлен блочный кэш экстентов, помогающий определить активно используемые данные или данные к которым давно не было обращений.
- В ФС ext4 отмечается только исправление ошибок.
- В файловой системе ntfs3 предложено несколько новых опций монтирования: “nocase” для управления учётом регистра символов в именах файлов и директорий; windows_name для запрета создания имён файлов, содержащих символы, недопустимые для ОС Windows;
hide_dot_files для управления назначением метки скрытых файлов для файлов, начинающихся на точку. - В файловой системе Squashfs реализована опция монтирования “threads=”, при помощи которой можно определить число потоков для распараллеливания операций распаковки. В Squashfs также появилась возможность маппинга идентификаторов пользователей примонтированных файловых систем, применяемого для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
- Переработана реализация списков контроля доступа POSIX (POSIX ACL). В новой реализации устранены архитектурные проблемы, упрощено сопровождение кодовой базы и задействованы более безопасные типы данных.
- В подсистему fscrypt, которая используется для прозрачного шифрования файлов и каталогов, добавлена поддержка алгоритма шифрования SM4 (китайский стандарт GB/T 32907-2016).
- Предоставлена возможность сборки ядра без поддержки NFSv2 (в будущем поддержку NFSv2 планируют полностью прекратить).
- Изменена организация проверки прав доступа к устройствам NVMe. Предоставлена возможность чтения и записи на устройство NVMe, если записывающий процесс имеет доступ к специальному файлу устройства (ранее процесс должен был иметь полномочие CAP_SYS_ADMIN).
- Удалён пакетный драйвер для CD/DVD, который был объявлен устаревшим в 2016 году.
- Виртуализация и безопасность
- Реализован новый метод защиты от уязвимости Retbleed в CPU Intel и AMD, использующий отслеживание глубины вызовов, что не настолько замедляет работу как ранее присутствующая защита от Retbleed. Для включения нового режима предложен параметр командной строки ядра “retbleed=stuff”.
- Добавлен гибридный механизм защиты потока выполнения команд FineIBT, сочетающий применение аппаратных инструкций Intel IBT (Indirect Branch Tracking) и программной защиты kCFI (kernel Control Flow Integrity) для блокирования нарушения нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции. FineIBT разрешает выполнение по косвенному переходу только в случае перехода на инструкцию ENDBR, которая размещается в самом начале функции. Дополнительно, по аналогии с механизмом kCFI, следом осуществляется проверка хэшей, гарантирующих неизменность указателей.
- Добавлены ограничения для блокирования атак, манипулирующих генерацией состояний “oops”, после которых проблемные задачи завершаются и состояние восстанавливается без остановки работы системы. При очень большом числе вызовов состояния “oops” возникает
переполнение счётчика ссылок (refcount), что позволяет эксплуатировать уязвимости, вызванные разыменованием NULL-указателей. Для защиты от подобных атак в ядро добавлен лимит на максимальное число срабатываний “oops”, после превышения которого ядро будет инициировать переход в состояние “panic” с последующей перезагрузкой, что не позволит добиться числа итераций, необходимого для переполнения refcount. По умолчанию лимит выставлен в 10 тысяч “oops”, но при желании его можно изменить через параметр oops_limit. - Добавлен параметр конфигурации LEGACY_TIOCSTI и sysctl legacy_tiocsti для отключения возможности помещения данных в терминал при помощи ioctl TIOCSTI, так как данная функциональность может применяться для подстановки произвольных символов в буфер ввода терминала и симуляции пользовательского ввода.
- Предложен новый тип внутренних структур encoded_page, в котором нижние биты указателя используются для сохранения дополнительной информации, применяемой для защиты от случайного разыменования указателя (при реальной необходимости разыменования вначале нужно очистить эти дополнительные биты).
- На платформе ARM64 на этапе загрузки предоставлена возможность включения и выключения программной реализации механизма Shadow Stack, применяемого для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке (суть защиты в сохранении после передачи управления функции адреса возврата в отдельном “теневом” стеке и извлечении данного адреса перед выходом из функции). Поддержка в одной сборке ядра аппаратной и программной реализации Shadow Stack позволяет использовать одно ядро на разных ARM-системах, не зависимо от поддержки в них инструкций для аутентификации указателей. Включение программной реализации осуществляется через подмену во время загрузки необходимые инструкций в коде.
- Добавлена поддержка использования на процессорах Intel механизма асинхронного уведомления о выходе (asynchronous exit notification), позволяющего выявлять single-step атаки на код, выполняемый в анклавах SGX.
- Предложен набор операций, позволяющих гипервизору поддерживать запросы из гостевых систем Intel TDX (Trusted Domain Extensions).
- Удалены сборочные настройки ядра RANDOM_TRUST_BOOTLOADER и RANDOM_TRUST_CPU, вместо которых следует использовать соответствующие опции командной строки random.trust_bootloader и random.trust_cpu.
- В механизм Landlock, позволяющий ограничить взаимодействие группы процессов с внешним окружением, добавлена поддержка флага LANDLOCK_ACCESS_FS_TRUNCATE, дающего возможность контролировать выполнение операций усечения файлов.
- Сетевая подсистема
- Для IPv6 добавлена поддержка PLB (Protective Load Balancing), механизма балансировки нагрузки между сетевыми линками, нацеленного на сокращение точек перегрузки на коммутаторах датацентров. Через изменение IPv6 Flow Label, PLB случайным образом меняет пути пакетов для выравнивания нагрузки на портах коммутатора. Для снижения переупорядочивания пакетов данная операция по возможности производится после периодов простоя (idle). Применение PLB в датацентрах Google позволило снизить дисбаланс нагрузки на порты коммутаторов в среднем на 60%, уменьшить потерю пакетов 33% и снизить задержки на 20%.
- Добавлен драйвер для устройств MediaTek с поддержкой Wi-Fi 7.
- Добавлена поддержка 800-гигабитных линков.
- Добавлена возможность переименования сетевых интерфейсов на лету, без остановки работы.
- В записываемые в лог сообщения о SYN-флуде добавлено упоминание об IP-адресе, на который пришёл пакет.
- Для UDP реализована возможность использования отдельных хэш-таблиц для разных сетевых пространств имён.
- Для сетевых мостов реализована поддержка метода аутентификации MAB (MAC Authentication Bypass).
- Для протокола CAN (CAN_RAW) реализована поддержка режима сокетов SO_MARK для прикрепления фильтров трафика на базе fwmark.
- В ipset реализован новый параметр bitmask, позволяющий задать маску на основе произвольных битов в IP-адресе (например, “ipset create set1 hash:ip bitmask 255.128.255.0”).
- В nf_tables добавлена поддержка обработки внутренних (inner) заголовков, идущих внутри туннелируемых пакетов.
- Оборудование
- Добавленаподсистема “accel” с реализацией фреймворка для ускорителей вычислений, которые могут поставляться как в форме отдельных ASIC, так и виде IP-блоков внутри SoC и GPU. Главным образом подобные ускорители ориентированы на ускорение решения задач машинного обучения.
- В драйвере amdgpu включена поддержка IP-компонентов GC, PSP, SMU и NBIO. Для систем ARM64 реализована поддержка DCN (Display Core Next). Реализация защищённого вывода на экран переведена с использования DCN10 на DCN21 и может теперь использоваться при подключении нескольких экранов.
- В драйвере i915 (Intel) стабилизирована поддержка дискретных видеокарт Intel Arc (DG2/Alchemist).
- В драйвере Nouveau реализована поддержка GPU NVIDIA GA102 (RTX 30) на базе архитектуры Ampere. Для карт nva3 (GT215) добавлена возможность управления фоновой подсветкой.
- Добавлена поддержка беспроводных адаптеров на базе чипов Realtek 8852BE, Realtek 8821CU, 8822BU, 8822CU, 8723DU (USB) и MediaTek MT7996, Bluetooth интерфейсов Broadcom BCM4377/4378/4387, а также Ethernet-контроллеров Motorcomm yt8521, NVIDIA Tegra GE.
- Добавлена поддержка ASoC (ALSA System on Chip) для встроенных звуковых чипов HP Stream 8, Advantech MICA-071, Dell SKU 0C11, Intel ALC5682I-VD, Xiaomi Redmi Book Pro 14 2022, i.MX93, Armada 38x, RK3588. Добавлена поддержка звукового интерфейса Focusrite Saffire Pro 40. Добавлен звуковой кодека Realtek RT1318.
- Добавлена поддержка смартфонов и планшетов Sony (Xperia 10 IV, 5 IV, X и X compact, OnePlus One, 3, 3T и Nord N100, Xiaomi Poco F1 и Mi6, Huawei Watch, Google Pixel 3a, Samsung Galaxy Tab 4 10.1.
- Добавлена поддержка ARM SoC и плат Apple T6000 (M1 Pro), T6001 (M1 Max), T6002 (M1 Ultra), Qualcomm MSM8996 Pro (Snapdragon 821), SM6115 (Snapdragon 662), SM4250 (Snapdragon 460), SM6375 (Snapdragon 695), SDM670 (Snapdragon 670), MSM8976 (Snapdragon 652), MSM8956 (Snapdragon 650), RK3326 Odroid-Go/rg351, Zyxel NSA310S, InnoComm i.MX8MM, Odroid Go Ultra.
Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 6.2 – Linux-libre 6.2-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка новых блобов в драйвере nouveau. Отключена загрузка блобов в драйверах
mt7622, mt7996 wifi и bcm4377 bluetooth. Проведена чистка имён блобов в dts-файлах для архитектуры Aarch64. Обновлён код чистки блобов в различных драйверах и подсистемах. Прекращена чистка драйвера s5k4ecgx, так как он был удалён из ядра.