Разделы сайта Все
#kernel
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.7. Среди наиболее заметных изменений: новая реализация ФС exFAT, модуль bareudp для создания UDP-туннелей, защита на основе аутентификации указателей для ARM64, возможность прикрепления BPF-программ к LSM-обработчикам, новая реализация Curve25519, детектор "split-lock", совместимость BPF с PREEMPT_RT, снятие ограничения на 80-символьный размер строки в коде, учёт показателей температуры CPU в планировщике задач, возможность использования clone() для порождения процессов в другом cgroup, защита от записи в память при помощи userfaultfd.

В новую версию принято 15033 исправлений от 1961 разработчиков, размер патча - 39 МБ (изменения затронули 11590 файлов, добавлено 570560 строк кода, удалено 297401 строк). Около 41% всех представленных в 5.7 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 13% связано с сетевым стеком, 4% - с файловыми системами и 4% c внутренними подсистемами ядра.
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.6. Среди наиболее заметных изменений: интеграция VPN-интерфейса WireGuard, поддержка USB4, пространства имён для времени, возможность создания обработчиков перегрузки TCP при помощи BPF, начальная поддержка MultiPath TCP, избавление ядра от проблемы 2038 года, механизм "bootconfig", ФС ZoneFS.

В новую версию принято 13702 исправлений от 1810 разработчиков, размер патча - 40 Мб (изменения затронули 11577 файлов, добавлено 610012 строк кода, удалено 294828 строк). Около 45% всех представленных в 5.6 изменений связаны с драйверами устройств, примерно 15% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% - файловыми системами и 3% c внутренними подсистемами ядра.
Разработчики подсистемы фильтрации и модификации сетевых пакетов Netfilter опубликовали набор патчей, значительно ускоряющих обработку больших списков сопоставления (nftables set), в которых требуется проверка сочетания подсетей, сетевых портов, протокола и MAC-адресов. Патчи уже приняты в ветку nf-next, которая будет предложена для включения в состав ядра Linux 5.7. Наиболее заметного ускорения удалось добиться благодаря задействованию инструкций AVX2 (в дальнейшем планируется опубликовать подобные оптимизации на базе инструкций NEON для ARM).

Оптимизации внесены в модуль nft_set_pipapo (PIle PAcket POlicies), решающий задачу сопоставления содержимого пакета с применяемыми в правилах фильтрации произвольными диапазонами состояния полей, такими как диапазоны IP и сетевых портов (nft_set_rbtree и nft_set_hash манипулируют сопоставлением интервалов и прямым отражением значений). Векторизированная при помощи 256-разрядных инструкций AVX2 верcия pipapo на системе с процессором AMD Epyc 7402 показала прирост производительности на 420% при разборе 30 тысяч записей, включающих связки порт-протокол. Прирост при сопоставлении связки из подсети и номера порта при разборе 1000 записей составил 87% для IPv4 и 128% для IPv6.
 
Другая оптимизация, позволяющая использовать 8-битовые группы сопоставления вместо 4-битовых, также показала ощутимый прирост производительности: 66% при разборе 30 тысяч записей порт-протокол, 43% - подсеть_IPv4-порт и 61% - подсеть_IPv6-порт. В сумме, с учётом оптимизаций AVX2, производительность pipapo увеличилась в указанных тестах на 766%, 168% и 269% соответственно. Полученные для сложных сопоставлений характеристики опережают проверки единичных полей в rbtree (за исключением теста связки порт+протокол), но пока отстают от прямых проверок при помощи хэшей и drop-обработчиков на базе netdev.
 
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.5. Среди наиболее заметных изменений: возможность назначения сетевым интерфейсам альтернативных имён, интеграция криптографических функций из библиотеки Zinc, возможность зеркалирования на более чем 2 диска в Btrfs RAID1, механизм отслеживания состояния Live-патчей, фреймворк unit-тестирования kunit, повышение производительности беспроводного стека mac80211, возможность доступа к корневому разделу через протокол SMB, верификация типов в BPF.

В новую версию принято 15505 исправлений от 1982 разработчиков, размер патча - 44 Мб (изменения затронули 11781 файлов, добавлено 609208 строк кода, удалено 292520 строк). Около 44% всех представленных в 5.5 изменений связаны с драйверами устройств, примерно 18% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 12% связано с сетевым стеком, 4% - файловыми системами и 3% c внутренними подсистемами ядра.
По мере приближения релиза Linux 5.6 появляется всё больше данных о нововведениях в этой сборке. Одним из них является внедрение поддержки Multipath TCP (MPTCP) — модификации протокола для работы с множественными путями, которая позволит улучшить работу стандартного TCP/IP.
  
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.4. Среди наиболее заметных изменений: экспериментальный драйвер exFAT, режим "lockdown" для ограничения доступа пользователя root к ядру, механизм fs-verity для контроля целостности файлов, возможность использования CIFS для корневого раздела, контроллер ввода/вывода iocost, ФС EROFS, модуль dm-clone для репликации внешних устройств, новая ФС virtiofs для экспорта каталогов в гостевые системы, поддержка GPU AMD Navi 12/14, AMD Arcturus, AMD Renoir и Intel Tiger Lake.
Компания Netflix выявила несколько критических уязвимостей в TCP-стеках Linux и FreeBSD, которые позволяют удалённо инициировать крах ядра или вызвать чрезмерное потребление ресурсов при обработке специально оформленных TCP-пакетов (packet-of-death). Проблемы вызваны ошибками в обработчиках максимального размера блока данных в TCP-пакете (MSS, Maximum segment size) и механизма выборочного подтверждения соединений (SACK, TCP Selective Acknowledgement).

CVE-2019-11477 (SACK Panic) - проблема проявляется в ядрах Linux начиная с 2.6.29 и позволяет вызвать крах (panic) ядра через отправку серии SACK-пакетов из-за возникновения целочисленного переполнения в обработчике. Для атаки достаточно выставить для TCP-соединения значение MSS в 48 байт и отправить последовательность определённым образом скомпонованных SACK-пакетов.

Суть проблемы в том, что структура tcp_skb_cb (Socket Buffer) рассчитана на хранение 17 фрагментов ("define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1) => 17"). В процессе отправки пакета он размещается в очереди на отправку, а в tcp_skb_cb сохраняются детали о пакете, такие как номер последовательности, флаги, а также поля "tcp_gso_segs" и "tcp_gso_size", которые применяются для передачи драйверу информации о сегментировании (TSO, TCP Segmentation Offload) для обработки сегментов на стороне сетевой карты.
После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.0. Среди наиболее заметных изменений в ядре 5.0: из Android перенесён энегоэффективный планировщик задач для CPU ARM big.LITTLE, добавлен механизм шифрования файловых систем Adiantum, в драйвере AMDGPU добавлена поддержка технологии FreeSync, реализована файловая система BinderFS, появилась возможность размещения файла подкачки в Btrfs, в UDP добавлена поддержка флага MSG_ZEROCOPY и GRO (Generic Receive Offload), в seccomp реализована возможность выноса обработчиков блокировок в пространство пользователя.

Значительная смена номера версии не является индикатором особых изменений, а сформирована из эстетических соображений и лишь свидетельствует о накоплении в ветке 4.x достаточного для начала новой нумерации числа выпусков. Смена первого номера в версии ядра является формальным шагом, снимающих дискомфорт из-за накопления большого числа выпусков в серии. Напомним, что переход к версиям 3.x был осуществлён в 2011 году, когда в ветке 2.6.x накопилось 39 релизов, а ветка 4.x была создана в 2015 году после подготовки 20 выпусков 3.x. При этом смена версий 3.x и 4.x хорошо коррелировала с числом git-объектов в репозитории - ядро 3.0 было выпущено, когда в репозитории находилось примерно 2 млн объектов, а ядро 4.0 - 4 млн объектов. Выпуск 5.0 разрывает данную логическую цепочку, так как в настоящее время репозиторий включает примерно 6.5 млн git-объектов.