Релиз ядра Linux 3.5. Обзор новшеств
22 июля 2012 года
Линус Торвальдс представил релиз ядра Linux 3.5. Из основных улучшений можно отметить: поддержка контрольных сумм для обеспечения целостности метаданных в Ext4; система профилирования приложений на пользовательском уровне; механизм создания sandbox-окружений с изоляцией системных вызовов; реализация новых алгоритмов управления очередями пакетов для борьбы с задержками в результате излишней буферизации; возможность сохранения состояния сетевых соединений между перезагрузками; поддержка RFC 5827 (TCP Early Retransmit); реализация по умолчанию активного спящего режима, подобного используемому в платформе Android; учёт статистики о проблемах с вводом/выводом в Btrfs; возможность проброса SCSI поверх Firewire и USB.
В новую версию принято около 11 тысяч исправлений от более чем 1200 разработчиков, размер патча - 42 Мб (изменения затронули 9631 файлов, добавлено 623283 строк кода, удалено 410731 строк). Около 38% всех представленных в 3.5 изменений связаны с драйверами устройств, примерно 26% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 15% связано с сетевым стеком, 5% - файловыми системами и 5% c внутренними подсистемами ядра.
Наиболее интересные новшества ядра 3.5:
- Дисковая подсистема, ввод/вывод и файловые системы
- В Ext4 добавлена поддержка контрольных сумм для проверки целостности метаданных. Для обеспечения работы новой функции в поле метаданных добавлен новый блок с контрольной суммой crc32 и соответственно изменена структура хранимых на диске метаданных. Контрольные суммы рассчитываются для суперблока, inode, битовых карт блоков, блоков дерева экстентов, htree-узлов, MMP-блоков, директорий и блоков с расширенными атрибутами. Также поддержка контрольных сумм добавлена в инфраструктуру журналирования jbd2 (Journaling block device), что позволит проверять целостность элементов журнала Ext4, а также отдельных коммитов и блоков данных, хранимых в журнале.
Поддержку контрольных сумм можно активировать для существующих разделов через команду "tune2fs -O metadata_csum", а для новых через "mkfs -O metadata_csum", после активации подобной поддержки системы с более старыми ядрами Linux смогут монтировать данные разделы только в режиме чтения. С точки зрения производительности, добавление контрольных сумм не привносит заметной задержки для типичных десктоп и серверных систем. Узким местом является только условия создания и удаления большого числа файлов или интенсивной модификации дерева экстентов, при таком характере нагрузки наблюдается замедление до 20%;
- Поддержка работы SCSI поверх FireWire или USB (поддерживается транспорт BOT (Bulk Only Transport) и UAS (USB Attached SCSI)), что, например, позволяет экспортировать SCSI-устройства на другой хост с использованием FireWire и USB;
- Учёт статистики о проблемах с вводом/выводом в Btrfs. Для каждого диска отслеживаются такие данные как ошибки ввода/вывода, несовпадения контрольных сумм, результаты проверки целостности блоков с метаданными. Накопленную статистику можно посмотреть командой "btrfs device stats", поддержка которой включена в свежие версии пакета btrfs-progs. Из других улучшений Btrfs отмечается интеграция патчей для более оптимальной работы с памятью и увеличения отзывчивости в ситуации большой нагрузки на подсистему ввода/вывода;
- В Tmpfs и подсистему FUSE добавлена поддержка системного вызова fallocate(), обеспечивающего возможность предварительного выделения места под создаваемые приложением файлы, что позволяет гарантировать, что для заданного файла в ФС при любых обстоятельствах хватит места, даже если в процессе создания файла дисковый раздел будет переполнен другими процессами. Использование fallocate позволяет значительно ускорить создание больших файлов, таких как образы виртуальных машин;
- Сетевая подсистема
- Поддержка интерфейса для восстановления TCP-соединений, позволяющего зафиксировать контрольную точку с которой можно возобновить остановленное соединение. Наиболее интересным практическим применением указанной функции является возможность предотвратить разрыв соединений в результате перезагрузки системы или перемещения серверного процесса на другой хост. Например, в системах виртуализации упрощается решение таких задач как миграция работающих процессов с одного сервера на другой, незаметно для приложения на другой стороне соединения;
- Поддержка RFC 5827 (ранняя повторная отправка пакетов) в сетевом стеке, позволяющая увеличить скорость восстановления потока после потери пакетов;
- Интеграция алгоритма управления очередями ожидающих отправки пакетов CoDel (Сontrolled Delay - управляемая задержка), разработанного в рамках инициативы по борьбе с негативным влиянием промежуточной буферизации пакетов (Bufferbloat) сетевым оборудованием;
- Виртуализация и безопасность
Интеграция механизма seccomp filter, принцип работы которого сводится к ограничению доступа к системным вызовам. Важной особенностью seccomp filter является то, что логика выставляемых ограничений задаётся на уровне защищаемого приложения, а не через задание внешних ограничений, как в случае AppArmor или SELinux. В код программы добавляется структура с перечнем допустимых системных вызовов (например, ALLOW_SYSCALL) и реакции в случае несовпадения (например, KILL_PROCESS). Доступ к системным вызовам определяется в виде правил, оформленных в BPF-представлении (Berkeley Packet Filter), которое получило распространение в системах фильтрации сетевых пакетов.
Система seccomp filter позволяет реализовывать достаточно сложные правила доступа, учитывающие передаваемые и возвращаемые аргументы. Программа сама определяет какие системные вызовы ей необходимы и какие параметры допустимы, все остальные системные вызовы блокируются, что позволяет ограничить возможности атакующего в случае эксплуатации уязвимости в защищённом при помощи seccomp приложении. Возможность задания фильтров аргументов позволяет также защититься от большинства атак, эксплуатирующих уязвимости в системных вызовах. Например, выявленные за последние годы критические уязвимости в glibc и ядре Linux, такие как AF_CAN (Архивная копия от 17 февраля 2021 на Wayback Machine), sock_sendpage и sys_tee(недоступная ссылка), успешно блокируются при надлежащем использовании seccomp.
В настоящее время поддержка seccomp filter реализована в таких популярных серверных приложениях, как OpenSSH и vsftpd. Средства для изоляции запускаемых сервисов добавлены в системный менеджер systemd, что позволяет создавать sandbox-окружение для произвольных сервисов, не модифицированных для поддержки seccomp filter. При использовании systemd для помещения процесса в sandbox достаточно в секции "[Service]" указать опцию "SystemCallFilter", в которой перечислить список допустимых системных вызовов. Патчи с поддержкой seccomp filter уже используются в промышленной эксплуатации, например, входят в состав пакета с ядром Linux для дистрибутива Ubuntu 12.04;
- В модуль Yama, разработанный компанией Canonical и используемый в Ubuntu для блокирования некоторых типов атак, добавлены два дополнительных режима для контроля доступа к функциональности PTRACE_ATTACH;
- Память и системные сервисы
- Интеграция чувствительной к активности процессов реализации спящего режима, представляющего собой альтернативу используемой в платформе Android системы блокировок "wakelocks". Добавленный дополнительный механизм блокировок для системы управления питанием позволяет предотвратить переход в спящий режим в ситуациях, когда это недопустимо (например, активен разговор по телефону) и обеспечить временное просыпание в условиях жесткой политики нахождения в спящем режиме, свойственной для мобильных систем. Реализованный подход рассматривает систему как находящуюся постоянно в спящем режиме, в котором энергия тратится только на синхронизацию памяти и поддержание работы некоторых устройств. Активация происходит только в ситуациях, когда возникает необходимость выполнения определённой работы, после завершения которой система возвращается в спящий режим;
- Переработан код планировщика задач для архитектуры NUMA;
- Интеграция кода uprobes (userspace probes), аналога ранее доступной системы kprobes, нацеленного на анализ поведения выполняемых в пространстве пользователя приложений. Uprobes можно использовать для определения узких мест в производительности, накапливать отладочные данные и информацию о времени выполнения разных частей приложения в полностью прозрачном режиме, никаким образом не влияя на работу отслеживаемого процесса. Запустить и остановить сбор данных можно в любой момент, без перезапуска или модификации программы. Изначально реализация uprobes была подготовлена в рамках проекта SystemTap и уже много лет доступна в стандартной поставке Fedora и RHEL.
Для управления uprobes используется стандартная утилита perf, например, выполнение "perf probe -x /lib64/libc.so.6 malloc" приведёт к созданию привязанного к malloc проверочного события, а "perf record -e probe_libc:malloc -agR sleep 1" к ежесекундному накоплению статистики использования вызова malloc в libc, которую можно посмотреть в виде отчета "perf report". Можно создавать несколько проверок, смешивать из с трассировками ядра и вызовами kprobes, просматривать список доступных для привязки функций ("perf probe -F -x /lib64/libc.so.6" или "perf probe -F -x /bin/zsh");
- Реализация системного вызова kcmp() для определения различий между двумя порождёнными одним родителем процессами (сравнение файловых дескрипторов, обработчиков прерываний, адресного пространства и других характеристик);
- Переработка организации ведения логов на уровне ядра. Добавлена поддержка ведения структурированных логов ядра через /dev/kmsg, с поддержкой одновременного чтения несколькими приложениями и возможностью перемещения по логу и повторного чтения элементов в рамках доступного буфера (Например, открыв /dev/kmsg процесс начнёт чтение не с текущего момента, а с начала данных уместившихся в буфере). Переработка вызова printk для отправки данных в виде отдельных буферизированных записей, вместо байтового потока;
- Поддержка таблиц Apple NLS (Native Language Support), необходимых для корректной поддержки файловой системы HFS;
- Реализация режима Frontswap, при котором раздел подкачки может быть размещён в напрямую недоступной памяти, которую невозможно напрямую адресовать и которая не предоставляет оперативной информации о наличии свободного места;
- Добавлена новая опциональная система распределения памяти Contiguous Memory Allocator (CMA), которая оптимизирована на выделение больших непрерывных областей памяти с использованием техники перемещения страниц памяти. Подобное поведение востребовано некоторыми драйверами и подсистемой pagecache;
- Оборудование и аппаратные архитектуры
- Проведена чистка устаревших драйверов, в том числе удалены: драйвер ixp2000 Ethernet, драйверы для карт MCA, sun4c SPARC CPU, netfilter-модуль ip_queue (его заменил nfnetlink_queue), все компоненты поддержки сетей Token ring, поддержка протокола Econet, поддержка процессоров ARMv3 и IXP2xxx (XScale), поддержка плат ST-Ericsson U5500, драйвер последовательных портов Motorola 68360;
- В системе DMA-BUF, предназначенной для организации совместного использования буферов драйверами и различными подсистемами ядра, расширена поддержка интерфейса PRIME, который позволит реализовать возможность бесшовного переключения вывода между разными видеокартами;
- В DRM-драйвере Radeon расширена поддержка новых карт на базе Evergreen GPU и обеспечен вывод звука через HDMI. Существенно увеличена производительность драйверов для GPU семейства Evergreen и Northern Islands (HD5000 и HD6000);
- Обновлен DRM-драйвер для карт Intel, добавление предварительной поддержки процессоров на базе микроархитектуры Haswell и SoC Valley View с новыми процессорами Atom;
- Обеспечена поддержка плат Blackfin BF609, Renesas Armadillo-800 EVA и KZM-A9-GT;
- Поддержка сетевых устройств: WIZnet W5100, W5300, Marvell Avastar 88W8797, Emulex One Connect InfiniBand-over-Ethernet, GCT Semiconductor GDM72xx WiMAX;
- Поддержка USB host-контроллеров: Marvell PXA USB OTG, Broadcom BCMA и SSB, USB-трансивера NXP ISP1301, контроллера периферии NXP LPC32XX;
- Интегрированы драйверы для звуковых карт Creative Sound Core3D и Xonar DGX;
- Добавлены базовые KMS-драйверы для графических чипов ASpeed Technologies 2000 и Matrox G200, а также для карт Cirrus, эмулируемых в Qemu;
Источники
правитьЛюбой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.