Компиляция ядра Linux, оптимизированного под процессор
Все действия производились на ubuntu 9.10
Во первых, для чего может понадобиться компиляция ядра в таком совершенном дистрибутиве как 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-шника (00, 01 - отсутствие оптимизации и маленькая оптимизация, маленький размер ехе, 03 - жёсткая оптимизация, большой размер ехе) Вообще не факт, что с оптимизацией 03 везде будет работать быстрее, большой размер получаемой в итоге программы ставит повышенные требования к быстродействию подсистемы памяти.
Это переменные окружения, и что бы они сохранились в системе после перезагрузки надо их поместить в .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, и поставит новое ядро во главу списка, теперь можем перезагружаться в систему с новым ядром!
Обновлено 13.03.2011 00:30
Автор: andrewlap
Источник: http://www.comeinadmin.ru/article/compile-kernel-linux.html