Компиляция ядра в Debian Squeeze
Добавлено: 27 сен 2012, 12:12
Общие положения
Прежде чем переходить на новоя ядро, следует взвесить все "за" и "против": стандартное ядро в дистрибутиве выбирается исходя из совместимости с широко-распространённым железом, программными пакетами, используемыми библиотеками и компилятором. Может случиться так, что программное обеспечение из пакетов не будет работать на новом ядре. В этом случае лучше поискать патч, устраняющий ту или иную ошибку, и пропатчить существующую версию ядра. Тоже относится к включению поддержки новых сетевых драйверов. Если же вариант с перекомпиляцией существующей версии ядра не устраивает, или есть возможность поставить новое программное обеспечение для исключения зависимости от ядра, тогда смело можете браться за установку нового ядра.
Выбор версии
В любом linux-дистрибутиве есть границы использования той или иной версии ядра. Определяются они стандартными Си-библиотеками и компилятором используемым в системе. Приложения тоже зависят от библиотек и компилятора, поэтому граница в некоторых случаях может быть преодолена только переходом на более свежую версию дистрибутива.
Подготовка
Соберите информацию о новом ядре
Не будет лишним, собрать информацию о ядре, версию которого Вы собираетесь ставить. Почитайте change-логи на предмет исправленных ошибок и включения кода новых драйверов.
Подготовьте установщик драйвера и документацию
Если у Вас стоит аппаратный драйвер nVidia, для нового ядра его придётся переустановить, поэтому подготовьте инструкцию по установке драйвера в печатном виде. Также следует скачать бинарник драйвера и положить где-нибудь в домашнем каталоге, чтобы после успешной компиляции и установки нового ядра, можно было без проблем переустановить драйвер, поскольку старый драйвер на новом ядре не заработает и иксы Вы не запустите.
Предварительно рассмотрите альтернативы после перехода на новое ядро
Как уже говорилось выше - возможны несовместимости программных пакетов с новым ядром.
Процесс
Шаг 1. Выбор пространства для сбоки
Выбираем раздел\каталог с достаточным объёмом свободного места. Достаточным является объём как минимум в 3 раза больший, чем объём занимаемый исходниками. Например ядро 2.6.39 в tar.bz2-архиве занимает 74Мб. Распакованный из bzip2 в tar занимает уже 440Мб. Для компиляции, автору хватило каталога (раздела) в котором было 6Гб свободного места.
Обычно, в качестве каталога выбирают /usr/src, но можно выбрать и другой, лишь бы не /tmp (он очищается после каждой перезагрузки) и обладающий достаточным свободным объёмом.
Шаг 2. Установка необходимых пакетов
Доустанавливаем необходимые пакеты вместе с зависимостями:
mc, tar, buzip2, gcc, libc6-dev, binutils, make, module-init-tools, fakeroot, ncurses-base, libncurses5-dev, procps, build-essential, kernel-package
mc - он же Midnight Commander, пригодится для работы с файлами и редактирования конфигов.
Можно произвести установку через synaptic или в консоли:
# apt-get install tar bzip2 gcc libc6-dev binutils make module-init-tools fakeroot ncurses-base libncurses5-dev procps build-essential kernel-package
Шаг 3. Получение исходных кодов ядра
# aptitude install linux-source-2.6.32
или
Скачиваем ядро с http://www.kernel.org/ и ложим в выбранный каталог. Пускай это будет /usr/src .
Распаковываем ядро:
# bunzip2 linux-2.6.39.1.tar.bz2
# tar -xvf linux-2.6.39.1.tar
В итоге должен получиться каталог: /usr/src/kernel-2.6.39.1 , содержащий документацию и исходные коды.
Шаг 4. Конфигурирование ядра
Лучшим способом сконфигурировать ядро перед компиляцией, является использование уже существующего конфига и правка опций в нём.
Выясняем, какая версия ядра работает в текущий момент:
$ uname -r
2.6.32-5
Ядро версии 2.6.32-5. Значит конфиг должен обзываться config-2.6.32-5-686 или config-2.6.32-5 .
С помощью Midnight Commander`а скопируем конфиг из /boot в /usr/src/kernel-2.6.39.1/ и переименуем в .config
Запускаем конфигуратор ядра:
# cd /usr/src/kernel-2.6.39.1
# make menuconfig
С помощью графического конфигуратора можно отключить или задействовать в виде модулей или встроить в ядро, необходимый код. Предполагается, что пользователь должен ориентироваться что включать, а что отключать.
Выбираем пункт "Load an Alternate Configuration File" и загружаем для правки файл .config , который мы скопировали в текущий каталог.
После конфигурирования, выбираем пункт "Save an Alternate Configuration File" и сохраняем конфиг с тем же именем .config
Шаг 5. Компиляция ядра
Итак, запаситесь терпением (а также чаем, кофем
, долгожданная компиляция:
Здесь, параметр --initrd даёт команду компилятору создать образ виртуальной файловой системы и поместить его в deb-файл для дальнейшей установки ядра через apt. Если не задать этот параметр, то придётся создавать и устанавливать образ вручную.
Процесс компиляции может занять от 4-х часов на Pentium-III до 40...50 минут на Pentium-IV.
Nuvola apps important yellow.svg
Внимание!
Помните, что процесс компиляции должен пройти без ошибок и до конца!
Причин, по которым ядро не собирается достаточно много, но ядро должно собраться, так если СКОМПИЛИРОВАТЬСЯ БЕЗ ОШИБОК. Если оно не собирается - в зависимости от сообщений компилятора об ошибках: меняйте конфигурацию ядра, версию ядра или компилятор.
Если процесс завершился с выдачей ошибки - скопируйте текст ошибки или экран и попробуйте в сети Интернет по искать подобные случаи и устранить причину ошибки.
Для запуска повторной компиляции, необходимо очистить все переменные и удалить модули:
# make clean
, только затем повторить попытку:
# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
Шаг 6. Установка ядра
После успешной компиляции, в каталоге выше будет создан файл .deb-пакета ядра, который нужно будет установить стандартными средствами debian:
# dpkg -i /usr/src/linux-image-2.6.39.1_1.0_i386.deb
В итоге инсталлятор:
поместит само ядро в /boot в виде файла /boot/vmlinuz-2.6.39.1,
поместит образ initrd туда же,
недостающие библиотеки поместит по каталогам системы (/lib/modules/2.6.39.1),
настроит загрузчик на использование нового ядра, о чем будет свидетельствовать новая строка в меню загрузчика.
На этом, установку ядра можно считать завершённой и смело можно перейти к опробованию - Шаг 7.
Шаг 7. Опробование
Перезагружаем машину и пробуем загрузиться с нового ядра. Если загрузка прошла успешно, смотрим логи:
/var/log/syslog
/var/log/kernel
/var/log/dmesg
, на предмет ошибок. В зависимости от наличия таковых - перезагружаемся и выбираем старое ядро. Идём в Интернет и ищем описание ошибок, после чего либо повторяем процесс компиляции с добавлением патчей или меням версию ядра. Если ошибок нет - тестируем те условия, при которых машина зависала на старом ядре, при этом посматривая в логи и если ядро устраивает, пробуем ставить аппаратные драйвера для видеокарты.
В случае, если ядро не стартовало - делаем снимок экрана на мобильник или записываем вывод, перезагружаемся, выбираем рабочее ядро, загружаем операционную систему и в Интернете ищем решения проблемы.
Некоторые примечания
Команды начинающиеся с:
# - нужно вводить от имени root`а.
$ - можно вводить от имени обычного пользователя.
На всякий случай, перед компиляцией ядра, сделайте резервную копию каталога /boot :
# cp -r /boot /boot.bak
При случайном удалении рабочего ядра или образа initrd, всегда можно будет восстановить из бэкапа.
Шаги с 5...8 выполнялись автором через учётную запись root , поскольку операции производись на домашнем компьютере и автор уверен в своих действиях.
Если Вы собираетесь компилировать ядро в каталоге /usr/lib , помните, что права на этот каталог по умолчанию не разрешают запись обычным пользователям, поэтому из под root`a можно изменить права на доступ к каталогу или работать от имени root`а.
Прежде чем переходить на новоя ядро, следует взвесить все "за" и "против": стандартное ядро в дистрибутиве выбирается исходя из совместимости с широко-распространённым железом, программными пакетами, используемыми библиотеками и компилятором. Может случиться так, что программное обеспечение из пакетов не будет работать на новом ядре. В этом случае лучше поискать патч, устраняющий ту или иную ошибку, и пропатчить существующую версию ядра. Тоже относится к включению поддержки новых сетевых драйверов. Если же вариант с перекомпиляцией существующей версии ядра не устраивает, или есть возможность поставить новое программное обеспечение для исключения зависимости от ядра, тогда смело можете браться за установку нового ядра.
Выбор версии
В любом linux-дистрибутиве есть границы использования той или иной версии ядра. Определяются они стандартными Си-библиотеками и компилятором используемым в системе. Приложения тоже зависят от библиотек и компилятора, поэтому граница в некоторых случаях может быть преодолена только переходом на более свежую версию дистрибутива.
Подготовка
Соберите информацию о новом ядре
Не будет лишним, собрать информацию о ядре, версию которого Вы собираетесь ставить. Почитайте change-логи на предмет исправленных ошибок и включения кода новых драйверов.
Подготовьте установщик драйвера и документацию
Если у Вас стоит аппаратный драйвер nVidia, для нового ядра его придётся переустановить, поэтому подготовьте инструкцию по установке драйвера в печатном виде. Также следует скачать бинарник драйвера и положить где-нибудь в домашнем каталоге, чтобы после успешной компиляции и установки нового ядра, можно было без проблем переустановить драйвер, поскольку старый драйвер на новом ядре не заработает и иксы Вы не запустите.
Предварительно рассмотрите альтернативы после перехода на новое ядро
Как уже говорилось выше - возможны несовместимости программных пакетов с новым ядром.
Процесс
Шаг 1. Выбор пространства для сбоки
Выбираем раздел\каталог с достаточным объёмом свободного места. Достаточным является объём как минимум в 3 раза больший, чем объём занимаемый исходниками. Например ядро 2.6.39 в tar.bz2-архиве занимает 74Мб. Распакованный из bzip2 в tar занимает уже 440Мб. Для компиляции, автору хватило каталога (раздела) в котором было 6Гб свободного места.
Обычно, в качестве каталога выбирают /usr/src, но можно выбрать и другой, лишь бы не /tmp (он очищается после каждой перезагрузки) и обладающий достаточным свободным объёмом.
Шаг 2. Установка необходимых пакетов
Доустанавливаем необходимые пакеты вместе с зависимостями:
mc, tar, buzip2, gcc, libc6-dev, binutils, make, module-init-tools, fakeroot, ncurses-base, libncurses5-dev, procps, build-essential, kernel-package
mc - он же Midnight Commander, пригодится для работы с файлами и редактирования конфигов.
Можно произвести установку через synaptic или в консоли:
# apt-get install tar bzip2 gcc libc6-dev binutils make module-init-tools fakeroot ncurses-base libncurses5-dev procps build-essential kernel-package
Шаг 3. Получение исходных кодов ядра
# aptitude install linux-source-2.6.32
или
Скачиваем ядро с http://www.kernel.org/ и ложим в выбранный каталог. Пускай это будет /usr/src .
Распаковываем ядро:
# bunzip2 linux-2.6.39.1.tar.bz2
# tar -xvf linux-2.6.39.1.tar
В итоге должен получиться каталог: /usr/src/kernel-2.6.39.1 , содержащий документацию и исходные коды.
Шаг 4. Конфигурирование ядра
Лучшим способом сконфигурировать ядро перед компиляцией, является использование уже существующего конфига и правка опций в нём.
Выясняем, какая версия ядра работает в текущий момент:
$ uname -r
2.6.32-5
Ядро версии 2.6.32-5. Значит конфиг должен обзываться config-2.6.32-5-686 или config-2.6.32-5 .
С помощью Midnight Commander`а скопируем конфиг из /boot в /usr/src/kernel-2.6.39.1/ и переименуем в .config
Запускаем конфигуратор ядра:
# cd /usr/src/kernel-2.6.39.1
# make menuconfig
С помощью графического конфигуратора можно отключить или задействовать в виде модулей или встроить в ядро, необходимый код. Предполагается, что пользователь должен ориентироваться что включать, а что отключать.
Выбираем пункт "Load an Alternate Configuration File" и загружаем для правки файл .config , который мы скопировали в текущий каталог.
После конфигурирования, выбираем пункт "Save an Alternate Configuration File" и сохраняем конфиг с тем же именем .config
Шаг 5. Компиляция ядра
Итак, запаситесь терпением (а также чаем, кофем

Код: Выделить всё
# make-kpkg clean
# fakeroot make-kpkg -j16 --initrd --revision=custom.1.0 kernel_image
или например для lustre с применение патча
#make-kpkg --rootcmd fakeroot --added-patches=lustre --initrd --append-to-version "-lustre-1.6.5.1" --revision=yyyymmdd kernel_image
Здесь, параметр --initrd даёт команду компилятору создать образ виртуальной файловой системы и поместить его в deb-файл для дальнейшей установки ядра через apt. Если не задать этот параметр, то придётся создавать и устанавливать образ вручную.
Процесс компиляции может занять от 4-х часов на Pentium-III до 40...50 минут на Pentium-IV.
Nuvola apps important yellow.svg
Внимание!
Помните, что процесс компиляции должен пройти без ошибок и до конца!
Причин, по которым ядро не собирается достаточно много, но ядро должно собраться, так если СКОМПИЛИРОВАТЬСЯ БЕЗ ОШИБОК. Если оно не собирается - в зависимости от сообщений компилятора об ошибках: меняйте конфигурацию ядра, версию ядра или компилятор.
Если процесс завершился с выдачей ошибки - скопируйте текст ошибки или экран и попробуйте в сети Интернет по искать подобные случаи и устранить причину ошибки.
Для запуска повторной компиляции, необходимо очистить все переменные и удалить модули:
# make clean
, только затем повторить попытку:
# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
Шаг 6. Установка ядра
После успешной компиляции, в каталоге выше будет создан файл .deb-пакета ядра, который нужно будет установить стандартными средствами debian:
# dpkg -i /usr/src/linux-image-2.6.39.1_1.0_i386.deb
В итоге инсталлятор:
поместит само ядро в /boot в виде файла /boot/vmlinuz-2.6.39.1,
поместит образ initrd туда же,
недостающие библиотеки поместит по каталогам системы (/lib/modules/2.6.39.1),
настроит загрузчик на использование нового ядра, о чем будет свидетельствовать новая строка в меню загрузчика.
На этом, установку ядра можно считать завершённой и смело можно перейти к опробованию - Шаг 7.
Шаг 7. Опробование
Перезагружаем машину и пробуем загрузиться с нового ядра. Если загрузка прошла успешно, смотрим логи:
/var/log/syslog
/var/log/kernel
/var/log/dmesg
, на предмет ошибок. В зависимости от наличия таковых - перезагружаемся и выбираем старое ядро. Идём в Интернет и ищем описание ошибок, после чего либо повторяем процесс компиляции с добавлением патчей или меням версию ядра. Если ошибок нет - тестируем те условия, при которых машина зависала на старом ядре, при этом посматривая в логи и если ядро устраивает, пробуем ставить аппаратные драйвера для видеокарты.
В случае, если ядро не стартовало - делаем снимок экрана на мобильник или записываем вывод, перезагружаемся, выбираем рабочее ядро, загружаем операционную систему и в Интернете ищем решения проблемы.
Некоторые примечания
Команды начинающиеся с:
# - нужно вводить от имени root`а.
$ - можно вводить от имени обычного пользователя.
На всякий случай, перед компиляцией ядра, сделайте резервную копию каталога /boot :
# cp -r /boot /boot.bak
При случайном удалении рабочего ядра или образа initrd, всегда можно будет восстановить из бэкапа.
Шаги с 5...8 выполнялись автором через учётную запись root , поскольку операции производись на домашнем компьютере и автор уверен в своих действиях.
Если Вы собираетесь компилировать ядро в каталоге /usr/lib , помните, что права на этот каталог по умолчанию не разрешают запись обычным пользователям, поэтому из под root`a можно изменить права на доступ к каталогу или работать от имени root`а.