Релиз ядра Linux 4.17

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.17. Несмотря на то, что в процессе цикла разработки ядра 4.17 был преодолён рубеж в 6 млн объектов в Git, Линус решил сохранить интригу и не воспользовался данным поводом для увеличения номера значительной версии ядра, как это делалось для веток 3.x и 4.x. По ощущениям Линуса переходить на нумерацию 5.x ещё рано и скорее всего это произойдёт ко времени выпуска 4.20.

Среди наиболее заметных изменений в ядре 4.15: удаление 8 устаревших процессорных архитектур, добавление в XFS опции lazytime, полная реализация протокола TLS на стороне ядра, защита от уязвимостей Spectre 3a/4, оптимизация планировщика задач для мобильных и встраиваемых систем, поддержка архитектуры Andes Technologies NDS32, поддержка GPU AMD Vega12 и Intel Cannonlake, реализация алгоритмов блочного шифрования SM4 и Speck, стабилизация протокола SMB 3.1.1, поддержка SELinux в SCTP.

В новую версию принято 14.7 тысяч исправлений от 1400 разработчиков, размер патча — 70 Мб (изменения затронули 14170 файлов, добавлено 648108 строк кода, удалено 827247 строк). Около 38% всех представленных в 4.17 изменений связаны с драйверами устройств, примерно 22% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 4% — файловыми системами и 4% c внутренними подсистемами ядра.

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

  • Виртуализация и безопасность
    • Доведена до полноценного состояния реализация протокола TLS на уровне ядра (KTLS), использование которой позволяет добиться существенного повышения производительности приложений, использующих HTTPS. Реализация выполнена в виде модуля ядра, предоставляющего новый тип сокетов AF_KTLS, которые можно использовать для передачи данных по протоколам TLS 1.2 для TCP и DTLS 1.2 для UDP с применением шифра AES GCM. Добавленный ранее вариант модуля KTLS ограничивался поддержкой передающей стороны, а теперь в ядро включены и компоненты для согласования соединения на стороне получателя, т.е. в ядре теперь имеются все компоненты для полноценной поддержки TLS;
    • Добавлен код для защиты от уязвимостей Spectre 3a и Spectre 4 в механизме спекулятивного выполнения инструкций (нераскрытыми остаются ещё 6 проблем из группы Spectre-NG). Кроме включения исправлений на стороне ядра для обеспечения защиты также обязательно обновление микрокода — защита строится на применении MSR-бита SSBD (Speculative Store Bypass Disable), поддержка которого представлена в новом микрокоде. По предварительной оценке включение защиты приводит к снижению производительности на 2–8%. Так как применение защиты от Spectre 4 не всегда оправдано, для её отключения предусмотрена опция speculative_store_bypass_disable, в SECCOMP добавлен специальный флаг и код для автоматического отключения SSB для изолированных процессов, а для приложений предложен новый интерфейс prctl, при помощи которого программы могут определять наличие защиты и выборочно отключать её для отдельных процессов;
    • В ядро встроена поддержка блочного шифра Speck, разработанного Агентством национальной безопасности США. Шифр примечателен очень высокой производительностью программной реализации, которая обгоняет AES на системах без наличия средств аппаратного ускорения AES;
    • Добавлена поддержка шифрования AES в режиме CFM (Cipher Feedback Mode), наличие которого определено в спецификации TPM2 (Trusted Platform Module);
    • Реализована поддержка алгоритма блочного шифрования SM4, (GB/T 32907–2016), стандартизированного для учреждений Китая и применяемый в китайском стандарте Wireless LAN WAPI;
    • В протоколе SCTP обеспечена полноценная поддержка SELinux;
    • Добавлена возможность управления модулями AppArmor через сокет;
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для файловой системы XFS реализована поддержка опции монтирования lazytime, которая даёт возможность отследить время обращения к файлам, но не приводит к возникновению большого числа паразитных операций записи в ФС. Основное отличие от «atime» состоит в том, что время доступа сохраняется в inode, хранящихся в оперативной памяти, и сбрасываемых на диск только при возникновении явных условий или истечения достаточно длительного таймаута (раз в 24 часа). Таким образом для работающих программ возвращается всегда точный atime, но на диске сведения сохраняются с большой задержкой;
    • В файловой системе ext4 повышена надёжность работы в условиях обработки некорректных образов ФС, специально модифицированных для вредоносных целей. При этом мэйнтейнер Ext4 по-прежнему считает плохой идеей предоставление доступа к монтированию произвольных ext4-образов из изолированных контейнеров;
    • В файловой системе Btrfs удалены операции ioctl () с реализацией функциональности управляемых транзакций, которая оказалась невостребованной и не примется на практике;
    • С реализации SMB 3.1.1 снят признак экспериментальной разработки. В CIFS добавлена поддержка представленной в спецификации SMB 3.1.1 возможности обеспечения целостности на стадии до прохождения аутентификации. Метод основан на использовании криптографических хэшей на этапе согласования сеанса связи и позволяет защититься от MITM-атак с подменой сообщений для отката не менее защищённые схемы аутентификации;
    • В файловой системе OverlayFS появилась опция монтирования «xino», обеспечивающая сохранения идентификатора ФС в составе номера inode, что позволяет зафиксировать имена inode и гарантировать, что они не будут меняться во времени. Предложенная опция предотвращает появлением в разное время разных номеров inode для одного файла, что может приводить к проблемам в приложениях, манипулирующих данными на уровне inode;
  • Память и системные сервисы
    • Код оценки нагрузки в планировщике задач, прогнозирующий сколько ресурсов CPU может израсходовать каждый работающий процесс для оптимизации выбора режимов работы CPU и распределения процессов по ядрам CPU, доработан для более оптимальной работы в условиях нагрузок, свойственных для мобильных и встраиваемых систем;
    • В системный вызов bpf () добавлена новая команда BPF_RAW_TRACEPOINT, позволяющая привязать BPF-обработчик к точке трассировки (tracepoint — вариант динамических printf (), выставляемых разработчиками программ для анализа поведения системы, к которым затем можно обращаться из LTTng, perf, SystemTap, ftrace). Работа осуществляется без предварительной обработки аргументов tracepoint на стадии до вызова BPF-программы, что позволяет минимизировать накладные расходы при трассировке, но усложняет написание BPF-программы;
    • В команде «perf script» добавлена поддержка скриптов на языке Python 3. В систему трассировки добавлен новый режим «histogram trigger», обеспечивающий формирование вывода данных трассировки в виде наглядных гистограмм;
    • Для сборки ядра на системах x86 теперь необходим компилятор с поддержкой специфичного для GCC выражения «asm goto», которое присутствует начиная с GCC 4.5, но пока не поддерживается в Clang. Сборка модулей lexer и parser теперь производится в рамках общего сборочного процесса и требует наличия flex и bison (раньше данные модули поставлялись в репозитории в готовом виде);
    • Проведена массивная чистка кода от прямого обращения к реализациям системных вызовов внутри ядра. Чистка проведена с целью повышения гибкости интерфейса системных вызовов и упрощения дальнейшей работы по удалению вызовов set_fs (). Изменён и унифицирован механизм обращения к системным вызовам на оборудовании с архитектурой x86–64. Новая схема обращения к системным вызовам обеспечивает защиту от попадания в обработчик системного вызова неиспользуемых, но контролируемых атакующим, данных (например подобная техника была использована в недавней атаке на системы, неверно интерпретировавшие описание поведения инструкций MOV SS/POP SS в документации);
    • Поведение таймера CLOCK_MONOTONIC приведено в соответствие с таймером CLOCK_BOOTTIME, т.е. таймер теперь учитывает время проведённое системой в спящем режиме без формирования разрыва. Потенциально унификация CLOCK_MONOTONIC и CLOCK_BOOTTIME может привести к нарушению поведения приложений, но проблемы, возникающие из-за пропуска времени, проведённого в спящем режиме, явно перевешивают. Для тех приложений которым действительно нужно учитывать только время в активном состоянии предложен таймер CLOCK_MONOTONIC_ACTIVE;
    • Представлена новая ioctl-команда INOTIFY_IOC_SETNEXTWD, позволяющая задать номер дескриптора, который должен быть возвращён при создании следующего дескриптора (используется при заморозке состояния системы при выполнении checkpoint/restart);
    • В системный вызов mmap () добавлена опция MAP_FIXED_NOREPLACE, которая пытается разместить новый регион памяти по адресу, заданному пользователем, но в отличие от MAP_FIXED без замены уже существующего маппинга по данному адресу (при пересечении будет выдана ошибка EEXIST);
  • Сетевая подсистема
    • Протокол RDS (Reliable Datagram Sockets), позволяющий создавать сокеты для надёжной передачи датаграмм поверх TCP-линков, расширен поддержкой режима zero-copy, позволяющего передавать данные без промежуточной буферизации;
    • Реализована возможность применения BPF-скриптов для фильтрации трафика, отправленного через системные вызовы sendmsg () и sendfile ();
    • В системные вызовы bind () и connect () добавлен набор специфичных для cgroups точек подключения BPF-обработчков. Присоединённые BPF-скрипты могут изменять поведение работы данных системных вызовов;
    • С нарушением обратной совместимости изменено 32-разрядное ABI для RDMA. Решение о нарушении совместимости принято так как данный режим пока не используется в реальных приложениях;
  • Поддержка архитектур
    • Проведена одна из крупнейших чисток кодовой базы от устаревшего кода (удалено 467 тысяч строк кода), в ходе которой удалена поддержка архитектур blackfin, cris, frv, m32r, metag, mn10300, score и tile, а также специфичные для данных архитектур драйверы. Ныне данные архитектуры не используются для создания процессоров, так как производителям дешевле лицензировать более новые ядра CPU от ARM, MIPS или RISC-V. Прошивки для ранее выпущенных чипов остаются на старых версиях ядра Linux и давно не обновлялись до новых веток;
    • Добавлена поддержка архитектуры CPU NDS32, развиваемой компанией Andes Technologies, и реализованных на её основе процессорных ядер N13, N15, D15, N10 и D10. NDS32 продолжает развитие 16/32-разрядной RISC-подобной архитектуры AndeStar и воплощена в новой серии настраиваемых процессоров AndesCore, которые охватывают широкий диапазон применения во встраиваемой технике, от компактных решений для микроконтроллеров и DSP до высокопроизводительных (1GHz+) систем общего назначения с возможностью запуска Linux и специализированных процессоров для ускорения определённых приложений;
    • Добавлена поддержка появившегося в процессорах SPARC M7 механизма обеспечения целостности данных приложения (ADI, Application Data Integrity). Новая возможность позволяет приложению установить метки на адреса виртуальной памяти (метка представляет собой четырёхбитовые значения, прикреплённые к адресу). В случает последующего обращения к указанной области по адресу без метки будет сгенерировано исключение;
    • Для архитектуры ARM реализована поддержка интерфейса SCMI (System Control and Management Interface), представляющего набор возможностей для управления системой и управления питанием;
    • Для 64-разрядных систем PowerPC реализована возможность адресации до 4 ПБ ОЗУ;
    • Прекращена поддержка процессоров POWER4, код для которых находился в неработоспособном виде с 2016 года и никто не обратил на это внимание, что свидетельствует об отсутствии пользователей, заинтересованных в данных CPU;
  • Оборудование
    • В DRM-драйвер AMDGPU добавлена полноценная поддержка GPU AMD Vega12. Прослойка AMD DC (Display Core) с реализацией переработанного кода для управления отображением включена по умолчанию для всех поддерживаемых GPU. Проведена реструктуризация кода для использования технологии Powerplay. Прекращена поддержка менеджера управления видеопамятью TTM;
    • В DRM-драйвере Intel включен по умолчанию код для поддержки чипов Cannonlake (Gen 10). Добавлена поддержка технологии защиты HDCP (High-bandwidth Digital Content Protection) для шифрования видеосигнала, передаваемого через интерфейсы DVI, DisplayPort, HDMI, GVIF или UDI, с целью предотвращения его незаконного копирования. Добавлена поддержка портов AUX-F. Предоставлена возможность использования сжатого фреймбуфера для спрайтов. Реализован интерфейс Query uAPI. Обеспечено урезание кэша kmem во время простоя GPU;
    • В драйвер Nouveau внесены только мелкие правки, более заметные исправления отложены до следующего выпуска из-за наличия нерешённых проблем;
    • Добавлена поддержка панелей ARM Versatile, AUO G104SN02 V2, KEO TX31D200VM0BAA и Raydium RM68200 720×1280 DSI, HDMI-ресиверов NXP TDA1997x и SoundGraph iMON, тюнеров Sony CXD2880 DVB-T2/T;
    • Добавлен драйвер для гигабитных ethernet-адаптеров Microchip LAN743x;
    • Добавлена поддержка защищённых процессоров ARM TrustZone CryptoCell и аппаратных генераторов случайных чисел TI Keystone NETCP SA;

Одновременно Латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 4.17 — Linux-libre 4.17-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске прекращена чистка блобов для чипа обработки звука Dreamcast Yamaha AICA, прошивка для которого переведена в разряд СПО. Также прекращена чистка кода USB IrDA из-за удаления данной подсистемы из ядра. Проведена реорганизация кода загрузчика прошивок и скрипта builddeb. Обновлён код чистки блобов в драйверах i915, amdgpu, coda, s5p-mfc, wl1251 и brcmfmac.

© OpenNet