Релиз ядра Linux 5.1
6 мая 2019 года
После двух месяцев разработки Линус Торвальдс представил релиз ядра 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 KB, а максимальный 15 уровень - в 3.126 раз, но при скорости сжатия в 37.30 MB/s, распаковки 878.84 MB/s и потреблении памяти 2547 KB.
Из других улучшений в 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(), возвращающего расширенную информацию о файле, включая время создания файла и специфичные для файловых систем флаги;
- Внесены исправления, нацеленные на увеличение масштабируемости и производительности файловых систем, работающих через механизм FUSE;
- Виртуализация и безопасность
- В 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, позволяющая ограничить приём анонсов ротеров (RA) только собственным пространством имён сокета;
- В стек mac80211 добавлена возможность назначения одному устройству нескольких BSSID (MAC-адресов). В рамках проекта по оптимизации производительности WiFi в стек mac80211 добавлен учёт распределения эфирного времени и возможность распределять эфирное время между несколькими станциями (при работе в режиме точки доступа выделение меньшего времени на передачу медленным беспроводным станциям, вместо равномерного распределения времени между всеми станциями);
- В модуль cfg80211/nl80211 при работе в режиме точки доступа добавлена возможность выноса обработчика аутентификации в пространство пользователя (Authentication offload);
- Добавлен механизм "devlink health", предоставляющий уведомления при возникновении проблем с сетевым интерфейсом. Кроме того, в devlink реализован API для получения информации об устройстве и добавлена команда "flash update" для обновления прошивок сетевого адаптера;
- Для сетевых мостов добавлена поддержка протокола MLD (Multicast Router Discovery, RFC4286);
- Обеспечена возможность применения режима TCP Fast Open вместе с операциями zerocopy (отправка сообщений в sendmsg с флагом MSG_ZEROCOPY);
- Добавлен интерфейс для диагностики сокетов AF_XDP;
- Во встроенную реализацию протокола TLS [ttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=130b392c6cd6b2aed1b7eb32253d4920babb4891 добавлена] поддержка TLS 1.3, помимо ранее поддерживаемого TLS 1.2;
- Память и системные сервисы
- Реализована безопасная доставка сигналов, учитывающая возможность повторного использования 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)
Источники править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.