Релиз ядра Linux 7.3

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 7.3. Среди наиболее заметных изменений: механизм изоляции ФС на базе псевдо-ФС failfs и системного вызова fchroot(), поддержка создания вложенных планировщиков SCHED_EXT, BPF-обработчики запуска исполняемых файлов, альтернативные потоки данных в NTFS3, оптимизации производительности FUSE, Btrfs и Ext4, поддержка Apple Time Machine в ksmbd, удаление ФС EFS и FreeVxFS, режим прямого доступа к блочным устройствам, улучшение обработки нехватки видеопамяти, отслеживание обращений к памяти гостевой системы через userfaultfd, сжатие правил AppArmor, ограничение доступа к AF_ALG, поддержка чипов Apple M3.

В новую версию принято 20260 исправлений от 3171 разработчика, из которых 807 впервые отправили свои изменения в ядро. Размер патча — 63 МБ (изменения затронули 14923 файлов, добавлено 943849 строк кода,
удалено 297515 строк). В прошлом выпуске было 17833 исправлений от 2766 разработчиков, размер патча — 68 МБ. Около 44% всех представленных в 7.3 изменений связаны с драйверами устройств, примерно 12% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 5% — с файловыми системами и 3% c внутренними подсистемами ядра.

Основные новшества в ядре 7.3 (1, 2, 3):

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Проведена оптимизация производительности ФС Btrfs. Для не SSD-накопителей удалена лишняя задержка, что привело к пятикратному повышению пропускной способности для нагрузок с активным использованием функции fsync, таких как запись логов. В fsync отключено определение пустот в файлах с большим числом экстентов и без пустот, что ускорило выполнение некоторых специфичных тестов в 5 раз.

      При отслеживании некэшируемых буферов экстентов структура xarray заменена на локальный LRU-список, что привело к повышению производительности данных операций в 3 раза. Устранены провалы в производительности при использовании режима прямого ввода/вывода, вызванные регрессиями в прошлых выпусках ядра. Сокращены блокировки при упреждающем чтении экстентов, что снизило накладные расходы при обращении разных задач к перекрывающимся областям.

    • В Btrfs удалена поддержка первой версии кэша с информацией о свободном месте. ФС, созданные на старых системах, необходимо перевести на вторую версию кэша при помощи утилиты btrfstune, иначе они будут работать медленнее. Также удалена опция монтирования «usebackuproot», вместо которой следует использовать «rescue=usebackuproot».
    • В ФС Ext4 повышена производительность параллельных операций записи при прямом вводе/выводе (Direct I/O) и ускорено резервирование пустых областей через вызов fallocate(). Устранена регрессия, снижавшая производительность при буферизированной записи.
    • В ФС Ext4 режим монтирования «data=journal» переведён в разряд устаревших. Поддержку данной опции монтирования намерены прекратить в 2028 году. Опция «data=journal» включает режим полного журналирования, при котором в журнал записываются не только метаданные, но и сами данные, что обеспечивает высокую устойчивость в случае сбоев, но усложняет сопровождение кода, приводит к значительному снижению производительности по сравнению с режимами «data=ordered» и «data=writeback».
    • Удалена файловая система EFS, которая применялась в ранних версиях ОС IRIX, перестала использоваться около 30 лет назад и уже более 20 лет находится без сопровождения. Для тех кому необходим доступ разделам с EFS существуют утилиты, работающие в пользовательском пространстве.
    • Удалена файловая система FreeVxFS, реализующая формат ФС VERITAS VxFS, применявшийся в SCO UnixWare в 1990-е годы и давно не используемый на практике.
    • В механизме создания файловых систем в пространстве пользователя FUSE повышена производительность и сокращено потребление памяти при использовании системы асинхронного ввода/вывода io_uring. Ускорение достигнуто благодаря добавлению возможности передачи пулов буферов из пользовательского пространства в ядро и исключению лишней буферизации (zero-copy) при доступе FUSE-сервера к страницам памяти клиентского процесса или страничному кэшу.
    • Для блочных устройств реализован флаг RWF_DONTCACHE, похожий на режим прямого ввода/вывода
      (Direct I/O), который можно использовать в функциях preadv2() и pwritev2() или в запросах на чтения и запись через io_uring для доступа к блочному устройству в обход страничного кэша. Например, флаг может применяться в СУБД для низкоуровневой работы с блочными устройствами.

    • В ФС overlayfs добавлена поддержка маппинга идентификаторов пользователей, применяемом для сопоставления файлов определённого пользователя на примонтированном чужом разделе с другим пользователем в текущей системе.
    • Улучшена поддержка монтирования нескольких ФС с одного блочного устройства.
    • В драйвере ntfs3 реализована начальная поддержка альтернативных потоков данных, разделяемых через двоеточие в имени файла. Для создания нового альтернативного потока можно использовать команду «touch file:поток», чтения — «cat file:поток», удаления — «rm file:поток», вывода доступных потоков — «cat file:query_streams».
    • В новой реализации NTFS (ntfsplus) в режиме только для чтения появилась поддержка технологии прозрачного сжатия файлов с использованием оверлейных фильтров WOF (Windows Оverlay Filter).
    • В NFS-сервер добавлена поддержка операции CB_NOTIFY, позволяющей клиенту кэшировать метаданные директорий на своей стороне, получая уведомления об изменениях от сервера.
    • В ФС F2FS добавлена поддержка динамического (без отмонтирвоания ФС) удаления разделов из общего пула с автоматическим переносом данных на другие разделы и возвращения обратно (например, можно временно изъять накопитель для других нужд).
  • Память и системные сервисы
    • Улучшена обработка нехватки видеопамяти. В ситуации исчерпания свободной видеопамяти ядро теперь пытается вытеснить из видеопамяти в системную память (GTT) буферы приложений, не имеющих гарантированной квоты памяти (dmem cgroup), а не сразу отказывать в выделении видеопамяти. Такой подход гарантирует выделение ресурсов приложению, которому система зарезервировала определённый объем видеопамяти, даже если память уже выделена другим приложениям. Ранее, если приложению без квот уже была выделена видеопамять, то в ситуации нехватки видеопамяти приложение с гарантированными квотами не могло получить её, и вместо видеопамяти через подсистему TTM (Translation Table Maps) приложению выделялась более медленная системная оперативная память, адресуемая из GPU (GTT).
      Поддержка dmem cgroup реализована для драйверов nouveau, xe и amdgpu.

    • В механизме SCHED_EXT, позволяющем использовать BPF для создания планировщиков CPU, завершена работа над возможностью создания вложенных планировщиков (sub-scheduler), при помощи которых для каждого cgroup можно задействовать собственный планировщик задач.
    • В планировщик задач внесены улучшения, связанные с обработкой cgroup и решением проблем с распределением весов, из-за которых возникали дополнительные накладные расходы и задержки. Предложено несколько методов распределения весов для cgroup — ‘up‘, ‘max‘, ‘concur‘ и ‘tasks‘, выставляемых через параметр cgroup_mode. Задействована единая очередь выполнения (runqueue) для планирования задач внутри cgroup. Сокращены задержки при планировании задач, которым выделяются короткие кванты процессорного времени, за счёт
      возможности при необходимости отменять, обновлять или минимизировать время выполнения задач, защищённых от вытеснения.

    • В механизме binfmt_misc (/proc/sys/fs/binfmt_misc) реализована
      возможность подключения BPF-обработчиков для добавления поддержки новых форматов исполняемых файлов. Изменение позволяет программно в момент каждого запуска анализировать тип исполняемого файла и выбирать для него интерпретатор или динамический загрузчик без хаков типа использования утилиты patchelf и скриптовых обвязок. Например, в BPF-программе можно определять исполняемые файлы для иных архитектур или платформ и запускать соответствующие эмуляторы или Wine, а также упростить организацию запуска исполняемых файлов в пакетах, установленных в разные каталоги в системах с пакетным менеджером Nix.

    • Продолжен перенос изменений из ветки Rust-for-Linux, связанных с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Появилась возможность использования Rust для архитектуры PowerPC. Реализованы: модуль для целочисленных преобразований без потерь, режим обфусцированного логгирования значений указателей для предотвращения утечки сведений об адресном пространстве, обвязка над функцией synchronize_rcu(), барьеры памяти, модуль interrupt для включения/отключения прерываний, типы для ввода/вывода, обвязки над fwctl, механизм SRCU (sleepable read-copy-update), обвязки над gem shmem,
      spinlock-блокировки SpinLockIrq, не допускающие прерывания в критических секциях.

    • Добавлен sysctl-параметр syscall_user_dispatch для управления включением режима диспетчеризации системных вызовов в пользовательском пространстве, позволяющий одному процессу перехватывать системные вызовы другого процесса (применяется в Wine для эмуляции системных вызовов Windows).
    • В BPF добавлена функция bpf_sock_read_xattr(), при помощи которой BPF-программы могут читать выставляемые пользователем расширенные атрибуты
      (user.*) из inode сокетов. В BPF-приложениях появилась возможность определения глобальных переменных, привязанных к CPU. В верификаторе BPF-программ предоставлена дополнительная информация о выявленных ошибках, упрощающая определение причин проблем.

    • В механизмах трассировки kprobes, uprobes и fprobes реализована поддержка приведения типов, используя данные BTF (BPF Type Format) с информацией для проверки типов в псевдокоде BPF, а также улучшено извлечение сведений о переменных.
    • В подсистему DAMON (Data Access MONitor), позволяющую отслеживать доступ процесса к данным в оперативной памяти (например, можно узнать к каким областям памяти обращался процесс, а какие области памяти остались невостребованными), добавлена возможность мониторинга изменения атрибутов данных (анонимная память, отображённые в память файлы, доступ только для чтения, отсутствие обращений к памяти и т.п.).
    • В механизме KHO (Kexec HandOver), применяемом для запуска нового ядра из старого без потери состояния системы, обеспечен учёт выделения больших страниц памяти (huge pages) во время загрузки. Подобные страницы памяти теперь маркируются и сохраняются после запуска нового ядра.
    • Низкоуровневый код системы подкачки (swap) переведён на новую низкоуровневую структуру данных swap_ops, которая упростила сопровождение кода и реализовала абстракции, необходимые для расширения функциональности в будущем.
    • Добавлены ioctl-команды ALLOCINFO_IOC_CONTENT_ID, ALLOCINFO_IOC_GET_AT и ALLOCINFO_IOC_GET_NEXT, позволяющие выборочно передавать в пространство пользователя данные профилирования выделения памяти. По сравнению с ранее доступным интерфейсом /proc/allocinfo, предложенные ioctl-вызовы позволяют до 20 раз повысить производительность запросов профилирования за счёт фильтрации лишних данных.
  • Виртуализация и безопасность
    • Предложен новый механизм изоляции, блокирующий доступ к содержимому файловых систем, за исключением ресурсов, явно переданных в sandbox-окружение через файловые дескрипторы. Механизм реализован при помощи псевдо-ФС failfs и системного вызова fchroot.

      Псевдо-ФС failfs напоминает ФС nullfs, но в отличие от последней реализует принцип «ничего не поддерживается» вместо «ничего не хранится». Подобное свойство не позволяет монтировать что-либо поверх failfs, клонировать ФС и отслеживать состояние через statmount(), listmount(), /proc/‹pid›/mountinfo и /proc/filesystems. Если корневой или рабочий каталог процесса находится в failfs, то блокируются любые попытки навигации по ФС c использованием абсолютных файловых путей, символических ссылок и относительных путей, зависящих от текущего рабочего каталога. Процессу оставляется только возможность обращения к определённому каталогу по файловым дескрипторам, открытым до изоляции.

      Для перехода в новый режим изоляции добавлен системный вызов fchroot, похожий на системный вызов chroot, но работающий на уровне файловых дескрипторов. В системные вызовы fchdir добавлен флаг FD_FAILFS_ROOT для перемещения рабочего каталога процесса в ФС failfs.
      Аналогичный флаг доступен в системном вызове fchroot.

    • Добавлена возможность отслеживания обращений к памяти гостевой системы при помощи механизма userfaultfd, позволяющего создавать обработчики обращений к невыделенным или защищённым страницам памяти в пространстве пользователя. На практике, предложенная возможность позволяет гипервизору определять страницы памяти, к которым в виртуальной машине не было обращений, для их вытеснения в более медленную память или во внешнее хранилище. Для отслеживания нарушений выставленного запрета чтения и записи в отслеживаемой области памяти добавлен флаг UFFDIO_REGISTER_MODE_RWP, который может использоваться как более высокопроизводительный аналог применения mprotect(PROT_NONE) совместно с обработчиком сигнала, генерируемого при обращении к памяти, для которой выставлен запрет на чтение и запись (в случае userfaultfd генерируется исключение, обрабатываемое в пространстве пользователя). Изменение подготовлено при помощи AI («Assisted-by: Claude:claude-opus-4-6»).
    • Усилено разделение между потоками ядра (kthread) и init-процессом (PID 1). Ранее в потоках ядра и в PID 1 совместно использовалось общее состояния файловой системы,
      что позволяло через вызов pivot_root() переопределить состояние ФС для всех потоков ядра. В новой версии в PID 1 задействована полностью отдельная структура fs_struct, а потоки ядра изолированы в отдельной точке монтирования с nullfs.

    • Во встроенную криптографическую библиотеку (libcrypto) добавлена поддержка режимов шифрования AES — ECB, CBC, CBC-CTS, CTR, XCTR, XTS, GCM и CCM.
    • В системе мандатного управления доступом AppArmor реализована возможность загрузки сжатых наборов правил.
    • Добавлен sysctl-параметр af_alg_restrict, управляющий включением доступа к криптографическому API AF_ALG из пространства пользователя. AF_ALG позволяет задействовать аппаратные ускорители для криптографических вычислений в Crypto API ядра, но применяется в достаточно специфичных ситуациях и не всегда даёт прирост производительности по сравнению с реализацией ускорения в пространстве пользователя. При этом в связанных с AF_ALG обработчиках выявлена серия уязвимостей, таких как Copy Fail, позволяющих изменить данные в страничном кэше. Для снижения поверхности атаки по умолчанию доступ к AF_ALG частично ограничен. Рассматривается возможность удаления AF_ALG в одном из будущих выпусков.
    • Ужесточена верификация BPF-программ, заверенных цифровой подписью. Добавлена проверка целостности метаданных BPF-программы перед её загрузкой.
    • В системный вызов landlock_restrict_self(), применяемый для активации блокировок Landlock, добавлен флаг
      LANDLOCK_RESTRICT_SELF_NO_NEW_PRIVS, запрещающий текущему процессу получение любых новых привилегий. Механизм Landlock позволяет непривилегированным программам сбрасывать ненужные для работы привилегии, добровольно ограничивая свой дальнейший доступ к системе в целях повышения безопасности, например, для защиты в случае попыток эксплуатации уязвимостей в программе.

    • В драйвер VirtIO-GPU, обеспечивающий работу виртуального GPU, добавлена поддержка спящего режима S4 (hibernation).
  • Сетевая подсистема
    • В ksmbd, встроенный в ядро сервер для протокола SMB, добавлена поддержка расширений Apple Time Machine для хранения резервных копий, создаваемых в macOS через данное приложение. Реализован механизм изоляции последовательностей команд SMB в привязке к MessageId для блокирования атак через отправку недействительных или дублированных запросов. Добавлена поддержка отправки повторных запросов по протоколу SMB3 без нарушения состояния сеанса, если предыдущий запрос был потерян. В SMB3 реализована возможность шифрования на уровне отдельных общих хранилищ (share). Добавлена поддержка шифрования канала связи SMB Direct, использующего технологию RDMA (Remote Direct Memory Access).
    • Реализована возможность использования TCP-пакетов c расширением BIG TCP, позволяющим увеличить максимальный размер TCP-пакета до 4ГБ, в UDP-туннелях на базе протоколов VXLAN и GENEVE.
    • Добавлена поддержка проборса протокола MCTP (Management Component Transport Protocol) поверх USB (MCTP-over-USB 1.1).
    • Предоставлена возможность отключения (unregistration) сетевых устройств (netkit, veth, vxcan, bareudp, geneve, ipvlan, macvlan и т.п.) для выбранных пространств имён.
    • Для Bluetooth 6.2+ реализована поддержка механизма SCI (Shorter Connection Interval) для снижения задержек при передаче данных в режиме Bluetooth LE (Low Energy).
    • В API nl80211 добавлен унифицированный механизм (NL80211_CMD_PROBE_PEER) для проверки подключённых пиров, работающий как в беспроводных точках доступа, так и на стороне клиента.
  • Оборудование
    • Объявлены устаревшими и намечены для удаления в ядре 7.5 старые ARM-платформы, которые почти не используются и мешают сопровождению актуальных подсистем. К удалению намечено около 55 тысяч строк кода, связанного с поддержкой платформ sa1100, omap24xx, i.MX31, samv7, lpc18xx, riscpc, axxia, footbridge, старых плат pxa, orion, dove и mv78xx0, чипов без блока управления памятью (MMU) и микроконтроллеров stm32f4/f7/h7.
    • Добавлена поддержка чипов Apple M3 Pro, Max и Ultra. Реализовано управление состоянием энергопотребления для SoC Apple.
    • В подсистему DRM (Direct Rendering Manager) добавлено свойство «color format», позволяющее пользователю переключить формат представления цвета для устройства вывода. Свойство реализовано для драйверов GPU i915 (HDMI, DP), amdgpu (HDMI, DP) и rockchip (HDMI). Для тестирования можно использовать команду вида «modetest -s 115:1920×1080-60@NV12 -w 115:’color format’:4», в которой 115 — идентификатор коннектора, а ‘4’ номер формата YUV420.
    • В драйвер amdgpu добавлена поддержка модификаторов DRM для GPU AMD серий GFX6-8 (Southern Islands, Sea Islands и Volcanic Islands). Реализована начальная поддержка DCN 6.0.0 (Display Core Next). Проведена чистка устаревшего кода.
      Включена поддержка CACP (Content Adaptive Contrast and Power), позволяющая снизить энергопотребление OLED-панелей. Для дисплейных движков на архитектуре DCN4 включена поддержка механизма IPS (Idle Power State) для снижения энергопотребления во время неактивности. Добавлена поддержка видеокарт AMD Barco.

    • В драйвере i915 переработан код для определения возможностей и восстановления состояния коннекторов DisplayPort. Для GPU Novalake (NVL) добавлена поддержка CMTG (Common mode timing generator) и DC3DO (Display C3 with Clock Off).
    • Продолжена работа над drm-драйвером (Direct Rendering Manager) Xe для GPU на базе архитектуры Intel Xe, которая используется в видеокартах Intel семейства Arc и интегрированной графике, начиная с процессоров Tiger Lake. Добавлены новые идентификаторы поддерживаемых устройств. В configfs реализован атрибут ‘enable_multi_queue’ для отключения одновременного использования нескольких очередей передачи команд. Улучшена поддержка перехода в спящий режим.
    • Продолжена интеграция компонентов драйвера Nova для GPU NVIDIA, оснащённых GSP-прошивками, используемыми начиная с серии NVIDIA GeForce RTX 2000 на базе микроархитектуры Turing. Драйвер написан на языке Rust. В новой версии осуществлён переход на новые образы прошивок TLV, вместо старых вариантов, используемых в драйвере Nouveau. Добавлена поддержка
      запуска прошивки для чипа GSP (GPU System Processor) с включением vGPU. Добавлен API для получения информации о размере видеопамяти.
    • В драйвер Tyr, написанный на языке Rust и обеспечивающий работу с GPU ARM Mali, добавлена возможность загрузки прошивок в формате Mali CSF, активации виртуальной памяти GPU и запуска MCU.
    • В драйвер msm добавлена поддержка GPU Adreno Shikra (A704) и Eliza (722).
    • Добавлена поддержка звуковых устройств и ASoC: Pioneer DJ DJM-S11,
      AW88399 (Lenovo Legion Pro), AW88399 (Lenovo Legion), Lisuan, ALC235, RME HDSPe AIO, RT766/RT767 SDCA, Maili, Hawi, CS35L62 (SoundWire), RT766/RT767 VA1.

    • Улучшена поддержка звука на устройствах ASUS VivoBook M515DA/X515DAP,
      LG gram 16 (16Z90TR), Minisforum AI X1 Pro, HP Pavilion 15-eh2xxx, HP Laptop 15-dy0xxx и HP Spectre x360 16-aa0xxx, HP EliteBook 6 G1, HP OmniBook X Flip 14, Lenovo Yoga Pro 7, Huawei Matebook,
      ThinkPad X1 Carbon 6th, HP ProBook 440 G5, Acer Aspire A515-57.

    • Добавлена поддержка смартфонов, планшетов и ноутбуков: Motorola Edge 30, Motorola Moto G2, Xiaomi 12 Lite 5G, Microsoft Surface Pro, Honor MagicBook art 1412in, Sony Xperia M2, Vicharak Axon, Axon Mini и Vaaman2, Asus Zenbook A16, Lenovo Thinkedge se70.
    • Добавлена поддержка ARM-плат и SoC Samsung Exynos 1580 (используется в флагманских смартфонах с 2024 года), Orange Pi 5 pro, Sophgo SG2000 (гибрид Arm/RISC-V), BeagleBadge, Qualcomm «Shikra» и «Altera» (Cortex-A78C), Agilex72 (Cortex-A720), Alientek ATK-DLRV1126, Variscite SoC DART-MX8M-PLUS, DART-MX8M-MINI, VAR-SOM-MX8QM и платы Sonata/Symphony на их основе, 9Tripod X3568 v4, Youyeetoo YY3588, milk-v duo, ArmSoM CM5, Freescale Verdin iMX8M Mini, Anbernic rg vita-pro, Embedfire lubancat 4, Vicharak Vaaman, LincStation E1, HINLINK H28K.

Одновременно латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 7.3 — Linux-libre 7.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 7.3 проведена чистка от блобов новых драйверов для GPU Mali Tyr, Morse Micro mm81x wi-fi, NXP wi-fi, и сетевых карт на чипах Realtek. Обновлён код чистки в драйверах nova-core, amdgpu, adreno, tegra, iris, rtw89 и mt76 wifi, Qualcomm Q6V5 PAS, qla2xxx scsi и звуковых кодеках aw88399. Выполнена чистка имён blob-ов в dts-файлах (devicetree) для ARM-чипов Qualcomm.

Источник: http://www.opennet.ru/opennews/art.shtml?num=66499