Linux 7.2

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 7.2. Среди наиболее заметных изменений: механизм потоковой передачи данных USB4STREAM, оптимизации производительности btrfs, xfs и ext4, продолжение удаления кода для поддержки CPU i486, возможность создания вложенных планировщиков SCHED_EXT, снижено потребление памяти в подсистеме подкачки, ускорены неименованные каналы, поддержка расширений Intel MBEC и AMD GMET в KVM, удаление протокола AppleTalk, начальная поддержка HDMI 2.1 FRL в драйвере AMDGPU.
Основные новшества в ядре 7.2 (kernelnewbies, lwn (lwn.net), OpenNET):
- Дисковая подсистема, ввод/вывод и файловые системы
- В механизме
iomapубран лишний вызов функцииmemsetдля уже завершённых итераций в функцииiomap_iter(), что при высокой интенсивности ввод/вывода на быстрых накопителях NVMe повысило в проведённых тестах число операций ввод/вывода в секунду (IOPS) на 5% при использовании ФС ext4 и xfs. - В XFS объявлена стабильной поддержка зонированных устройств хранения (разделение на зоны групп блоков или секторов, в которые допускается лишь последовательное добавление данных с обновлением целиком всей группы блоков).
- В Btrfs включена по умолчанию поддержка больших фолиантов страниц памяти («large folios»), позволяющая снизить накладные расходы и повысить производительность при интенсивном последовательном вводе/выводе. Добавлена экспериментальная поддержка огромных фолиантов («huge folios»), размером до 2 МБ. Добавлен новый
ioctlGET_CSUMSдля получения информации о контрольных суммах в пользовательском пространстве, например, для утилитыmkfsи оптимизации дедупликации. Повышена производительность последовательной записи данных на 15% и прямого ввода/вывода на 59%. - В ФС Ext4 значительно переработана реализация механизма «fast commit» для исключения возникновения конкурирующих и взаимных блокировок. Добавлен экспорт статистики о снапшотах
inodeчерез/proc/fs/ext4/*/fc_info. Оптимизирована производительность вычисления хэшей директорий (для имён размером 255 символов ускорение почти в два раза, 64 символа 27%, 32 символа — 11%). - В F2FS добавлена поддержка возвращения ошибок fserror, позволяющих из пользовательского пространства отслеживать проблемы с ФС. Сокращено время проводимое в контексте обработки прерываний.
- В Device Mapper (DM) добавлен новый обработчик dm-inlinecrypt для организации прозрачного шифрования и расшифровки блочных устройств, используя аппаратные устройства с функцией inline-шифрования.
- Предложена документация по добавлению в ядро новых файловых систем.
- В NFS размер блока по умолчанию увеличен до 4 МБ на системах, имеющих как минимум 16 ГБ ОЗУ (для ручного изменения размера блока можно использовать
/proc/fs/nfsd/max_block_size). Добавлена поддержка делегирования управления директорией клиенту («directory delegation»), что позволяет определённое время выполнять операции с данной директорией без проверки изменения состояния на сервере. - В сервере SMB добавлена поддержка файлов, хранимых в сжатом виде, а также сжатия данных при их передаче по сети.
- В новой реализации NTFS (ntfsplus) добавлена поддержка символических ссылок Windows и обеспечена корректная обработка многих видов повреждений метаданных.
- Удалён бэкенд
fscacheдля кэширования данных ФС EROFS (Enhanced Read-Only File System), который был объявлен устаревшим два года назад. - В ФС Ceph добавлена поддержка ручного сброса клиентских сеансов.
- В файловую систему 9P внесены оптимизации, ускорившие работу в таких сценариях, как сборка проектов.
- В системный вызов
file_getattr()добавлены флаги для получения информации об учёте регистра символов в файловой системе. ФлагFS_XFLAG_CASEFOLDсвидетельствует, что проверка имён файлов осуществляется без учёта регистра символов, а флагFS_XFLAG_CASENONPRESERVINGо том, что при создании новых имён файлов не сохраняется информация регистре символов. Указанные флаги могут применяться в NFS-клиентах, работающих без учёта регистра символов. - В системный вызов
openat2()добавлен флагO_EMPTYPATH, допускающий передачу пустого файлового пути. В этом случае путь к открываемому файлу определяется на основании переданного файлового дескриптора. - В системный вызов
openat2()добавлен флагOPENAT2_REGULAR, допускающий открытие только обычных файлов (при попытке открытия специального файла, например, сокета, канала или устройства, будет возвращена ошибка EFTYPE).
- В механизме
- Память и системные сервисы
- Реализован механизм USB4STREAM для потоковой передачи данных между компьютерами, соединёнными кабелем через порты USB4. Добавлено устройство
/dev/tbstreamX, при помощи которого можно читать и записывать данные, используя штатные функцииread()иwrite()по аналогии с чтением и записью в файлы. Например, на одном хосте можно отправить информацию командойecho hello > /dev/tbstream0, а на другом прочитать командойcat /dev/tbstream0. Механизм USB4STREAM может совмещаться с возможностью установки сетевого соединения по кабелю USB4 (thunderbolt_net) или использоваться отдельно при необходимости передачи данных между приложениями, не поддерживающими сетевые сокеты. - Включена вторая серия изменений для прекращения поддержки процессоров i486. Удалено более 13 строк кода, связанных с эмуляцией блока для вычислений с плавающей запятой для процессоров без FPU. Удалена поддержка процессоров i486 без аппаратных операций CX8 (сравнить и обменять 8 байт) и TSC (счётчик циклов CPU, используемый в планировщике задач), код для эмуляции которых удалён.
- Объявлена оставшейся без сопровождения («orphaned») поддержка процессоров AMD Geode, применяемых в компьютере OLPC XO-1.
- Добавлена поддержка обновления реализации механизма Intel TDX (Trusted Domain Extensions), применяемого для шифрования оперативной памяти гостевых систем. TDX реализован в форме специального программного runtime-модуля, который во время начальной загрузки переносится BIOS из Flash-памяти в оперативную память. В ядро добавлены возможности для управления этим модулем и замены на более новую версию на работающей системе без необходимости выполнения перезагрузки.
- Реализован новый планировщик распределения ресурсов GPU (Fair GPU scheduler), применяемый для определения порядка выполнения на GPU работ, отправляемых процессами, использующими GPU. Вместо применения традиционной FIDO-очереди запросов к GPU в новом планировщике задействованы механизмы справедливого распределения ресурсов, реализованные с оглядкой на планировщик задач CFS («Completely Fair Scheduler») применяющий план запуска с временем перехода к выполнению очередного процесса. Наиболее заметный эффект от использования нового планировщика наблюдается при параллельном выполнении интерактивных задач, активно работающих с GPU. В последний момент перед релизом ядра 7.2 включение Fair GPU scheduler было отменено и был возвращён старый FIFO-планировщик из-за необходимости отладки регресии, приводящей к снижению производительности и 100% нагрузке на GPU при запуске отдельных игр в Proton.
- Изменения в подсистеме eBPF: Добавлена возможность прикрепления одной BPF-программы нескольким точкам трассировки (tracepoint). В BPF-программы, привязанные к точкам трассировки, добавлена возможность доступа к памяти компонентов, работающих в пользовательском пространстве, с корректной обработкой обращения к невыделенным страницам памяти (page fault). В системный вызов bpf () добавлена поддержка типовых атрибутов (
log_buf,log_size,log_levelиlog_true_size), которая позволяет унифицировать передачу метаданных во всех командах BPF, не ограничиваясь командамиBPF_PROG_LOAD,BPF_BTF_LOADиBPF_MAP_CREATE. Убрано ограничение на передачу не более 5 параметров в функции BPF. Добавлена возможность безопасного доступа к разделяемой памятиbpf_arenaбез опасения обращения к невыделенным страницам памяти («page fault»). Реализован новый вариант структуры BPF hash map, допускающий динамическое изменение размера. - Оптимизировано формирование вывода
/proc/interruptsсо статистикой прерываний, а также модернизированы структуры для хранения счётчиков прерываний и добавлено кэширование. - Ускорена генерация файла
/proc/filesystems, используемого в libselinux. - В планировщике задач реализована поддержка балансировки нагрузки между ядрами CPU, учитывающей состояния внутреннего кэша процессора. Планировщик теперь пытается группировать процессы, использующие общие ресурсы, например, потоки одного процесса, для их использования в контексте одного и того же кэша верхнего уровня, что повышает эффективность обращения к данным за счёт повышения вероятности нахождения в кэше необходимых данных.
- В механизме SCHED_EXT, позволяющем использовать BPF для создания планировщиков CPU, продолжена реализация возможности для создания вложенных планировщиков («sub-scheduler»), при помощи которых для каждого
cgroupможно задействовать собственный планировщик задач. - Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Возможность использования Rust в ядре реализована для архитектуры s390. В состав включён пакет «zerocopy» с быстрыми примитивами работы с памятью для кода в режиме «unsafe».
- Минимальная версия инструментария LLVM, необходимая для сборки ядра, повышена до 17.0.1.
- В минималистичной Си-библиотеке nolibc, поставляемой в составе исходных текстов ядра Linux и предоставляющей обвязку над базовыми системными вызовами, реализована поддержка архитектур OpenRISC и 32-bit PA-RISC.
- В подсистему подкачки («swap») внесены оптимизации, повышающие производительность и снижающие потребление памяти в самой подсистеме за счёт исключения накладных расходов при хранении статических метаданных и унификации работы с анонимной и разделяемой памятью при использовании фолиантов. Снижение потребления памяти достаточно существенно, например, при монтировании раздела подкачки размером 1 ТБ наблюдается снижение потребления памяти примерно на 512 МБ.
- Повышена эффективность механизма вытеснения памяти, удаляющего или переносящего в раздел подкачки области памяти для высвобождения памяти при её нехватке в системе. В некоторых видах нагрузки, например, при тестировании MongoDB при помощи YCSB («Yahoo! Cloud Serving Benchmark»), наблюдается прирост производительности до 30%.
- В сборочную систему добавлена команда
make sbomдля генерации списков SBOM («Software Bill Of Materials»), отражающих задействованные в текущей сборке ядра компоненты, библиотеки и зависимости, а также информацию об их лицензиях, полученную из заголовков SPDX в файлах с кодом. - В реализации неименованных каналов («pipe») проведена оптимизация работы с блокировками (операции выделения памяти вынесены за область действия блокировки), что на 21–48% повысило пропускную способность неименованных каналов и на 17–33% снизило задержки.
- Реализован механизм USB4STREAM для потоковой передачи данных между компьютерами, соединёнными кабелем через порты USB4. Добавлено устройство
- Виртуализация и безопасность
- В механизм распределения памяти slab (slab allocator) добавлена возможность использования токенов выделения памяти (Allocation Token), реализованных в компиляторе Clang 22. Токены позволяют маркировать уникальными идентификаторами операции выделения памяти и организовать раздельное размещение различных типов объектов для усложнения эксплуатации уязвимостей, вызванных переполнением буфера (при разделении переполнение буфера в одном типе объектов не так просто использовать для повреждения других типов объектов).
- Механизм AF_ALG, эксплуатируемый в уязвимости Copy Fail для модификации данных в страничном кэше, объявлен устаревшим и намечен для удаления в одном из будущих выпусков.
AF_ALGпозволяет задействовать аппаратные ускорители для криптографических вычислений в Crypto API ядра, но применяется в достаточно специфичных ситуациях. В ядре 7.2 вAF_ALGудалена поддержка асинхронного ввода/вывода, старых драйверов и механизма zero-copy в реализацииskcipherиaead. Оставлены только программные реализации криптоалгоритмов, а поддержка аппаратных криптоускорителей в crypto API ядра удалена, так какAF_ALGсущественно расширяет поверхность атаки, но не даёт выигрыша в производительности, по сравнению в реализацией криптографии в пользовательском пространстве.AF_ALGиспользовался в инструментарии Cryptsetup, но его поддержка была удалена в недавнем выпуске 2.8.7. - В механизм IMA («Integrity Measurement Architecture»), позволяющий внешнему сервису верифицировать состояние подсистем ядра для того чтобы убедиться в их подлинности, добавлена поддержка экспорта внутренних таблиц с результатами измерений в пользовательское пространство с удалением из буферов ядра для экономии памяти.
- В модуль Landlock, предоставляющий непривилегированным программам средства для ограничения использования объектов ядра Linux (иерархии файлов, сетевые сокеты, ioctl и т. п), добавлена поддержка управления доступом к UDP-сокетам, а также возможность выборочного отключения вывода в лог сведений о блокировке объектов для предотвращения захламления лога несущественной информацией.
- Ядро избавлено от использования функции
strncpy(), копирующей заданное число байт из входящей строки. Применениеstrncpy()создавало опасность возникновения ошибок из-за пропуска нулевого символа в конце строки или добавочного заполнения нулями. Вместоstrncpy()рекомендовано использовать функцииstrscpy()иstrscpy_pad()для копирования строк, завершающихся нулевым символом, а такжеstrtomem_pad(),memcpy_and_pad()иmemcpy()для копирования строк известного фиксированного размера. Работа по избавлению ядра от использованияstrncpy()была начата в 2020 году и потребовала принятия 362 изменений от 70 разработчиков. - В гипервизор KVM добавлена поддержка расширений Intel MBEC (Mode-Based Execution Control) и AMD GMET («Guest-Mode Execution Trap»), позволяющих в таблицах трансляции памяти раздельно обрабатывать права на выполнение кода для ядра и пространства пользователя в гостевых системах. Ранее расширения аппаратной виртуализации Intel и AMD позволяли пометить страницы памяти доступными для исполнения только одним битом с программным разделением прав для ядра и пространства пользователя на уровне гипервизора. Использование MBEC и GMET даёт возможность исключить проверки полномочий на стороне гипервизора и значительно сократить интенсивность ресурсоёмкой передачи управления от гостевой системы к гипервизору VMexit.
- Сетевая подсистема
- Реализация расширения TCP-AO (TCP Authentication Option, RFC 5925) переведена на использование новой криптографической библиотеки libcrypto, что позволило упростить код и повысить эффективность работы. TCP-AO даёт возможность верифицировать TCP-заголовки по MAC-кодам (Message Authentication Code), используя более современные алгоритмы HMAC-SHA-1–96 и AES-128-CMAC-96 вместо ранее доступной опции TCP-MD5 на базе устаревшего алгоритма MD5.
- Число субпотоков, поддерживаемых для соединений Multipath TCP (MPTCP), увеличено с 8 до 64.
- Продолжена работа по сокращению использования в сетевом стеке ядра глобальной блокировки rtnl_lock.
- Из ядра удалена реализация стека протоколов AppleTalk, который использовался в компьютерах Apple с 1985 года и в 1990-е годы был заменён на TCP/IP. Помимо этого удалены компоненты технологии передач данных ATM (wikipedia.org), не связанные с PPPoATM, а также cетевые интерфейсы ARCnet на базе шин ISA и PCMCIA, Bluetooth-адаптеры с интерфейсом PCMCIA, TLS-ускорители Chelsea, код для интеграции TLS с sockmap и поддержка диапазонов частот 5/10 MHz в беспроводном стеке cfg80211/mac80211. Из-за наличия нерешаемых проблем с блокировками и отсутствия сопровождающих удалена специфичная реализация ускорения обработки TLS на базе TCP Offload Engine (более распространённая реализация TLS offload сохранена). Отключён и запланирован для удаления код совместимости с 32-разрядными
x_tablesна 64-разрядных системах. - В драйвер
pppoeдобавлена поддержка механизмов GRO («Generic Receive Offload») и GSO («Generic Segmentation Offload») для аппаратного ускорения пересборки и сегментации пакетов. Использование GRO и GSO позволяет существенно повысить пропускную способность для входящего трафика, например, на устройствах MediaTek MT7621 в конфигурации с транслятором адресов максимальная пропускная способность повысилась с 130 Mbit/s до 630 Mbit/s.
- Оборудование
- В драйвере AMDGPU появилась начальная поддержка технологии HDMI 2.1 FRL («Fixed Rate Link»), позволяющей передавать несжатые видео с качеством 4K/120Hz и 8K/60Hz. Ранее поддержку HDMI 2.1 долгое время не удавалась реализовать в открытых драйверах из-за лицензионных требований HDMI Forum, но сейчас компании AMD удалось согласовать подобную реализацию.
- В драйвер i915 добавлена поддержка настройки отображения дисплейным контроллером фонового цвета. Реализован параметр pin_params.needs_low_address.
- Продолжена работа над drm-драйвером («Direct Rendering Manager») Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Добавлена начальная поддержка платформы CRI (Crescent Island). Для dGPU-платформ Xe3p реализован системный контроллер.
- В драйвере Nouveau решены проблемы с GPU NVIDIA GA100.
- В драйвер v3d добавлена возможность управления энергопотреблением v3D GPU на платах Raspberry Pi.
- Продолжена интеграция компонентов драйвера Nova для GPU NVIDIA, оснащённых GSP-прошивками, используемыми начиная с серии NVIDIA GeForce RTX 2000 на базе микроархитектуры Turing. Драйвер написан на языке Rust. Добавлена поддержка GPU NVIDIA GA100 и серий Hopper и Blackwell.
- Добавлена поддержка ARM-плат, SoC и устройств: Apple t8122 (M3), Motorola Edge 30, Nothing Phone 3a, Google Pixel 3a XL, Qualcomm Dragonwing IPQ9650, Huawei Hawi, ZTE zx297520v3, Renesas R-Car M3Le, ASPEED AST27xx, Cortina Gemini, NXP i.MX6/8/9, NXP LX2160A, TI K3 AM62x.
Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 7.2 — Linux-libre 7.2-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 7.2 проведена чистка от блобов новых драйверов rt722-sdca и tac5xx2. Обновлён код чистки в драйверах amdgpu, nova core, qcom iris, q6v5, iwlwifi, amdxnda, adreno, r8152 и mt792x. Проведена корректировка интерфейсов для загрузки прошивок. Выполнена чистка имён blob-ов в dts-файлах (devicetree) для ARM-чипов.
>>> Источник: OpenNET
