Релиз на ядрото Linux 6.17

След като работи два месеца, Линус Торвалдс представи версията на ядрото 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 MB (промените засягат 12841 файлове, добавени са 646654 реда код, а 398782 реда са премахнати). В предишната версия имаше 15924 корекции от 2145 разработчици, размерът на патча е 50 MB. Около 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 (Data Access Monitoring Results Stat), който позволява проследяване на достъпа до оперативна памет, използвайки подсистемата DAMON (Data Access MONitor). Модулът предоставя статистика за бездействие (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» за резервиране на памет чрез CMA (Contiguous Memory Allocator) за съхранение на crash-дъмпа на ядрото.
    • Разширени са възможностите на механизма 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, позволяваща да се деактивира поддръжката на емуляция APIC, PIC и PIT в KVM.
    • Добавена защита срещу уязвимостта VMSCAPE.
    • Добавена е ioctl-команда FS_IOC_GETLBMD_CAP за извличане на информация от потребителското пространство относно прилагането на средства за защита на целостта към файла.
    • Обявен е за остарял интерфейсът /sys/fs/selinux/user, при достъп до който сега се въвежда петсекундна закъснение и се показва предупреждение в логовете.
  • Мрежовата подсистема
    • В имплементацията на технологията PSE (Power Sourcing Equipment), използвана за подаване на захранване през Ethernet на устройства като 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, която се използва във видеокартите Intel от семейство 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster