В субботу 21 июля Линус Торвальдс объявил о выходе ядра Linux 3.5, которое включает в себя очередную порцию важных изменений. Как и в прошлый раз (3.4), значительная часть из них посвящена улучшению безопасности.
Полный документ со списком изменений выделяет девять основных:
1. Поддержка контрольных сумм для обеспечения целостности метаданных в Ext4. Каждый раз при чтении метаданных вычисляется контрольная сумма и сверяется с указанной. Хранение контрольных сумм относится только к внутренним структурам метаданных, а не к самим данным, и здесь не предусмотрен механизм «самоисцеления». В некоторых случаях из-за реализации новой фичи может страдать производительность, но в обычной работе это не должно быть заметно. Только при массовом создании или удалении файлов замечено падение производительности на 20%.
2. Система анализа поведения приложений uprobes, аналог системы kprobes, позволяет осуществить проверку по любому адресу в работающем приложении и собрать данные, не мешая работе этого приложения. «Пробы» можно запускать динамически для уже работающих программ, не требуется перезапускать программы или модифицировать бинарники. Управление «пробами» осуществляется с помощью perf, systemtap или LTTng.
Пример запуска uprobes вместе с perf для анализа libc's malloc():
$ perf probe -x /lib64/libc.so.6 malloc -> Added new event: probe_libc:malloc (on 0x7eac0)
Просмотр глобального использования malloc по всей системе в течение 1 секунды:
$ perf record -e probe_libc:malloc -agR sleep 1
Результат можно посмотреть в интерфейсе TUI с помощью команды $ perf report
или в текстовом виде с помощью $ perf report -g flat --stdio
.
Если вы не знаете, какую функцию хотите исследовать, то можно вывести всех функций, доступных для «пробирования»:
$ perf probe -F -x /lib64/libc.so.6
или
$ perf probe -F -x /bin/zsh
3. Фильтрация системных вызовов seccomp (secure computing). Механизм песочницы seccomp появился в 2.6.12, он предусматривал, что приложение не может делать системных вызовов, кроме нескольких: exit, sigreturn, read и write в открытый файл. Сейчас песочница доработана: реализована система, которая позволяет устанавливать произвольный список запрещённых вызовов. Например, это нужно для Linux-порта браузера Chromium, который запускает плагины в песочнице.
4. Управление очередью пакетов CoDel (controlled delay) для борьбы с задержками в результате излишней буферизации (bufferbloat). Реализация этих алгоритмов является кульминацией научной работы, продолжавшейся 14 лет.
5. Функция приостановки TCP-соединения и восстановления уже на другом хосте. Благодаря этой функции облегчается миграция виртуальных машин с одного хоста на другой с работающими процессами, незаметно для приложений.
6. Поддержка TCP Early Retransmit (RFC 5827): ранняя повторная отправка пакетов в сетевом стеке. Благодаря этому стандарту ускоряется восстановление потока после потери пакетов.
7. «Активный сон» в стиле Android. Наиболее спорное нововведение в ядре Linux. Как известно, в системе Android реализован специфический режим энергосбережения с помощью suspend-блокеров или "wakelocks". Это часть общей логики, когда нормальное состояние системы — это спящее состояние, и она просыпается только в случае появления активных процессов, после чего опять засыпает. Вокруг этих suspend-блокеров в сообществе разработчиков ядра Linux разгорелись яростные войны, и в конце концов было решено всё-таки внедрить функцию “autosleep and wake locks”, которая практически аналогична по функциональности wakelocks. Предполагается, что операционная система Android сможет использовать эту функцию, так что станет меньше проблем со слиянием драйверов.
8. Улучшения в файловой системе Btrfs: улучшение производительности при синхронном вводе-выводе, сбор статистики об ошибках I/O, CRC-ошибках, а также другие улучшения.
9. SCSI поверх FireWire и USB: драйвер для использования соединения IEEE-1394 в качестве транспорта для SCSI, аналог Firewire Target Disk Mode на многих компьютерах Apple. В ядре есть драйвер для такого же процесса по USB: поддерживаются протоколы BOT (Bulk Only Transport) и UAS (USB Attached SCSI) для USB 2.0 и USB 3.0.
Вдобавок, Линус объявил об открытии окна приёма патчей для следующей версии ядра 3.6, но попросил при этом тех разработчиков, которые собираются в августе в отпуск, не присылать патчи для 3.6., после чего исчезать на несколько недель, а лучше подождать и прислать патчи уже для 3.7. «И если [количество изменений в] 3.6 будет меньше обычного из-за отпусков, это нормально», — добавил Линус.