|
Все действия подойдут на для 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, и поставит новое ядро во главу списка, теперь можем перезагружаться в систему с новым ядром!
|
Комментарии
Для создания конфигурационно го файла запущенного в данный момент ядра я использую команду
zcat /proc.config.gz > /usr/src/linux/.config
P.S. Возможно, способ, предложенный вами, работает в Ubuntu, но я сильно сомневаюсь.
В Ubuntu при установке ядра в /boot/ копируется также и конфиг.
Действительно, при обновлении ядра эта команда берёт старый конфиг, и на основе его создаёт новый с добавлением новых параметров (а может make menuconfig это делает непомню) обновление, а тут речь про компиляцию текущего ядра, и новые опции тут не добавляются.
Это вам пожалуйста в проект gentoo или arch
Да я там был (в Gentoo), пока меня не взломали хакеры какие то - машина стала слать какой то дикий трафик по определённому адресу, тогда я решил, что стабильность тоже важна и пересел на debian - там пакеты тчательно тестируются и латаются дыры в безопасности. Ещё в gentoo был такой глюк - почему то firefox откопиленный из исходников со всеми оптимизациями безбожно тормозил, тогда как взятый из бинарника работал нормально, поэтому возникли сомнения в этой хвалёной оптимизации