Релиз ядра Linux 5.1

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.1. Среди наиболее заметных изменений в ядре 5.1: новый интерфейс для асинхронного ввода/вывода io_uring, возможность использования NVDIMM в качестве ОЗУ, поддержка в Nouveau разделяемой виртуальной памяти, поддержка масштабируемого мониторинга очень больших ФС через fanotify, возможность настройки уровней сжатия Zstd в Btrfs, новый обработчик cpuidle TEO, реализация системных вызовов для решения проблемы 2038 года, возможность загрузки с устройств device-mapper без initramfs, поддержка комбинированных live-патчей.

Основные новшества:

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Реализован новый интерфейс для асинхронного ввода/вывода — io_uring, который примечателен поддержкой поллинга ввода/вывода и возможностью работы как с буферизацией, так и без буферизации. Напомним, что предлагаемый ранее механизм асинхронного ввода/вывода «aio» не поддерживал буферизированный ввод/вывод, мог работать только в режиме O_DIRECT (без буферизации и в обход кэша) и имел проблемы с возникновением блокировок из-за ожидания доступности метаданных и накладными расходами из-за копирования данных в памяти.

      В рамках API io_uring разработчики попытались устранить недостатки старого интерфейса aio. По производительности io_uring очень близок к SPDK и существенно опережает libaio при работе с включенным поллингом. Для использования io_uring в конечных приложениях, работающих в пространстве пользователя, подготовлена библиотека liburing, предоставляющая высокоуровневую обвязку над интерфейсом ядра.

    • В механизм отслеживания событий в ФС fanotify () добавлена поддержка отслеживания событий, приводящих к изменению суперблока и структуры dirent (события создания, удаления и перемещения каталогов). Представленные возможности помогают решить проблемы с масштабируемостью, возникающие при создании рекурсивных отслеживаний изменений в очень больших ФС при помощи механизма inotify (изменения dirent ранее можно было отследить только через inotify, но эффективность в условиях рекурсивного отслеживания больших вложенных каталогов оставляла желать лучшего). Теперь подобный мониторинг можно эффективно производить через fanotify;
    • В файловой системе Btrfs добавлена возможность настройки уровня сжатия для алгоритма zstd, который может рассматриваться как оптимальный компромисс, между быстрым, но неэффективным lz4 и медленным, но хорошо сжимающим xz. По аналогии с тем как раньше можно было устанавливать уровень сжатия при применении zlib для zstd добавлена поддержка опции монтирования »-o compress=zstd: level». При тестировании первый уровень обеспечил сжатие данных в 2.658 раз при скорость сжатия 438.47 MB/s, скорости распаковки 910.51 MB/s и потреблении памяти 780 MB, а 15 уровень — в 3.126 раз, но при скорости сжатия в 37.30 MB/s, распаковки 878.84 MB/s и потреблении памяти 2547 MB;
    • Добавлена возможность загрузки с файловой системы, размещённой на устройстве device-mapper, без применения initramfs. Начиная с текущего выпуска ядра устройства device-mapper можно напрямую использовать в процессе загрузки, например, как раздел с корневой ФС. Настройка раздела осуществляется при помощи загрузочного параметра «dm-mod.create». Среди разрешённых для загрузки модулей device-mapper: «crypt», «delay», «linear», «snapshot-origin» и «verity»;
    • В ориентированную на Flash-накопители файловую систему F2FS добавлен флаг F2FS_NOCOW_FL, позволяющий отключить режим copy-on-write для заданного файла;
    • Из ядра удалена файловая система Exofs, представляющая собой вариант ext2, адаптированный для работы с хранилищами объектов OSD (Object-based Storage Device). Также удалена поддержка SCSI-протокола для подобных устройств хранения объектов;
  • Виртуализация и безопасность
    • В prctl () добавлена опция PR_SPEC_DISABLE_NOEXEC для управления спекулятивным выполнением инструкций для выбранного процесса. Новая опция позволяет выборочно отключать спекулятивное выполнение для процессов, которые потенциально могут быть атакованы при помощи атаки типа Spectre. Блокировка действует до первого вызова exec ();
    • Реализован LSM-модуль SafeSetID, позволяющий системным сервисам безопасно управлять пользователями без повышения привилегий (CAP_SETUID) и без получения полномочий пользователя root. Назначение привилегий осуществляется через определение в securityfs правил на основе белого списка допустимых привязок (в форме «UID1: UID2»);
    • Добавлены низкоуровневые изменения, необходимые для стековой организации загрузки модулей безопасности (LSM). Представлен параметр загрузки ядра «lsm», позволяющий управлять тем, какие модули загружаются и в каком порядке;
    • В подсистему аудита добавлена поддержка пространств имён файлов;
    • Расширены возможности GCC-плагина structleak, позволяющего блокировать потенциальные утечки содержимого памяти Обеспечена инициализация любых переменных, которые используются в коде через обращение по ссылке в стеке;
  • Сетевая подсистема
    • Для сокетов реализована новая опция «SO_BINDTOIFINDEX», похожая на «SO_BINDTODEVICE», но принимающая в качестве аргумента индексный номер сетевого интерфейса вместо имени интерфейса;
    • В стек mac80211 добавлена возможность назначения одному устройству нескольких BSSID (MAC-адресов). В рамках проекта по оптимизации производительности WiFi в стек mac80211 добавлен учёт распределения эфирного времени и возможность распределять эфирное время между несколькими станциями (при работе в режиме точки доступа выделение меньшего времени на передачу медленным беспроводным станциям, вместо равномерного распределния времени между всеми станциями);
    • Добавлен механизм «devlink health», ппредоставляющий уведомления при возникновении проблем с сетевым интерфейсом;
  • Память и системные сервисы
    • Реализована безопасная доставка сигналов, учитывающая возможность повторного использования PID. Например, при выполнении системного вызова kill ранее могла возникнуть ситуация, когда сразу после отправки сигнала целевой PID мог быть освобождён из-за завершения работы процесса и занят другим процессом, и в итоге сигнал применялся для другого процесса. Для исключения подобных ситуаций добавлен новый системный вызов pidfd_send_signal, который использует файловые дескрипторы из /proc/pid для обеспечения стабильной привязки к процессу. Даже если PID будет повторно задействован во время обработки системного вызова, файловый дескриптор не изменится и его можно безопасно использовать для отправки сигнала процессу;
    • Добавлена возможность использования устройств постоянной памяти (persistent-memory, например NVDIMM) в качестве ОЗУ. До сих пор в ядре подобные устройства поддерживались в качестве устройств хранения, но теперь их можно также применять как дополнительную оперативную память. Возможность реализована в ответ на пожелания пользователей, готовых мириться с отставанием производительности и желающих использовать штатный API управления памятью ядра Linux вместо применения имеющихся систем распределения памяти в пространстве пользователя поверх mmap для dax-файла;
    • Добавлен новый обработчик простоя CPU (cpuidle, решает когда можно перевести CPU в глубокие режимы экономии энергии, чем глубже режим — тем большая экономия, но и больше времени требуется для выхода из режима) — TEO (Timer Events Oriented Governor). До сих пор предлагалось два обработчика cpuidle — «menu» и «ladder», отличающиеся эвристикой. В обработчике «menu» имеются известные проблемы с принятием эвристических решений, для устранения которых было решено подготовить новый обработчик. TEO позиционируется как альтернатива обработчику «menu», позволяющая добиться более высокой производительности с сохранением того же уровня энергопотребления. Активировать новый обработчик можно при помощи загрузочного параметра «cpuidle.governor=teo»;
    • В рамках работы по устранению проблемы 2038 года, вызванной переполнением 32-разрядного типа time_t, в состав включены системные вызовы, предлагающие для 32-разрядных архитектур 64-разрядные счётчики времени. В итоге, 64-разрядную структуру time_t теперь можно применять на всех архитектурах. Аналоичные изменения также реализованы в сетевой подсистеме для опций timestamp сетевых сокетов;
    • В систему горячего наложения патчей на ядро (live patching) добавлена возможность «Atomic Replace» для атомарного применения серии изменений для одной функции. Указанная возможность позволяет распространять сводные патчи, охватывающие сразу несколько изменений, вместо достаточно сложного для сопровождения процесса поэтапного наложения live-патчей в строго определённом порядке. Если раньше каждое следующее изменение должно было отталкиваться от состояния функции после прошлого изменения, то теперь возможно распространение сразу нескольких изменений, привязанных к одному исходному состоянию (т.е. сопровождающие могут поддерживать один сводный патч относительно базового ядра);
    • Объявлена устаревшей поддержка формата исполняемых файлов a.out и удалён код для формирования core-файлов в формате a.out, который находится в заброшенном состоянии. Формат a.out давно не применяется на систмах с Linux, а генерация файлов a.out уже давно не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Кроме того, загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя;
    • В механизм верификации BPF-программ добавлена возможность определения и удаления неиспользуемого кода. В состав ядра включены патчи с поддержкой spinlock для подсистемы BPF, предоставляющие дополнительные возможности по управлению за паралелльным выполнением BPF-программ;
  • Оборудование
    • В драйвер Nouveau добавлена поддержка гетерогенного управления памятью, обеспечивающего возможность обращения CPU и GPU к общим синхронизированным областям памяти. На базе HMM реализована система разделяемой виртуальной памяти (SVM, shared virtual memory). Добавлен ioctl для миграции областей памяти процессов в память GPU. Поддержка SVM пока включена только для GPU семейства Pascal, хотя поддержка обеспечена и для GPU Volta и Turing;
    • В DRM-драйвере Intel для GPU Skylake и новее (gen9+) включён по умолчанию режим fastboot, исключающий лишние смены режимов во время загрузки. Добавлены новые идентификаторы устройств на базе микроархитектур Coffelake и Ice Lake. Для чипов Coffelake добавлена поддержка GVT (виртуализации GPU). Для виртуальных GPU реализована поддержка VFIO EDID. Для LCD панелей MIPI/DSI добавлена поддержка элементов ACPI/PMIC. Реализованы новые TV-режимы 1080p30/50/60 TV;
    • В драйвер amdgpu добавлена поддержка GPU Vega10/20 BACO. Реализованы средства управления питанием Vega 10/20 и таблиц управления кулером Vega 10. Добавлены новые PCI-идентификаторы устройств для GPU Picasso. Добавлен интерфейс управления планируемыми зависимостями для исключения взаимных блокировок;
    • Добавлен DRM/KMS-драйвер для ускорителей экранных операций ARM Komeda (Mali D71);
    • Добавлена поддержка экранных панелей Toppoly TPG110, Sitronix ST7701, PDA 91–00156-A0, LeMaker BL035-RGB-002 3.5 и Kingdisplay kd097d04;
    • Добавлена поддержка звуковых кодеков Rockchip RK3328, Cirrus Logic CS4341 и CS35L36, MediaTek MT6358, Qualcomm WCD9335 и Ingenic JZ4725B, а также звуковой платформы Mediatek MT8183;
    • Добавлена поддержка NAND-контроллеров Flash STMicroelectronics FMC2, Amlogic Meson;
    • Добавлена поддержка ускорителей для систем машинного обеспечения Habana AI;
    • Добавлена поддержка гигабитных Ethernet-контроллеров NXP ENETC и беспроводных интерфейсов MediaTek MT7603E (PCIe) и MT76×8.

© OpenNet