След като два месеца разработка, Линус Торвалдс представи версия на ядрото Linux 6.17. Сред най-значимите промени са: увеличаване на производителността на Btrfs, системните извиквания file_getattr() и file_setattr(), унификация на еднопроцесорни и многопроцесорни конфигурации в планировчика на задачи, модул DAMON_STAT със статистика на достъпа до паметта, поддръжка на Live-патчове за системи ARM64, изпращане на core-дампове чрез сокет AF_UNIX, ограничаване на SCHED_EXT чрез cgroup, опростена настройка за защита от уязвимости в CPU, компилация в Clang с инициализация на променливи в стека, защита от подмяна на /proc, разширяване на подсистемата RV (Runtime Verification), ограничаване на сокетите AF_UNIX чрез AppArmor, алгоритъм за управление на претоварвания TCP DualPI2.
В новата версия са направени 14334 корекции от 2118 разработчици, размерът на пача е 46 МБ (промените засягат 12841 файла, добавени са 646654 реда код, изтрити са 398782 реда). В миналото издание имаше 15924 корекции от 2145 разработчици, размерът на пача беше 50 МБ. Около 43% от всички представени в 6.17 промени са свързани с драйверите на устройства, около 12% от промените са свързани с обновяване на код, специфичен за хардуерни архитектури, 14% са свързани със стекове на мрежата, 4% — с файлови системи и 3% с вътрешни подсистеми на ядрото.
Основни нововъведения в ядрото 6.17 (1, 2, 3):
- Дисковата подсистема, вход/изход и файловите системи
- В Btrfs е добавена експериментална поддръжка за големи фолиа на страници в паметта (large folios), позволяващи да се намалят разходите и да се увеличи производителността на редица операции. Реализирано е кеширане на запитванията към битовите карти за разпределение на свободното пространство, благодарение на което производителността на създаването на празни файлове се е увеличила с 20%. Подобрено е предварителното четене в системи, които използват компресия на данни. Осигурено е по-плътно разположение на ключовете в структурата XArray, което е повишило компактността на съхранението на възлите в дървото на екстентите и е позволило да се намали броя на крайните възли с 50-70%. Предоставени са допълнителни настройки за използване на компресия в дефрагментираните екстенти.
- В файловата система ext4 е добавена поддръжка за буферирано въвеждане/извеждане с флага RWF_DONTCACHE, при който данните се изтриват от страничния кеш веднага след завършване на операцията.
- В файловата система EROFS е реализирана поддръжка за компресия на метаданни.
- Сървърът NFS вече може да делегира записни операции на клиенти, които отварят файлове в режим само за запис.
- Към системния повик fallocate() е добавен флаг FALLOC_FL_WRITE_ZEROES, който позволява запълването на указан диапазон във файла с нули, използвайки команда WRITE_ZERO, поддържана от някои SSD дискове, която осъществява нулиране без операции на вход/изход. Опцията за момента е налична само в файловата система ext4.
- Добавени са системни повици file_getattr() и file_setattr() за манипулиране на атрибутите на inode на зададения файл.
- Изтрит е драйверът „pktcdvd“ за работа с оптични носители в пакетен режим, който беше обявен за остарял през 2016 година.
- Файловата система Bcachefs в ядрото на Linux е преместена в режим на външно поддържане, което означава прекратяване на приемането на промени за Bcachefs в основния пакет на ядрото, като същевременно се запазва тази файлова система в кодовата база на ядрото. Разработката на Bcachefs ще се извършва извън кодовата база на ядрото, докато Кент Оверстрит не докаже, че може да взаимодейства коректно с другите разработчици на ядрото и спазва установените правила за разработка.
- Памет и системни услуги
- Поддръжката на еднопроцесорни конфигурации е премахната от планирача на задачите. На системи с един процесор вече трябва да се използват ядра, компилирани за многопроцесорни системи (SMP). Кодът за еднопроцесорни и многопроцесорни системи е унифициран и освободен от излишни привързаности към параметъра на ядрото CONFIG_SMP.
- Добавен е модулът на ядрото DAMON_STAT (Статистика на резултатите от мониторинга на достъпа до данни), който позволява проследяване на достъпа до оперативната памет, използвайки подсистемата DAMON (Мониторинг на достъпа до данни). Модулът предоставя статистика за неактивността (memory_idle_ms_percentiles) и прогнозирана пропускна способност на паметта (estimated_memory_bandwidth).
- На системи с архитектура ARM64 е реализирана поддръжка на Live-патчове, които позволяват прилагане на корекции в ядрото на Linux в движение, без да се изисква рестартиране и спиране на системата.
- В минималистичната C библиотека nolibc, предоставяна с изходните кодове на ядрото на Linux и осигуряваща обвивка над базовите системни повици, е реализирана поддръжка за архитектури SuperH, x32, MIPS n32 и MIPS n34.
- Разширената възможност за изпращане на съдържание на core-дъмпове чрез сокет AF_UNIX позволява създаването на по-безопасни обработващи core-дъмпове в потребителското пространство, независими от извикването на ядро-привилегировани процеси. В новата версия е добавен протокол за създаване сървъри, способен да управлява обработката на core-дъмпове на ниво отделни задачи. Например, за някои процеси може да се игнорират core-дъмповете, а за други да се предават чрез сокета. Отделно е подготвен прототип на сървър за управление на core-дъмпове.
- Добавена е опцията за команден ред на ядрото „crashkernel=size,cma“ за резервиране на място в паметта под запазване на crash-дъмпа на ядрото чрез CMA (Contiguous Memory Allocator).
- Разширени са възможностите на механизма pidfd, който позволява използването на идентификатори, свързани с конкретни процеси и, за разлика от pid, не могат да бъдат преопределяни. Добавена е възможност за свързване на разширени атрибути от потребителското пространство към pidfd. Разрешено е отварянето на файлови дескриптори за pidfd чрез функцията open_by_handle_at() без свързване с файловата система. Вътрешната информация, създадена от ядрото заедно с pidfd, сега се привързва към процеса, а не към pidfd, и се запазва между повторно отваряне на същия процес.
- В подсистемата BPF е добавена функцията bpf_cgroup_read_xattr() за четене на разширени атрибути на файловете. Осигурена е възможност за използване в BPF-програми на типови низови операции, като bpf_strcmp, bpf_strnchr, bpf_strchrnul, bpf_strlen и bpf_strspn, работещи в режим само за четене. Добавена е възможност за използване на стандартни потоци stdout и stderr за взаимодействие с компоненти в потребителското пространство. За системи, базирани на архитектурата LoongArch, в BPF е реализирана възможност за динамична модификация на кода, механизъм „BPF trampoline“ (намалява разходите при предаване на повикванията между ядрото и BPF програмите) и стартиране на програми, използващи struct_ops за създаване на обработчици на функции от ядрото чрез BPF.
- В системата за отчитане на времето е реализирана поддръжка на спомагателни часовници (auxiliary), които не са свързани с обикновените системни часовници и работят по собствен ритъм (по-рано всички часовници работеха с един и същ ритъм и се различаваха само по изместване).
- Добавена начална поддръжка на прокси-изпълнение (Proxy Execution) за смекчаване на проблемите с инверсия на приоритетите. Прокси-изпълнението позволява на задачата, която очаква освобождаване на блокировка, да предаде своя контекст на изпълнение на задачата, която държи блокировката, за да ускори освобождаването на тази блокировка.
- Постепенно се прехвърлят промени от клона Rust-for-Linux, свързани с използването на езика Rust като втори език за разработка на драйвери и модули на ядрото (поддръжката на Rust не е активирана по подразбиране и не води до включване на Rust в списъка с задължителни зависимости на ядрото). Добавени са абстракции за управление на регулатори на напрежение и ток, свойства на фърмуера, ресурси за вход/изход и памет за вход/изход. Реализиран е макрос „warn_on!()“. Добавен е тип UserPtr за указатели в потребителското пространство. Разширена е функционалността на модулите workqueue, uaccess, dma, time и list. Добавен е модул ‘bits’ с функции ‘bit’ и ‘genmask’.
- Преработен е кодът за изчисляване на контролни суми CRC и добавени нови извиквания за генериране на хешове SHA-1 и SHA-2. Добавени са специфични за хардуерни архитектури оптимизации. Подобрена е производителността на функцията crc32c() на новите CPU x86_64, поддържащи разширението VPCLMULQDQ (Vector Carry-Less Multiplication of Quadwords).
- За системите S390 е реализирана поддръжка за свръхпомещаване в раздел подкачка и миграция на големи страници памет (transparent huge page).
- Добавена възможност за настройка на агресивността при освобождаване на паметта (proactive-reclaim) при нейния недостиг, свързана с отделни NUMA възли, което позволява изолиране на NUMA възли, за които ще бъде приложено по-активно освобождаване на памет. Например, «echo «512M swappiness=10″ > /sys/devices/system/node/node1/reclaim».
- В механизма SCHED_EXT, позволяващ използването на BPF за създаване на планировчици на CPU, е добавена възможност за управление на пропускната способност чрез cgroup. Например, може да се използва параметър cpu.max за ограничаване на натоварването на CPU.
- Автоматичното монтиране на виртуалната фс tracefs в директория /sys/kernel/debug/tracing е обявено за остаряло, вместо което трябва да се използва /sys/kernel/tracing.
- Виртуализация и сигурност
- Добавена е възможността за включване на Защита от уязвимости в CPU чрез избор на блокируеми вектори на атака. вместо указания в настройках конкретни уязвимости. Методи за блокиране се избират в зависимост от вида на нарушаване на изолацията: между потребителя и ядрото (user-kernel), между потребителя и друг потребител (user-user), между гостевата система и хост околната среда (guest-host), между различни гостеви системи (guest-guest) и между различни потоци (cross-thread). Предложеният подход дава възможност да се активира само защита срещу класовете уязвимости, които наистина вълнуват потребителя. Например, собствениците на облачни среди могат да включат режимите guest-host и guest-guest, след което ще бъдат активирани методи за защита от уязвимости BHI, GD, L1TF, MDS, MMIO, Retbleed, RFDS, Spectre_v2, SRBDS, SRSO и TAA.
- Добавена е поддръжка за компилиране с Clang с включен режим за проследяване на дълбочината на стека, при който се инициализират всички променливи, съхранявани в стека. Инициализацията се извършва с цел предотвратяване на изтичане на информация от ядрото чрез неинициализирани променливи, които могат да съдържат остатъци от преди запазени данни в стека. Преди това подобна възможност се поддържаше при използване на GCC плъгина STACKLEAK.
- Добавена защита срещу атаки за подмяна на файловата система /proc чрез монтиране в режим «bind». Inode номерът на корена на /proc вече е фиксиран (PROCFS_ROOT_INO) и може да бъде проверен от процеса в потребителското пространство.
- В подсистемата RV (Runtime Verification), предназначена за проверка на правилната работа на високо надеждни системи, е добавен компонент за мониторинг rtapp (Real-time application monitor) за проследяване на типични проблеми в приложения, работещи в режим на реално време, както и компоненти rp, sssw и opid за тестване на планировчика на задачи. Реализирана е възможност за създаване на компоненти за мониторинг, използващи линейна времева логика вместо детерминиран автомат за определяне на модела на поведение. Проверка се извършва по време на изпълнение чрез прикачване на обработчици към точки на трасировка, сравняващи действителния ход на изпълнение с предварително определен еталонен модел, определящ очакваното поведение на системата.
- В системата AppArmor е добавена поддръжка за управление на достъпа до сокети AF_UNIX.
- В хипервизора KVM на ARM системи е реализирана поддръжка на контролера за прекъсвания GICv5.
- Добавена настройка CONFIG_KVM_IOAPIC, която позволява да се деактивира поддръжката на емулатора KVM за APIC, PIC и PIT.
- Добавена защита срещу уязвимостта VMSCAPE.
- Добавена ioctl-команда FS_IOC_GETLBMD_CAP за получаване на информация от потребителското пространство относно прилагането на средства за защита на целостта на файла.
- Обявен за остарял интерфейс \/sys\/fs\/selinux\/user, при достъпа до който сега има петсекундна забавяне и предупреждение в логовете.
- Мрежова подсистема
- В реализацията на технологията PSE (Power Sourcing Equipment), използвана за захранване на устройства като IP камери и безжични точки за достъп, е добавена поддръжка за конфигурируеми стратегии за оценка на бюджета за захранване (общо достъпна мощност). Тези стратегии позволяват да се определи кои портове да бъдат изключени първо, за да се предотврати претоварване.
- В реализацията на протокола MCTP (Management Component Transport Protocol) е добавена поддръжка за маршрутизиране на пакети към външни възли през междинни възли (gateway-routing). Например, следните правила позволяват насочване на пакетите към възел с идентификатор 10 (Endpoint ID 10) през устройството mctpi2c0, използвайки адрес 0x1d, директно свързан с възел с идентификатор 9. mctp route add 9 via mctpi2c0 mctp neigh add 9 dev mctpi2c0 lladdr 0x1d mctp route add 10 gw 9
- За UNIX-сокетите (AF_UNIX) е реализирана опцията SO_INC, а за семейството на адресите VSOCK - опцията SIOCINQ. Реализираните опции са подобни на опцията TCP_INQ за TCP и позволяват чрез управляващо съобщение да се получи информация за количеството байтове, налични за четене в сокета.
- За TCP е включено строго спазване на обявения размер на прозореца за приемане, който определя размера на данните, допустими за изпращане до получаване на ACK-потвърждение от другата страна. Преди ядрото продължаваше да обработва данните, които постъпват над обявения прозорец за приемане, но сега ще спре да го прави.
- В MPTCP (Multipath TCP) е добавена възможността за използване на опцията за сокет TCP_MAXSEG за ограничаване на максималния размер на изпращаните сегменти. MPTCP представлява разширение на протокола TCP, което осигурява доставка на пакети едновременно по няколко маршрута през различни мрежови интерфейси, свързани с различни IP адреси.
- Добавена поддръжка на алгоритъма за контрол на задръствания TCP DualPI2 (RFC 9332), който позволява използването на мащабируеми контролери за задръствания за трафик с високи изисквания за качество на обслужване (например, TCP-Prague и DCTCP), без да се влошава производителността на класическия трафик, за който се използват контролери за задръствания като Reno и Cubic.
- Добавен е sysctl «force_forwarding», чрез който може да се активира пренасочване на трафика към избрани мрежови интерфейси с IPv6.
- Премахната е поддръжката на алгоритъма за определяне на загуба на пакети SACK (Selective Acknowledgment), описан в RFC 6675. Този алгоритъм беше обявен за остарял през 2018 г. За определяне на загубата на TCP пакети се препоръчва използването на алгоритъма RACK-TLP.
- Оборудване
- Продължава работата по drm драйвера (Direct Rendering Manager) Xe за GPU, базирани на архитектурата Intel Xe, използвани във видеокартите от семейството Arc и интегрираната графика, започвайки от процесорите Tiger Lake. В новата версия е включена по подразбиране поддръжката на чиповете, базирани на микроархитектурата Panthor Lake, и добавена е поддръжка на микроархитектурата WildCat Lake.
- В драйвера AMDGPU за GPU GFX9.x е реализирана поддръжката на механизма Cleaner Shader, осигуряващ почистване на паметта на GPU преди повторната й употреба, за да се избегне изтичането на данни, останали след работа на друг процес. Подобрена е поддръжката на режим на готовност. Добавена е възможност за преминаване в спящ режим в среди с AMD SR-IOV. Подобрено е управлението на подсветката.
- В драйвера i915 е реализирана поддръжка на механизма drm_panic, който показва нещо подобно на «син екран на смъртта» при сривове. Добавена е поддръжка на дисплейния контролер, използван в чиповете от семейството Wildcat Lake.
- Продължава интеграцията на компонентите на драйвера Nova за GPU NVIDIA, оборудвани с GSP фърмуери, използвани от серията NVIDIA GeForce RTX 2000, базирана на микроархитектурата Turing. Драйверът е написан на Rust. В новата версия е добавен слой на абстракция за работа с DMA, реализиран е парсер на VBIOS, добавен е код за настройка на фреймбуфера и е осигурена поддръжка за ускорено зареждане в режим Falcon.
- В драйвера adreno е добавена поддръжка на GPU Qualcomm Adreno x1-45 и x1-85.
- В драйвера msm е добавена поддръжка на GPU Adreno SM8750 и маппинга на видеопаметта (VM_BIND).
- В драйвера panfrost е добавена поддръжка на GPU Mali, използвани в SoC Mediatek mt8370.
- В драйвера lima беше добавена поддръжка за GPU, използвани в SoC Rockchip RK3528.
- Добавен е драйвер mtd (Memory Technology Devices) за достъп до NVM паметта, интегрирана в GPU Intel.
- Добавена е поддръжка на звуковите системи ASoC IMX WM8524, AMD ACP7.2, SoundWire ACP 7.1, Fairphone 4 & 5, Qualcomm QCS8275, Framework Laptop 13 (AMD Ryzen AI 300), CS35L41 HDA (използва се в лаптопи ASUS), Richtek RTQ9124, TI TAS5753, HP EliteBook x360 830 G6, EliteBook 830 G6, LG 16Z90R-A, HP 15-fc000. Проведена е реорганизация на кода на HD-audio.
- Добавена е поддръжка за ARM платформи, SoC и устройства: NVIDIA Tegra264, Marvell PXA1908 (първият 64-битов чип от Marvell за смартфони), CIX P1, Axiado AX3000, Sophgo SG2000 (комбинира ARM и RISC-V ядра), Mediatek mt6572, exynos2200 (използван в Samsung Galaxy S22), Renesas R-Car V4M-7, TI am62d2 и Sophgo sg2042, лаптопи на базата на Mediatek mt8186 и Qualcomm Snapdragon X1, смартфони и таблети на базата на SoC mt6572, tegra30 и msm8976.
Същевременно латинамериканският Фонд за свободен софтуер е създал вариант на напълно свободното ядро 6.17 — Linux-libre 6.17-gnu, почистено от елементи на фърмуер и драйвери, съдържащи несвободни компоненти или части от код, чиято употреба е ограничена от производителя. В изданието 6.17 е обновен кодът за почистване на blob-ове в драйверите amdgpu, prueth, iwlwifi, btusb, pci mhi host, adreno a6xx, nova-core и Intel AVS. Извършено е почистване на имената на blob-овете в dts-файловете (devicetree) за ARM чипове и Intel IPU7. Нейтрализирана е загрузката на blob-ове в новите драйвери pci hda. Прекратено е почистването на blob-овете в драйвера QLogic infiniband, който е премахнат от ядрото.
Източник: opennet.ru
