Archlinux, ванильное ядро, AppArmor и RT. Ветка 3.0.

О том как нужно правильно собирать ядро ходит легенд очень немало. Но вот майнтейнеры Archlinux походу не особо суеверны и потому в репозиториях всегда самое новое ядро с очень скудным набором патчей. Оно возможно и правильно ибо любое улучшение может принести с собой и глюки. Но когда дело доходит до установки некоторых очень важных вещей, то могут возникнуть трудности, причём очень много.

Очень полезным на компе может оказаться AppArmor. Для тех, хто в танке обьясняю: это такая система безопасности, которая раздаёт права на запускаемые программы. Если для программы создан профиль, то AppArmor запрещает всё, что не разрешено явно. Таким образом можно защитится, от скомпрометированих программ с дырами, чтобы злоумышленник их посредством не мог получить получить доступ к Вашим данным. Где это надо? Ну возможно на серверах. Но на рабочем компьютере тоже не помешает. Пример: многими юзаемый Skype. При запуске он почему-то читает всю домашнюю папку .mozilla. Причём всю. Что он там ищет - неясно. Ясно что для его работы она не нужна. Будучи откровенными параноиками мы защитимся от такого ;) Прелестью AppArmor является явное превосходство на дисретной системой доступа. Даже запуская программу из под рута, мы не можем её обойти. Вот только сам AppArmor - это теперь типа часть ядра, которую нужно настраивать... И вот чтобы её настроить нужно наложить пару патчей на ядро.

Дополнение RT, реализирующее режим реального времении не есть обязательным, но мне пригодилось, потому и пишу.

Конечно сначала RT не использовал, а AppArmor добавлял путём доработки PKGBUILD из ABS. Это было ядро Linux 3.1.5. Хорошо что сам PKGBUILD написан по человечески - так, что нужно просто записать альтернативную версию, и дописать какие надо патчи и можно собирать. Потратил два часа но собрал... Оно даже заработало, но как-то вечерком смторел кино и ВНЕЗАПНО - Kernel Panic. Перегрузил, забил на это... Но когда это повторилось...

Но ядро в официальном репозитории уже обновилось, очевидно что не просто так... видимо баги были и ещё какая то бадяга. Теперь бы надо было бы опять собирать. Но к месту вспомнил о Gentoo, и о том как ядро ставится там. Просто ставятся исходники, а мы их уже настраиваем и компиляем. Для Archlinux никто не мешает сделать так же. При этом имеем такие преимущества:

  • Возможность скомпилировать ядро под себя, по свою машину
  • Уменьшение времени компиляции за счёт первого пункта

В принципе первый пункт очень даже можно реализовать и с PKGBUILD'ом, но это всё морока. А то, что на сборку ядра уйдёт не 2 часа, а 40 минут - это ощутимый аргумент. На практике проверил - проще скачать, пропатчить и скомпилять, чем готовить PKGBUILD, отлаживать его и т.п. Тем более если такое ядро нужно только мне, то как то смысла готовить его для публикации в AUR нету.

Чтобы более быть уверенным в стабильности ядра, решил откатится до ветки 3.0. Она тогда ещё была в версии 3.0.14. А сейчас уже 3.0.22. Как я понимаю они там просто баги фиксят, новых глюков не добавляют.

Итак, на момент написания этой статьи мы используем такие версии ПО: Linux 3.0.22, AppArmor 2.7.2, RT-37.

Ядро берём на официальном архиве: kernel.org. Где-то 62 МБ скачать - это мелочь. AppArmor берем с launchpad. RT патч лежит не недалеко от ядра - на kernel.org.

Скачав всё это можно приступать. Во первых распакуем исходники ядра. Невзирая на то, что компилировать что-то от имени рута опасно и бла-бла-бла, распакуем их в /usr/local/src:

# cd /usr/local/src/
# tar -xvf /home/maxwel/Download/linux-3.0.22.tar.xz
# cd linux-3.0.22/

Теперь пропатчим. Начнём с AppArmor. Нужные нам патчи лежат в скаченном архиве в подпапке apparmor-2.7.2/kernel-patches/3.0/. Архив мы просто распакуем куда-нибудь, это неважно. Нужно наложить три патча из указанной папки в пронумерованном порядке:

# patch -p1 < /home/maxwel/Download/apparmor-2.7.2/kernel-patches/3.0/0001-AppArmor-compatibility-patch-for-v5-network-controll.patch
# patch -p1 < /home/maxwel/Download/apparmor-2.7.2/kernel-patches/3.0/0002-AppArmor-compatibility-patch-for-v5-interface.patch
# patch -p1 < /home/maxwel/Download/apparmor-2.7.2/kernel-patches/3.0/0003-AppArmor-Allow-dfa-backward-compatibility-with-broke.patch

Один есть. Теперь RT. Там всего один патч, сжатый в xz. Не проблема, накладываем и его.

# xzcat /home/maxwel/Download/patch-3.0.22-rt37.patch.xz | patch -p1

Теперь можно конфигурировать и собирать, но надо немного притормозить. После такого патчинга в прошлой версии у меня отказался собираться драйвер на Wi-Fi. По тексту ошибки я так понял, что проблема в том, что драйвер не GPL, а связующие символы в экспорте как GPL. А драйвер то не простой, а гибридный. Напополам он закрыти он и вправду не GPL. Вообще у Broadcom интересный подход к дровам. Кстати инфа про устройства поддержки сети (Wi-Fi второй):

$ lspci | grep -i net
09:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8040 PCI-E Fast Ethernet Controller (rev 12)
0b:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g LP-PHY (rev 01)

Но видимо люди уже с этим развлекались, на каком-то форуме написали, что надо просто в наглую заменить EXPORT_SYMBOL_GPL на EXPORT_SYMBOL в коде ядра, точнее в тех его частях, на которые ругается... Так и сделал, по быстрому сварганил патч. Накладывал его так же как и все остальные. Но это так для себя ибо если у Вас Wi-Fi от Intel, то скорее всего этого делать не придется. Насчёт Atheros даже не знаю. Во вском случае надо это иметь ввиду.

Теперь можно запускать конфигурацию:

# make menuconfig

Конфигурируем как захотим под себя. Надо только обязательно сделать следующее:

  • Processor type and features -> Preemption Model выбрать Fully Preemptible kernel (RT), чтобы активировать RT
  • Включить Security Options -> AppArmor support, собственно включаем AppArmor
  • Security Options -> AppArmor support -> AppArmor boot parameter default value установить в 1, это даёт автоматический подьём AppArmor при загрузке
  • Включить Security Options -> AppArmor support -> Enable AppArmor 2.4 compatibility, это чтобы все утилиты работали
  • Security Options -> Default security module установить в AppArmor, выбираем AppArmor как модуль безопосности

Всякие TOMOYO Linux и SELinux в секции Security Options желательно поотключать.

Собираем:

# make

Можно пойти погулять. Когда соберётся, ставим модули:

# make modules_install

Само ядро же лежит arch/x86/boot/bzImage. Копируем к ядрам, тоесть в папку /boot. Прописываем его в GRUB (ну или в LILO, каждому своё). Грузимся и юзаем))

На случай если пригодится:

Патч для совместимости с broadcom wl

Конфиг ядра для моего Dell Inspiron 1525