Релиз ядра Linux 5.3

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.3. Среди наиболее заметных изменений: поддержка GPU AMD Navi, процессоров Zhaoxi и технологии управления энергопотреблением Intel Speed Select, возможность использования инструкций umwait для ожидания без использования циклов, повышающий интерактивность режим 'utilization clamping' для асимметричных CPU, системный вызов pidfd_open, возможность использования IPv4-адресов из подсети 0.0.0.0/8, интеграция гипервизора ACRN.

В анонсе нового выпуска Линус напомнил всем разработчикам о главном правиле при разработке — сохранении неизменности поведения для компонентов пространства пользователя. Изменения в ядре никаким образом не должны нарушать уже работающие приложения, при этом нарушение поведения может вызвать не только изменение ABI, удаление устаревшего кода или появление ошибок, но и косвенное влияние корректно работающих полезных улучшений. В качестве наглядного примера была отброшена полезная оптимизация в коде Ext4, сокращающая число мелких обращений к накопителю за счёт отключения упреждающего чтение таблицы inode при мелких запросах ввода/вывода. Оптимизация привела к тому, что энтропия для генератора случайных чисел getrandom () стала накапливаться медленнее и в некоторых конфигурациях при определённом стечении обстоятельств могут наблюдаться подвисания во время загрузки до заполнения пула энтропии.

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

  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для файловой системы XFS реализована возможность многопоточного обхода inode (например, при проверке квот). Добавлены новые ioctl BULKSTAT и INUMBERS, предоставляющие доступ к возможностям, доступным в пятой редакции формата ФС, таким как время рождения inode и возможность задания параметров BULKSTAT и INUMBERS для каждой группы AG (Allocation Groups);
    • В Btrfs обеспечено определение быстрой реализации crc32c на всех архитектурах;
    • В Ext4 добавлена поддержка пустот в каталогах (не привязанных блоков). Обеспечена обработка флага «i» (immutable) для открытых файлов (запрет записи в ситуации когда флаг был установлен в тот момент, когда файл уже был открыт);
    • В CIFS снят признак экспериментальной разработки с кода для поддержки smbdirect. В SMB3 добавлена возможность использования криптоалгоритмов в режиме GCM. Добавлена новая опция монтирования для определения режима из записей ACE (Access Сontrol Entry). Оптимизирована производительность вызова open ();
    • В F2FS добавлена опция для ограничения сборщика мусора при работе в режиме checkpoint=disable. Добавлен ioctl для удаления диапазонов блоков из F2FS, что позволяет реализовать корректировку размера раздела на лету. Добавлена возможность размещения в F2FS файла подкачки с обеспечением прямого ввода/вывода. Для всех пользователей добавлена поддержка закрепления файла и выделения блоков для подобных файлов;
    • В интерфейс для асинхронного ввода/вывода io_uring добавлена поддержка асинхронных операций sendmsg () и recvmsg ();
    • В файловую систему UBIFS добавлена поддержка сжатия с использованием алгоритма zstd и возможность верификации подписанных образов ФС;
    • В ФС Ceph добавлена поддержка меток безопасности SELinux для файлов;
    • Для NFSv4 реализована новая опция монтировния «nconnect=», определяющая число установленных с сервером соединений. Трафик между этими соединениями будет распределяться с использованием балансировки нагрузки. Кроме того, сервером NFSv4 теперь создаётся каталог /proc/fs/nfsd/clients с информацией о текущих клиента, включая сведения об открытых ими файлах;
  • Виртуализация и безопасность
    • В состав ядра включён гипервизор для встраиваемых устройств ACRN, который написан с оглядкой на готовность для выполнения задач реального времени и пригодность к использованию в критически важных системах. ACRN обеспечивает минимальные накладные расходы, гарантирует низкие задержки (low latency) и адекватную отзывчивость при взаимодействии с оборудованием. Поддерживается виртуализация ресурсов CPU, ввода/вывода, сетевой подсистемы, операций с графикой и звуком. ACRN может применяться для запуска нескольких изолированных виртуальных машин в электронных блоках управления, приборных панелях, автомобильных информационных системах, потребительских IoT-устройств и другой встраиваемой техники.
    • В User-mode Linux добавлен режим «путешествия во времени», позволяющий замедлить время для упрощения отладки связанного со временем кода;
    • Добавлены новые опции командной строки ядра «init_on_alloc» и «init_on_free», при указании которых включается обнуление выделяемых и освобождаемых областей памяти (заполнение нулями), что позволяет усилить безопасность за счёт дополнительных накладных расходов на инициализацию;
    • Добавлен новый драйвер virtio-iommu с реализацией паравиртализированного устойства, позволяет отправлять IOMMU-запросы, такие как ATTACH, DETACH, MAP и UNMAP, поверх транспорта virtio без эмуляции таблиц страниц памяти;
    • Добавлен новый драйвер virtio-pmem, представляющий доступ к устройствам хранения, отражённым в физическое адресное пространство, таким как NVDIMM;
    • Реализована возможность прикрепления криптографических ключей к пользовательскому или сетевому пространству имён (ключи становятся недоступны за пределами выбранного пространства имён), а также защиты ключей при помощи ACL;
  • Сетевая подсистема
    • Обеспечена обработка адресов IPv4 в диапазоне 0.0.0.0/8, который ранее был недоступен для использования. Введение данной подсети позволит распределить ещё 16 млн адресов IPv4;
    • В Netfilter добавлена поддержка механизмов аппаратного ускорения фильтрации пакетов;
    • Добавлена возможность прикрепления BPF-программ к системным вызовам setsockopt () и getsockopt (), что, например, позволяет прикрепить свои обработчики доступа к этим вызовам. Кроме того, добавлена новая точка вызова (hook), при помощи которой можно организовать вызов BPF-программы один раз за каждый интервал RTT (round-trip-time, время пинга);
  • Память и системные сервисы
    • Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время какPID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). Ранее в ядро уже был добавлен системный вызов pidfd_send_signal () и флаг CLONE_PIDFD в вызове clone (), позволяющий получить pidfd для использования в idfd_send_signal (). При использовании вызова clone () с флагом CLONE_PIDFD могли возникать проблемы с сервисными менеджерами или системой принудительного завершения процессов при нехватке памяти в платформе Android. В этом случае для запуска используется вызов fork () или clone () без CLONE_PIDFD.

      В ядре 5.3 представлен системный вызов pidfd_open (), позволяющий получить проверяемый pidfd для произвольного существующего процесса, созданного не через вызов clone () с флагом CLONE_PIDFD. Также добавлена поддержка поллинга pidfd при помощи poll () и epoll (), что позволяет в менеджерах процессов отслеживать завершения произвольных процессов, не опасаясь состояния гонки в случае присвоения PID новому процессу. Механизм уведомления о завершении работы процесса, связанного с pidfd, аналогичен информированию о завершении своего дочернего процесса;

    • В планировщик задач добавлена поддержка механизма закрепления нагрузки (Utilization clamping), позволяющего придерживаться минимального или максимального диапазонов частот, в зависимости от активных на CPU задач. Представленный механизм ускоряет задачи, которые напрямую влияют на качество взаимодействия с пользователем, через запуск этих задач как минимум в нижней границе «запрошенной» частоты. Низкоприоритетные задачи, не сказывающиеся на работе пользователя, запускаются c использованием верхнего лимита «разрешённой» частоты. Лимиты задаются через атрибуты sched_uclamp_util_min и sched_uclamp_util_max в системном вызове sched_setattr ().
    • Добавлена поддержка технологии управления энергопотреблением Intel Speed Select, доступной на некоторых серверах с процессорами Intel Xeon. Указанная технология позволяет устанавливать настройки производительности и пропускной способности разделов для разных ядер CPU, что позволяет сделать более приоритетной производительность для задач, выполняемых на определённых ядрах, жертвуя производительностью на других ядрах;
    • Процессам в пространстве пользователя предоставлена возможность ожидания в течение небольшого времени без использования циклов при помощи инструкции umwait. Данная инструкция, вместе с инструкциями umonitor и tpause, будет предложена в готовящихся к выпуску чипах Intel «Tremont», и позволит реализовывать задержки, эффективные с точки зрения энергопотребления и не влияющие на производительность других потоков при использовании Hyper Threading;
    • Для архитектуры RISC-V добавлена поддержка больших страниц памяти (huge pages);
    • В механизм трассировки «kprobes» добавлена возможность разыменования указателей ядра в пространство пользователя, что может применяться, например, для оценки содержимого структур, передаваемых в системные вызовы. Также добавлена возможность установки проверок на этапе загрузки.
    • В файл конфигурации добавлена опция PREEMPT_RT для работы в режиме реального времени. Сам код для поддержки режима реального времени пока не добавлен в ядро, но появление опции является хорошим знаком, что многолетняя эпопея по интеграции патчей Realtime-Preempt близится к финалу;
    • Добавлен системный вызов clone3() c реализацией более расширяемого варианта интерфейса clone (), допускающего указание большего числа флагов;
    • Добавлен обработчик bpf_send_signal (), позволяющий BPF-программам отправлять сигналы произвольным процессам;
    • Для событий perf в окружении гипервизора KVM добавлен новый механизм фильтрации событий, позволяющий администратору определить типы событий, допустимые или не допустимые для монторинга на стороне гостевой системы;
    • В механизм верификации eBPF-приложений добавлена возможность обработки программ с циклами, если выполнение цикла ограничено и не может привести к превышению лимита на максимальное число инструкций;
  • Оборудование
    • В драйвер amdgpu добавлена начальная поддержка GPU AMD NAVI (RX5700), которая включает базовый драйвер, код для взаимодействия с экранами (DCN2), поддержку GFX и вычислений (GFX10), SDMA 5 (System DMA0), средства управления питанием и мультимедийные кодировщики/декодировщики (VCN2);
    • Добавлена поддержка x86 процессоров компании Zhaoxin, созданной как совметный проект VIA Technologies и муниципалитета Шанхая. Семейство CPU ZX построены на базе архитектуры x86–64 Isaiah, продолжающей развитие технологий VIA Centaur;
    • В ядро приняты изменения с добавлением дополнительной защиты ioctl-вызовов, связанных с драйвером floppy, а сам драйвер помечен как оставленный без сопровождения («orphaned»), что подразумевает прекращение его тестирования. Драйвер пока сохраняется в ядре, но его корректная работа не гарантируется. Драйвер рассматривается как устаревший, так как для его тестирования трудно найти работающее оборудование — все актуальные внешние накопители, как правило, используют интерфейс USB.

Одновременно Латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.3 — Linux-libre 5.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске включена отключена загрузка блобов в драйверах qcom, hdcp drm, allegro-dvt и meson-vdec. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуковом драйвере ддя skylake, а также в документации к микрокоду.

© OpenNet