Установка, настройка, обслуживание, техподдержка
серверов, сетевого оборудования, АТС, Linux в Нижнем Новгороде
Так же вы можете посмотреть или добавить события.
Компиляция ядра Linux, оптимизированного под процессор
Автор: wessenhizer   
20.11.2010 22:26

Все действия подойдут на для ubuntu 9.10 - 10.10, а так же и для других современных debian-based дистрибутивов

Во первых, для чего может понадобиться компиляция ядра в таком совершенном дистрибутиве как ubuntu? (вместо ubuntu подставь свой любимый дистрибутив) Потому что разработчики дистрибутивов ориентируются на широкий спектр процессоров, на котором будет работать ubuntu, поэтому ядро, которое идёт в дистрибутиве имеет индекс i386, то ест должно работать на процессорах от I80386 до самого последнего из данной архитектуры, они же не в курсе, что ты поставил ubuntu на свой core-duo! А я, например хочу выжимать из своего Celeron 3.06G всё что можно! Поэтому мы будем оптимизировать ядро под наш процессор. В идеале оптимизировать нужно все приложения, как это делают в Gentoo, но мы будем оптимизировать наиболее важные, и начнём с ядра.
Итак, поехали.
Для начала закачаем исходники ядра из дистрибутива

aptitude install linux-source-2.6

и заголовочные файлы

aptitude install linux-headers

Установим утилиты для компиляции ядра

aptitude install build-essential kernel-package libncurses-dev

Полученное ядро нужно распаковать:

cd /usr/src/
tar -xjf linux-source-*

Затем нужно выставить опции компиляции для gcc c оптимизацией под ваш процессор. Для Intel процессоров опции можно найти здесь. Так же начиная с GCC версии 4.2 можно указать опцию -march=native, тогда GCC автоматически определит оптимальные настройки для вашего процессора. Так давайте же и мы воспользуемся этой замечательной возможностью. Так же рекомендуется добавлять опции "-pipe -fomit-frame-pointer".
В итоге вот какие опции у нас получаются:

CHOST="i686-pc-linux-gnu"
CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"

CFLAGS
- опции для С программ
CXXFLAGS - опции для C++ программ
-march - это архитектура процессора (в нашем случае определяется автоматически)
-O2 - это средняя оптимизация кода - компромис между быстродействием и объемом получаемого exe-шника (O0, O1 - отсутствие оптимизации и маленькая оптимизация, маленький размер ехе, O3 - жёсткая оптимизация, большой размер ехе) Вообще не факт, что с оптимизацией O3 везде будет работать быстрее, большой размер получаемой в итоге программы ставит повышенные требования к быстродействию подсистемы памяти.

Это переменные окружения, и что бы они сохранились в системе после перезагрузки надо их поместить в .bashrc файл пользователя, который будет компилировать. Я помещаю их в .bashrc своего пользователя и root, на случай если мне вздумается компилировать от рута. В конец .bashrc этих пользователей добавляем:

export CHOST="i686-pc-linux-gnu"
export CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer"
export CXXFLAGS="${CFLAGS}"


Для вступления в силу изменений надо заново зайти пользователем, так как компиляция будет происходить в консоли, и в GUI нам эти параметры не нужны, достаточно просто открыть новую консоль.
Теперь все программы, которые мы будем компилировать, будут заоптимизированы согласно этим опциям. Теперь можно переходить непосредственно к компиляции ядра.
Все опрерации с ядром производятся в корне папки с исходниками ядра, поэтому недолго думая переходим туда:

cd /usr/src/linux-source-*

Создадим файл конфигурации текущего ядра командой

make oldconfig

Эта команда создаст файл .config, где будут указаны опции ядра, используемого в данной системе. Эти настройки будут основой для наших настроек. Приступим к конфигурации ядра:

make menuconfig

С помощью этой утилиты указываем необходимые нам опции.
Обращаю ваше внимание на следующую опцию:
Processor type and features ---> Processor family
Здесь выбираем свой процессор. Остальные опции, которые мы взяли из ядра идущего с дистрибутивом вполне работоспособны для большинства применений, поэтому изменяйте их по своему усмотрению, или оставляйте как есть.
Далее, выполним команду, которая удалит файлы (если они имеются), оставшиеся от предыдущей компиляции:

make-kpkg clean

Далее компилируем ядро командой:

nice -n 19 make-kpkg --initrd --append-to-version=-mykernel kernel_image kernel_headers

nice -n 19
понизит приоритет компиляции на 19 пунктов
Ключ -append-to-version используется, чтобы добавить к имени файла образа ядра, который мы получим после компиляции, строку -mykernel, чтобы было проще идентифицировать свое ядро.
И, через несколько минут/часов или может у кого то и дней, мы получим оптимизированное для нашей архитектуры ядро. У меня на Celeron 3.06GHz это заняло два с половиной часа.
Если всё пройдёт удачно, в итоге в /usr/src/ мы получим два deb пакета linux-headers-*.deb и linux-image-*.deb, которые мы устанавливаем в систему:

dpkg -i linux-headers-*.deb linux-image-*.deb

Установщик так же обновит конфиг grub, и поставит новое ядро во главу списка, теперь можем перезагружаться в систему с новым ядром!

 

Комментарии 

 
+1 #1 kventin 02.04.2011 17:12
Ядро это ещё не вся система, вот если бы откомпилировать ещё glibc и другие основные либы, тогда бы больше было бы смысла
Цитировать
 
 
0 #2 Lupo Alberto 02.04.2011 19:55
Вы уверены, что команда make oldconfig создаёт конфигурационны й файл текущего ядра? IMHO, при обновлении ядра она сравнивает вновь появившиеся опции с уже имеющимся конфигурационны м файлом /usr/src/linux/.config
Для создания конфигурационно го файла запущенного в данный момент ядра я использую команду
zcat /proc.config.gz > /usr/src/linux/.config

P.S. Возможно, способ, предложенный вами, работает в Ubuntu, но я сильно сомневаюсь.
Цитировать
 
 
0 #3 wessenhizer 02.04.2011 20:25
Сейчас проверил в своей системе - make oldconfig скопировал из /boot/ конфиг
В Ubuntu при установке ядра в /boot/ копируется также и конфиг.
Действительно, при обновлении ядра эта команда берёт старый конфиг, и на основе его создаёт новый с добавлением новых параметров (а может make menuconfig это делает непомню) обновление, а тут речь про компиляцию текущего ядра, и новые опции тут не добавляются.
Цитировать
 
 
0 #4 wessenhizer 02.04.2011 20:30
Цитирую kventin:
Ядро это ещё не вся система, вот если бы откомпилировать ещё glibc и другие основные либы, тогда бы больше было бы смысла

Это вам пожалуйста в проект gentoo или arch
Цитировать
 
 
0 #5 kventin 03.04.2011 16:43
Цитирую wessenhizer:
Это вам пожалуйста в проект gentoo или arch


Да я там был (в Gentoo), пока меня не взломали хакеры какие то - машина стала слать какой то дикий трафик по определённому адресу, тогда я решил, что стабильность тоже важна и пересел на debian - там пакеты тчательно тестируются и латаются дыры в безопасности. Ещё в gentoo был такой глюк - почему то firefox откопиленный из исходников со всеми оптимизациями безбожно тормозил, тогда как взятый из бинарника работал нормально, поэтому возникли сомнения в этой хвалёной оптимизации
Цитировать
 

Добавить комментарий

Задайте здесь свой вопрос или прокомментируйте пост.