Спустя два месяца работы Линус Торвальдс представил релиз ядра Linux 5.1. Новинка получила большое количество новых функций и доработок, включая новый интерфейс для асинхронного ввода ввода/вывода io_uring, поддержку масштабируемого мониторинга очень больших ФС через fanotify, решение проблемы 2038 года и др.
По словам Торвальдса, 5.1 получил более 13 тысяч коммитов, что немало. Итоговый список изменений получился очень внушительным.
Как всегда, изменения и нововведения разделены на несколько категорий.
Дисковая подсистема, файловые системы, ввод/вывод
- в новом релизе появился новый интерфейс для асинхронного ввода/вывода — io_uring. Он хорош тем, что поддерживает поллинг ввода/вывода, плюс может работать как с буферизацией, так и без нее. Ранее механизм асинхронного ввода/вывода не поддерживал эту возможность, плюс мог работать лишь в обход кэша и без буферизации. Из-за ожидания доступности метаданных возникали блокировки;
- механизм отслеживания событий в ФС fanotify() получил поддержку отслеживания ситуаций изменения суперблока и структуры dirent (это специфическое событие создания, удаления и перемещения каталогов). Новые возможности позволяют решать проблемы с масштабируемостью, которые возникают при создании рекурсивных отслеживаний изменений в очень больших файловых системах при помощи механизма inotify;
- файловая система Btrfs теперь имеет возможность настройки уровня сжатия для алгоритма zstd. Плюс в этой ФС добавлено отложенное выполнение операций сканирования поддерева для снижения нагрузки и реализация ioctl для управления отключением устройств;
- в ядре теперь нет файловой системы Exofs, которая представляла собой один из вариантов ext2, оптимизированный для работы с хранилищами объектов OSD. Нет и SCSI-протокола для таких устройств хранения объектов;
- также внесены исправления, которые направлены на увеличение масштабируемости и производительности файловых систем, которые работают через механизм FUSE.
Безопасность и виртуализация
- в ядро добавлены низкоуровневые изменения, которые нужны для стековой организации загрузки модулей безопасности (возможность загрузки одного LSM-модуля поверх другого). Плюс есть возможность управлять порядком загрузки;
- расширены возможности GCC-плагина structleak. Он позволяет блокировать потенциальные утечки содержимого памяти. Добавлена возможность инициализации любых переменных, используемых в коде через обращение по ссылке в стеке;
- в prctl() появилась опция PR_SPEC_DISABLE_NOEXEC, которая дает возможность управлять спекулятивным выполнением инструкций для выбранного процесса.
Сетевая подсистема
- в стек mac80211 добавлена возможность назначения одному устройству сразу нескольких MAC-адресов. Кроме того, в этот стек добавлен и учет распределения эфирного времени, с возможностью его распределения между несколькими станциями. Это дает возможность выделять меньше времени на передачу медленным беспроводным станциям при работе в качестве точки доступа;
- в модуль cfg80211/nl80211 добавлена возможность выноса обработчика аутентификации при работе в режиме точки доступа;
- если возникают проблемы с сетевым интерфейсом, узнать подробности можно посредством механизма devlink health. Здесь же есть и API для получения информации об устройстве, плюс добавлена команда «flash update» для обновления прошивок сетевого адаптера;
- добавлена поддержка TLS 1.3.
Память и сервисы
- разработчики добавили безопасную доставку сигналов, которая учитывает возможность повторного использования PID. Так, ранее при выполнении вызова kill могла возникнуть ситуация, когда после отправки сигнала целевой PID мог быть освобожден из-за завершения работы процесса. В результате сигнал передавался другому процессу;
- также добавлена возможность использования устройств постоянной памяти в качестве ОЗУ (persistent-memory, например NVDIMM). До выхода нового ядра эти устройства поддерживались в качестве устройств хранения, но теперь их можно задействовать в качестве дополнительной оперативной памяти. Возможность была добавлена в ответ на пожелания пользователей, которым не нужна высокая производительность, но требуется штатный API управления памятью ядра Linux вместо использования имеющихся систем распределения памяти в пространстве пользователя, которые работают поверх mmap для dax-файла;
- для решения проблемы 2038 года (переполнение 32-разрядного типа time_t) в состав ядра включены системные вызовы, которые предлагают для 32-разрядных архитектур 64-разрядные счетчики времени. Как итог, 64-разрядная структура time_t может теперь использоваться на всех архитектурах.
Железо
- в драйвер Nouveau добавили поддержку гетерогенного управления памятью, что дает возможность обращения CPU и GPU к общим синхронизированным областям памяти;
- в DRM-драйвере Intel для GPU и новее режим fastboot включен по умолчанию. Это исключает лишние смены режимов во время загрузки. Добавлены новые идентификаторы устройств на базе Coffelake и Ice Lake;
- в драйвер amdgpu добавлена поддержка GPU Vega10/20 BACO;
- добавлена поддержка большого количества новым 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+.
Более подробно об изменениях можно прочитать здесь (англ.) и здесь (рус.).
Автор: marks