После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.1. Среди наиболее заметных изменений: новый интерфейс для асинхронного ввода/вывода io_uring, возможность использования NVDIMM в качестве ОЗУ, поддержка в Nouveau разделяемой виртуальной памяти, поддержка масштабируемого мониторинга очень больших ФС через fanotify, возможность настройки уровней сжатия Zstd в Btrfs, новый обработчик cpuidle TEO, реализация системных вызовов для решения проблемы 2038 года, возможность загрузки с устройств device-mapper без initramfs, LSM-модуль SafeSetID, поддержка комбинированных 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.Из других улучшений в Btrfs можно отметить добавление отложенного выполнения операций сканирования поддерева для снижения нагрузки и реализацию нового ioctl для управления отключением устройств;
- Добавлена возможность загрузки с файловой системы, размещённой на устройстве device-mapper, без применения initramfs. Начиная с текущего выпуска ядра устройства device-mapper можно напрямую использовать в процессе загрузки, например, как раздел с корневой ФС. Настройка раздела осуществляется при помощи загрузочного параметра "dm-mod.create". Среди разрешённых для загрузки модулей device-mapper: "crypt", "delay", "linear", "snapshot-origin" и "verity";
- В ориентированную на Flash-накопители файловую систему F2FS добавлен флаг F2FS_NOCOW_FL (checkpoint=disable), позволяющий отключить режим copy-on-write для заданного файла;
- Из ядра удалена файловая система Exofs, представляющая собой вариант ext2, адаптированный для работы с хранилищами объектов OSD (Object-based Storage Device). Также удалена поддержка SCSI-протокола для подобных устройств хранения объектов;
- В XFS реализован режим always_cow, при котором вместо замены данных в блоках по месту применяется модель COW (для изменений создаётся копия блока). Для включения режима можно использовать команду "echo 1 > /sys/fs/xfs/debug/always_cow";
- В CIFS обеспечено кэширвоание данных FILE_ALL_INFORMATION, что позволяет выполнять взовы подобные "stat /mountpoint" на основе данных в кэше без обращения к серверу по сети. Добавлена возможность отправки запросов SMB3 FSCTL к серверу из утилит в пространтве пользователя, например, из smbinfo;
- В EXT4 добавлен новый атрибут, доступный через sysfs (/sys/fs/ext4/{disk}/journal_task). Атрибут может оказаться полезным для перемещения потока обработки журнала в cgroup или его трассировки при помощи ftrace, perf или blktrace;
- В EXT2 добавлена поддержка системного вызова statx c реализацией более эффективного и функционального варианта stat(), возвращающего расширенную информацию о файле, включая время создания файла и специфичные для файловых систем флаги;
- Виртуализация и безопасность
- В prctl() добавлена опция PR_SPEC_DISABLE_NOEXEC для управления спекулятивным выполнением инструкций для выбранного процесса. Новая опция позволяет выборочно управлять защитой от спекулятивного выполнения для процессов, которые потенциально могут быть атакованы при помощи атаки типа Spectre. В случае активации опции при запуске нового процесса выполняется очистка бита SSBD в структуре задач;
- Реализован LSM-модуль SafeSetID, позволяющий системным сервисам безопасно управлять пользователями без повышения привилегий (CAP_SETUID) и без получения полномочий пользователя root. Назначение привилегий осуществляется через определение в securityfs правил на основе белого списка допустимых привязок (в форме "UID1:UID2");
- Добавлены низкоуровневые изменения, необходимые для стековой организации загрузки модулей безопасности (возможность загрузки одного LSM-модуля поверх другого). Представлен параметр загрузки ядра "lsm", позволяющий управлять тем, какие модули загружаются и в каком порядке;
- В подсистему аудита добавлена поддержка пространств имён файлов;
- Расширены возможности GCC-плагина structleak, позволяющего блокировать потенциальные утечки содержимого памяти Обеспечена инициализация любых переменных, которые используются в коде через обращение по ссылке в стеке;
- Сетевая подсистема
- Для сокетов реализована новая опция "SO_BINDTOIFINDEX", похожая на "SO_BINDTODEVICE", но принимающая в качестве аргумента индексный номер сетевого интерфейса вместо имени интерфейса. Для IPv6 добавлена опция сокетов IPV6_ROUTER_ALERT_ISOLATE, позволяющая ограничить приём пакетов тролько для одного с сокетом пространства имён;
- В стек mac80211 добавлена возможность назначения одному устройству нескольких BSSID (MAC-адресов). В рамках проекта по оптимизации производительности WiFi в стек mac80211 добавлен учёт распределения эфирного времени и возможность распределять эфирное время между несколькими станциями (при работе в режиме точки доступа выделение меньшего времени на передачу медленным беспроводным станциям, вместо равномерного распределния времени между всеми станциями);
- В модуль cfg80211/nl80211 при работе в режиме точки доступа добавлена возможность выноса обработчика аутентификации в пространство пользователя (Authentication offload);
- Добавлен механизм "devlink health", предоставляющий уведомления при возникновении проблем с сетевым интерфейсом. Кроме того, в devlink реализован API для получения информации об устройстве и добавлена команда "flash update" для обновления прошивок сетевого адаптера;
- Обеспечена возможность применения режима TCP Fast Open вместе с операциями zerocopy (отпрвка сообщений в sendmsg с флагом MSG_ZEROCOPY);
- Добавлен интерфейс для диагностики сокетов AF_XDP;
- Память и системные сервисы
- Реализована безопасная доставка сигналов, учитывающая возможность повторного использования 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-программ. Добавлена возможность добавления через BPF-программы дополнительных заголовков в инкапсулированные пакеты IP (IP/GRE, GUE, IPIP). В eBPF реализована новая инструкция jmp32 и поддержка типа "__int128". В утилиту bpftool добавлена команда для вывода списка параметров eBPF. На базе BPF реализован фреймворк Host Bandwidth Manager, позволяющий ограничивать исходящую пропускную способность через cgroups. Добавлена документация по подсистеме BPF;
- В команду "perf diff" добавлены новые опции-фильтры "--time", "--cpu", "--pid" и "--tid";
- Добавлена загрузочная опция "driver_async_probe" для указания списка драйверов, инициализация которых будет проводится в асинхронном режиме (позволяет ускорить процесс загрузки ядра);
- Убрано устаревшее поведение OOM killer, в соответствии с которым предпочтение при принудительном завершении отдавалось дочерним процессам наиболее агрессивного процесса, а не самому агрессивному процессу;
- Оборудование
- В драйвер Nouveau добавлена поддержка гетерогенного управления памятью, обеспечивающего возможность обращения CPU и GPU к общим синхронизированным областям памяти. Система разделяемой виртуальной памяти (SVM, shared virtual memory) реализована на базе подсистемы HMM (Heterogeneous memory management), позволяющей использовать устройства с собственными блоками управления памятью (MMU, memory management unit), которые могут получать доступ к основной памяти. В том числе при помощи HMM можно организовать совместное адресное пространство между GPU и CPU, в котором GPU может получить доступ к основной памяти процесса. Поддержка SVM пока включена только для GPU семейства Pascal, хотя поддержка обеспечена и для GPU Volta и Turing. Кроме того, в Nouveau добавлен новый ioctl для управления миграцией областей памяти процессов в память GPU;
- В 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. Добавлен интерфейс управления планируемыми зависимостями для исключения взаимных блокировок;
- Добавлена поддержка экранных панелей 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 Goya;
- Добавлена поддержка гигабитных Ethernet-контроллеров NXP ENETC и беспроводных интерфейсов MediaTek MT7603E (PCIe) и MT76x8;
- Добавлена поддержка новых ARM SoC: Socionext SC2000 (Milbeaut), Bitmain BM1880, Renesas RZ/A2M (R7S9210), Renesas RZ/G2E (r8a774c0), NXP i.MX8QuadXPlus, Mediatek MT7629;
- Добавлена поддержка новых ARM плат и платформ: NVIDIA Shield TV (Darcy) на базе Tegra210, Bosch Guardian, Winterland IceBoard, Inspur on5263m5, Zodiac Digital Tapping Unit, Phicomm K3, X96 Max, FriendlyElec NanoPC-T4, NanoPi M4, Radxa ROCK Pi 4, Logic PD i.MX6QD, Y Soft IOTA Draco/Hydra/Ursa, Phytec phyCORE i.MX6 UltraLite, MYIR Tech MYD-LPC4357, Chameleon96, Oxalis Evalkit V100, Elgin RV1108 R, Si-Linux CAT874, Si-Linux EK874, Raspberry Pi Model 3 A+,
Одновременно Латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.1 - Linux-libre 5.1-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах mt7603 и goya. Обновлён код чистки блобов в драйверах и подсистемах wilc1000, iwlwifi, soc-acpi-intel, brcmfmac, mwifiex, btmrvl, btmtk и touchscreen_dmi. Прекращена чистка блобов в загрузчике прошивок lantiq xrx200 из-за его удаления из ядра.
Поддержать публикацию: Coinbase, Yandex.Money