После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 4.17. Несмотря на то, что в процессе цикла разработки ядра 4.17 был преодолён рубеж в 6 млн объектов в Git, Линус решил сохранить интригу и не воспользовался данным поводом для увеличения номера значительной версии ядра, как это делалось для веток 3.x и 4.x. По ощущениям Линуса переходить на нумерацию 5.x ещё рано и скорее всего это произойдёт ко времени выпуска 4.20.
Среди наиболее заметных изменений в ядре 4.17: удаление 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 в механизме спекулятивного выполнения инструкций CPU (нераскрытыми остаются ещё 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 добавлена опция монтирования nossd_spread, отключающая режим оптимизации ssd_spread, при котором при размещении данных осуществляется поиск наибольшей неиспользуемой области на SSD-накопителе. Проведена работа по ускорению операции перестроения массива в режимах RAID5/RAID6. Удалены операции ioctl() с реализацией функциональности управляемых транзакций, которая оказалась невостребованной и не примется на практике;
С реализации SMB 3.1.1 снят признак экспериментальной разработки. В CIFS добавлена поддержка представленной в спецификации SMB 3.1.1 возможности обеспечения целостности на стадии до прохождения аутентификации. Метод основан на использовании криптографических хэшей на этапе согласования сеанса связи и позволяет защититься от MITM-атак с подменой сообщений для отката на менее защищённые схемы аутентификации;
В файловой системе F2FS добавлена поддержка помещения в каталог lost+found файлов, потерянных в результате сбоя, но выявленных утилитой fsck. Добавлена опция монтирования fsync_mode, позволяющая выбрать метод вызова fsync для сброса данных на накопитель (поддерживается два режима - posix и strict). Проведена оптимизация производительности для маломощных устройств;
В файловой системе OverlayFS появилась опция монтирования "xino", обеспечивающая сохранения идентификатора ФС в составе номера inode, что позволяет зафиксировать имена inode и гарантировать, что они не будут меняться во времени. Предложенная опция предотвращает появление в разное время разных номеров inode для одного файла, что может приводить к проблемам в приложениях, манипулирующих данными на уровне inode;
Память и системные сервисы
Для более оптимальной работы в условиях нагрузок, свойственных для мобильных и встраиваемых систем, доработан код оценки нагрузки в планировщике задач, прогнозирующий сколько ресурсов CPU может израсходовать каждый работающий процесс для оптимизации выбора режимов работы CPU и распределения процессов по ядрам CPU;
В системный вызов bpf() добавлена новая команда BPF_RAW_TRACEPOINT, позволяющая привязать BPF-обработчик к точке трассировки (tracepoint - вариант динамических printf(), выставляемых разработчиками программ для анализа поведения системы, к которым затем можно обращаться из LTTng, perf, SystemTap, ftrace). Работа осуществляется без предварительной обработки аргументов tracepoint на стадии до вызова BPF-программы, что позволяет минимизировать накладные расходы при трассировке, но усложняет написание BPF-программы;
Переработан код для обработки состояний простоя процессора (idle loop), в котором сокращено число краткосрочных переходов на неглубокие уровни экономии энергии. Перевод процессора в состояние idle теперь осуществляется только если планировщик прогнозирует нахождение в данном состоянии достаточно долгое время.
В проведённых разработчиками тестах в состоянии простоя потребление энергии после внесения изменений снизилось на 10% и больше. Кроме того возросла производительность некоторых видов нагрузки, на которые негативно влиял переход в idle-режим;
Проведена чистка кода подсистемы CPUFreq;
В команде "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 в документации);
В состав принята подсистема LKMM (Linux Kernel Memory Consistency Model), включающая набор утилит (размещены в каталоге tools/memory-model/) для формального описания модели связи разных областей памяти ядра. Инструментарий даёт возможность генерировать модули ядра с тестовыми проверками, позволяющими тестировать различные методы работы ядра с памятью и выявлять проблемы связанные с организацией работы блокировок при попытках одновременного доступа к памяти;
Поведение таймера 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. Для всех поддерживаемых GPU включена по умолчанию прослойка AMD DC (Display Core) с реализацией переработанного кода для управления отображением и поддержкой таких возможностей, как вывод звука через HDMI и DisplayPort, HDMI 2.0 и атомарное переключение видеорежимов. Проведена реструктуризация кода для использования технологии Powerplay. Прекращена поддержка менеджера управления видеопамятью TTM. Добавлены средства для контроля за энергопотреблением в стиле Radeon WattMan (позволяет управлять вольтажом, частотой движка и памяти, скоростью вращения кулера, получать сведения о температуре);
В драйвере amdkfd для dGPU (дискретные GPU, такие как Fiji, Tonga, Polaris) добавлена поддержка GPUVM и обработки событий KFD, что позволяет запустить поверх ядра стек OpenCL без применения сторонних модулей;
В DRM-драйвере Intel включен по умолчанию код для поддержки чипов Cannonlake (Gen 10). Добавлена поддержка технологии защиты HDCP (High-bandwidth Digital Content Protection) для шифрования видеосигнала, передаваемого через интерфейсы DVI, DisplayPort, HDMI, GVIF или UDI, с целью улучшения совместимости с существующим оборудованием (спецификация требует применения HDCP при передаче потоков звука в формате TrueHD). Добавлена поддержка портов AUX-F. Предоставлена возможность использования сжатого фреймбуфера для спрайтов. Реализован интерфейс Query uAPI. Обеспечено урезание кэша kmem во время простоя GPU;
В драйвер Nouveau внесены только мелкие правки, более заметные исправления отложены до следующего выпуска из-за наличия нерешённых проблем;
Добавлена поддержка панелей ARM Versatile, AUO G104SN02 V2,
KEO TX31D200VM0BAA и Raydium RM68200 720x1280 DSI, HDMI-ресиверов NXP TDA1997x и SoundGraph iMON, тюнеров Sony CXD2880 DVB-T2/T;
Добавлен драйвер для гигабитных ethernet-адаптеров Microchip LAN743x;
Добавлена поддержка защищённых процессоров ARM TrustZone CryptoCell и аппаратных генераторов случайных чисел TI Keystone NETCP SA;
Добавлена поддержка устройств вывода звука с интерфейсом USB, соответствующих спецификации USB Audio Class 3.0;
Добавлена поддержка новых SoC Allwinner H6, ST STM32MPU, NVIDIA Tegra Tegra194 ("Xavier"), NVIDIA P2972. Добавлена поддержка плат Libre Computer Card ROC-RK3328-CC, Orange Pi Zero+, Teres-I, Olimex som204, Banana Pi M2 Zero, а также плат на базе Nuvoton NPCM и смартфонов Samsung Galaxy S3 и Galaxy S5 на базе SoC Exynos4 и MSM8974.
Одновременно Латиноамериканский Фонд свободного ПО сформировал
вариант полностью свободного ядра 4.17 - Linux-libre 4.17-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске прекращена чистка блобов для чипа обработки звука Dreamcast Yamaha AICA, прошивка для которого переведена в разряд СПО. Также прекращена чистка кода USB IrDA из-за удаления данной подсистемы из ядра. Проведена реорганизация кода загрузчика прошивок и скрипта builddeb. Обновлён код чистки блобов в драйверах i915, amdgpu, coda, s5p-mfc, wl1251 и brcmfmac.
Релиз ядра Linux 4.17
Также по теме: