Поиск по этому блогу

пятница, 23 октября 2009 г.

Настройка проприетарных драйверов ATI под Debian, Linux 2.6.27.4, ATI driver installer 8.10, Debian/Lenny

Это просто копия моей-же статьи с linuxforum.ru.


Хочу поделиться с сообществом своим опытом в настройке проприетарных драйверов от ATI. Все дело в том, что на момент начала моей "борьбы" с этими драйверами более-менее современного описания найдено не было, а те рецепты которые были найдены, в частности, на этом форуме не дали полного и вразумительного ответа. Поэтому и родилась мысль поделиться опытом. Как оказалось - все более чем просто! Надо лишь знать в какую сторону копать.
Итак, поехали...

Карточка у меня оказалась достаточно древняя (это рабочий десктоп, как ни как):
$ lspci | grep ATI
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 [Sapphire X550 Silent]
01:00.1 Display controller: ATI Technologies Inc RV370 secondary [Sapphire X550 Silent]
А сайта AMD ATI были взяты последние драйвера для моей карточки ati-driver-installer-8-10-x86.x86_64.run.

Предчувствие меня не обмануло и, как и ожидалось, простой запуск на исполнение послал меня, выдав ошибку при компиляции. С этого момента начались мытарства в поисках нужного ответа, часть которого была найдена тут mczim-debian.blogspot.com и, да простит меня русскоязычная часть форумчан, тут www.debian-administration.org.ua. Скажу сразу, что хоть и в первом, и во втором случае эти рецепты ранее были признаны рабочими, но в моём случае они к успеху не привели. Но тем не менее - это очень правильные рецепты.

Теперь по-порядку, к чему свелись мои действия из этих двух рецептов:
$ chmod +x ati-driver-installer-8-10-x86.x86_64.run

Получим список поддерживаемых платформ для сборки драйверов:
$ ./ati-driver-installer-8-10-x86.x86_64.run --listpkg

Мне повезло, так как Debian/lenny в этом списке присутствовал. Ура. Следующий шаг тоже особых усилий не требует:
$ sudo ./ati-driver-installer-8-10-x86.x86_64.run --buildpkg Debian/lenny

Ждем. После завершения у нас появляются пакеты:
fglrx-amdcccle_8.542-1_i386.deb
fglrx-driver_8.542-1_i386.deb
fglrx-driver-dev_8.542-1_i386.deb
fglrx-kernel-src_8.542-1_i386.deb

Отлично! Устанавливаем их при помощи dpkg -i один за другим, начиная с fglrx-driver_8.542-1_i386.deb. Внимание! Если в процессе установки fglrx-driver произошла ошибка - ничего страшного, все фиксится очень просто:
$ sudo aptitude reinstall libgl1-mesa-glx

и повторяем попытку установки.

А вот теперь самое интересное. При попытке собрать пакет с драйвером fglrx под свою платформу мы получаем "отбой", так как во время компиляции возникает ошибка. Усиленные поиски в Сети привели к находке патча для файла firegl_public.c, правда для его наложения на текущую версию драйверов пришлось поработать напильником, так как по смещениям нужные строки не совпадали... ну как обычно... По-порядку. Diff'ничек с правильными смещениями для вышеуказанных дров:
--- firegl_public.c.orig 2008-10-31 14:36:11.000000000 +0200
+++ firegl_public.c 2008-10-31 15:18:02.000000000 +0200
@@ -200,6 +200,12 @@
#define preempt_enable()
#endif

+/* Since 2.6.27 smp_call_function doesn't have a nonatomic/retry argument */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, wait)
+#else
+#define SMP_CALL_FUNCTION(func, info, retry, wait) smp_call_function(func, info, retry, wait)
+#endif
// ============================================================
/* globals */

@@ -251,7 +257,7 @@
const char BUILD_KERNEL_HAS_MODVERSIONS_CLEARED;
#endif

-#ifdef __SMP__
+#ifdef CONFIG_SMP
const unsigned long __ke_SMP_State = 1;
const char BUILD_KERNEL_HAS_SMP_SET;
#else
@@ -2348,8 +2354,8 @@
{
/*Some kernel developer removed the export of symbol "flush_tlb_page" on 2.6.25 x86_64 SMP kernel.
Define a simple version here.*/
-#if defined(__x86_64__) && defined(__SMP__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
- on_each_cpu(KCL_flush_tlb_one, &va, 1, 1);
+#if defined(__x86_64__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25))
+ on_each_cpu(KCL_flush_tlb_one, &va, 1);
#else
flush_tlb_page(vma, va);
#endif
@@ -2766,7 +2772,7 @@

/*****************************************************************************/

-#ifdef __SMP__
+#ifdef CONFIG_SMP
static atomic_t cpus_waiting;

static void deferred_flush(void* contextp)
@@ -2782,13 +2788,13 @@
while (atomic_read(&cpus_waiting) > 0)
barrier();
}
-#endif /* __SMP__ */
+#endif /* CONFIG_SMP */

int ATI_API_CALL __ke_flush_cache(void)
{
-#ifdef __SMP__
+#ifdef CONFIG_SMP
/* write back invalidate all other CPUs (exported by kernel) */
- if (smp_call_function(deferred_flush, NULL, 1, 0) != 0)
+ if (SMP_CALL_FUNCTION(deferred_flush, NULL, 1, 0) != 0)
panic("timed out waiting for the other CPUs!\n");

/* invalidate this CPU */
@@ -2802,7 +2808,7 @@

while (atomic_read(&cpus_waiting) > 0)
barrier();
-#else /* !__SMP__ */
+#else /* !CONFIG_SMP */
#if defined(__i386__) || defined(__x86_64__)
asm volatile ("wbinvd":::"memory");
#elif defined(__alpha__) || defined(__sparc__)
@@ -2810,7 +2816,7 @@
#else
#error "Please define flush_cache for your architecture."
#endif
-#endif /* !__SMP__ */
+#endif /* !CONFIG_SMP */

//for kernel 2.6.25, tlb_flush has been included when calling set_pages_*.
#if LINUX_VERSION_CODE 

После установки пакета fglrx-kernel-src_8.542-1_i386.deb в /usr/src появляется файл fglrx.tar.bz2, вот его куда-нибудь в /tmp распаковываем, накладываем выше приведённый патч, пакуем назад с таким же именем и кладем назад в /usr/src.

Конечно-же подразумевается, что ранее ядро мы собирали вручную.
Очень кратко о сборке ядра:
# make menuconfig
# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_image
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_headers
# fakeroot make-kpkg --initrd --revision=custom.1.0 kernel_source
# dpkg -i ../linux-image_версия-ядра_ревизия-ядра_i386.deb


Вот. Тут бы и сказочке конец, тут бы и собрать дровишки и установить их. Но... Конечно же драйвера соберутся и установка пройдёт гладко, вплоть до перезагрузки, так как на момент загрузки fglrx будет выдана ошибка, которую можно будет лицезреть по dmesg. Поэтому ещё немного терпения.

Это хорошо, что ядро у нас собрано установлено и работает. Придётся его... собирать опять, перед этим слегка пропатчив init_task.c в пути исходников ядра arch/x86/kernel.
--- arch/x86/kernel/init_task.c.orig 2008-11-02 09:11:46.000000000 +0200
+++ arch/x86/kernel/init_task.c 2008-11-01 11:16:34.000000000 +0200
@@ -14,7 +14,8 @@
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
struct mm_struct init_mm = INIT_MM(init_mm);
-EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
+//EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */
+EXPORT_SYMBOL(init_mm); /* will be removed in 2.6.26 */

/*
* Initial thread structure.

Вот, отлично, теперь пересобираем и устанавливаем ядро. Перезагружаемся.
Используя
$ sudo m-a
или
module-assistant prepare,update
module-assistant build,install fglrx
depmod -a
собираем пакет fglrx-kernel-версия-ядра_8.542-1+ревизия-ядра_i386.deb и устанавливаем его.

Ну и напоследок:
$ sudo aticonfig --initial
$ sudo aticonfig --overlay-type=Xv
$ sudo reboot

Собственно всё! Перезагружаемся и наслаждаемся!

Проверка:
$ fglrxinfo
display: :0.0 screen: 0
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: Radeon X300/X550/X1050 Series
OpenGL version string: 2.1.8087 Release
$ glxinfo | grep render
direct rendering: Yes
OpenGL renderer string: Radeon X300/X550/X1050 Series
$ glxgears -info
GL_RENDERER = Radeon X300/X550/X1050 Series
GL_VERSION = 2.1.8087 Release
GL_VENDOR = ATI Technologies Inc.
GL_EXTENSIONS = GL_AMD_performance_monitor GL_ARB_depth_texture
GL_ARB_draw_buffers GL_ARB_fragment_program
GL_ARB_fragment_shader GL_ARB_half_float_pixel
GL_ARB_half_float_vertex GL_ARB_multisample GL_ARB_multitexture
GL_ARB_occlusion_query GL_ARB_pixel_buffer_object
GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shader_objects
GL_ARB_shading_language_100 GL_ARB_shadow GL_ARB_shadow_ambient
GL_ARB_texture_border_clamp GL_ARB_texture_compression
GL_ARB_texture_cube_map GL_ARB_texture_env_add
GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3 GL_ARB_texture_float
GL_ARB_texture_mirrored_repeat GL_ARB_texture_non_power_of_two
GL_ARB_texture_rectangle GL_ARB_transpose_matrix GL_ARB_vertex_buffer_object
GL_ARB_vertex_program GL_ARB_vertex_shader
GL_ARB_window_pos GL_ATI_draw_buffers
GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo
GL_ATI_separate_stencil GL_ATI_texture_env_combine3
GL_ATI_texture_float GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color
GL_EXT_blend_equation_separate GL_EXT_blend_func_separate
GL_EXT_blend_minmax GL_EXT_blend_subtract
GL_EXT_compiled_vertex_array GL_EXT_copy_texture
GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object
GL_EXT_gpu_program_parameters GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil GL_EXT_packed_pixels
GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color
GL_EXT_separate_specular_color GL_EXT_shadow_funcs
GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texgen_reflection
GL_EXT_texture3D GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp
GL_EXT_texture_env_add GL_EXT_texture_env_combine
GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic
GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp
GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_texture_sRGB
GL_EXT_vertex_array GL_KTX_buffer_region GL_NV_blend_square
GL_NV_texgen_reflection GL_SGIS_generate_mipmap
GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_WIN_swap_hint WGL_EXT_swap_control
7295 frames in 5.0 seconds = 1458.984 FPS
7239 frames in 5.0 seconds = 1447.743 FPS
7328 frames in 5.0 seconds = 1465.518 FPS
7364 frames in 5.0 seconds = 1472.800 FPS
7346 frames in 5.0 seconds = 1469.199 FPS
$ fgl_glxgears
Using GLX_SGIX_pbuffer
1597 frames in 5.0 seconds = 319.400 FPS
2008 frames in 5.0 seconds = 401.600 FPS
1997 frames in 5.0 seconds = 399.400 FPS
2008 frames in 5.0 seconds = 401.600 FPS
2267 frames in 5.0 seconds = 453.400 FPS
2589 frames in 5.0 seconds = 517.800 FPS

Ps:
Отдельное спасибо хочется сказать Вадику Пилипенко aka Pil$on, который
"заставил" меня совершить подвиг по установке ATI'шных дров вместо
покупки nVidia и который поделился идеей патча ядра, на предмет замены
EXPORT_UNUSED_SYMBOL на EXPORT_SYMBOL (уж не знаю, где он нашёл это
решение и чем это чревато, но... - работает)

Как получить modeline

Немного о настройке X'ов. В секции Monitor каждый может заметить загадочные строки ModeLine, но не каждый может ответить на вопрос откуда берутся эти параметры.
Приоткроем завесу над этой тайной. Вот два метода позволяющий получить значения ModeLine.
$ aptitude install read-edid
$ aptitude install videogen
В первом пакете нас интересуют утилиты get-edid и parse-edid - первая из них получает, а вторая интерпретирует значение спецификации монитора используя VESA VBE DDC протокол.
videogen - это программа генерации Modelines для XFree86 сервера.
Теперь как пользоваться первой и второй из них.

Для начала рассмотрим пакет read-edid.
$ sudo get-edid | parse-edid
parse-edid: parse-edid version 2.0.0
get-edid: get-edid version 2.0.0

Performing real mode VBE call
Interrupt 0x10 ax=0x4f00 bx=0x0 cx=0x0
Function supported
Call successful

VBE version 200
VBE string at 0x2110 "ATI RV370"

VBE/DDC service about to be called
Report DDC capabilities

Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x0 cx=0x0
Function supported
Call successful

Monitor and video card combination does not support DDC1 transfers
Monitor and video card combination supports DDC2 transfers
0 seconds per 128 byte EDID block transfer
Screen is not blanked during DDC transfer

Reading next EDID block

VBE/DDC service about to be called
Read EDID

Performing real mode VBE call
Interrupt 0x10 ax=0x4f15 bx=0x1 cx=0x0
Function supported
Call successful

parse-edid: EDID checksum passed.

# EDID version 1 revision 3
Section "Monitor"
# Block type: 2:0 3:fd
# Block type: 2:0 3:fc
Identifier "SyncMaster"
VendorName "SAM"
ModelName "SyncMaster"
# Block type: 2:0 3:fd
HorizSync 30-81
VertRefresh 56-75
# Max dot clock (video bandwidth) 140 MHz
# Block type: 2:0 3:fc
# Block type: 2:0 3:ff
# DPMS capabilities: Active off:yes  Suspend:no  Standby:no

Mode  "1280x1024" # vfreq 60.020Hz, hfreq 63.981kHz
DotClock 108.000000
HTimings 1280 1328 1440 1688
VTimings 1024 1025 1028 1066
Flags "+HSync" "+VSync"
EndMode
# Block type: 2:0 3:fd
# Block type: 2:0 3:fc
# Block type: 2:0 3:ff
EndSection
Тут наиболее интересная для решения поставленной нами задачи информация содержится практически в самом конце. Для составления ModeLine нас интересуют строки начинающиеся с Mode, DotClock, HTimings, VTimings и Flags:
Mode  "1280x1024" # vfreq 60.020Hz, hfreq 63.981kHz
DotClock 108.000000
HTimings 1280 1328 1440 1688
VTimings 1024 1025 1028 1066
Flags "+HSync" "+VSync"
Итоговая ModeLine:
  • ModeLine "1280x1024" 108.00 1280 1328 1440 1688 1024 1025 1028 1066 +HSync +VSync

Перейдём ко второму методу, пакету videogen.
Тут всё значительно проще. Просто вызываем videogen с параметрами режима, максимального значения dot clock rate, максимальной частотой горизонтальной развёртки и максимальной частотой вертикальной развёртки:
$ videogen -m=1280x1024 -mdc=108 -mhf=81 -mvf=75
и получаем результирующую строку ModeLine:
  • Modeline "1280x1024" 108.00 1280 1320 1368 1640 1024 1026 1030 1078  # 108 MHz, 65.9 kHz, 61.1 Hz

Следует обратить внимание, что полученные двумя различными способами строки ModeLine слегка отличаются. Собственно это и не удивительно, если первый вариант считывает необходимые параметры с самого монитора то второй является простым калькулятором для ModeLine.

Собственно на этом всё ;)

вторник, 20 октября 2009 г.

Установка скорости последовательного порта

Понадобилось тут последовательный порт на 2400 залочить.
Помню, что раньше через setserial всё успешно лочил, но было это давно, в далёких 90-х. Тем не менее решил попробовать, на что и получил нелицеприятное сообщение:
# setserial /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 2400 spd_normal skip_test
Cannot set serial info: Invalid argument

При этом значения выше (9600 и т.д.) воспринимались вполне корректно:
# setserial /dev/ttyS0 uart 16550A port 0x03f8 irq 4 baud_base 9600 spd_normal skip_test
#
Выход был найден. Оказывается всё можно сделать и без использования дополнительного setserial:
# stty 2400 < /dev/ttyS0
Проверяем:
# stty -F /dev/ttyS0 | grep speed
speed 2400 baud; line = 0;
Чудеса да и только ;)

Установка BFS (Brain Fuck Scheduler) в ядро Linux.

Недавно Вадик Пилипенко (Pilson) поделился ссылкой на статью "Установка BFS (Brain Fuck Scheduler) на примере Ubuntu Linux 9.04". Но так как у меня не Ubuntu, а Debian то возникли некоторые нюансы при компиляции и установке...
Собственно по-порядку. Патч к своему ядру я взял там-же где указано в вышеприведённой статье, на http://ck.kolivas.org/patches/bfs/. На мои исходники к ядру 2.6.30.4 патч лёг в общем-то без проблем, за исключением того, что не пропатчился Makefile, но выяснилось, что как-раз его-то можно было и не патчить, так как единственное, что менялось, так это EXTRAVERSION. Поэтому было решено оставить его as is, но поменял NAME на BFS Powered.
При конфигурировании ядра не забыть, и это обязательно, изменить следующие настройки:
  • Processor type and features -> Timer frequency устанавливаем в 1000Hz
  • Processor type and features -> Tickless System (Dynamic Ticks) отключаем
  • Processor type and features -> Preemption Model -> Preemptible kernel (Low latency desktop)
Дальше как по инструкции "Сборка и установка ядра под Debian":
fakeroot make-kpkg \
--revision=og.$( date +%Y%m%d.%H%M%S ) \
--initrd \
--append-to-version=-bfs304 \
kernel_image \
kernel_headers \
kernel_manual \
kernel_doc \
kernel_source
Сразу-же замечу, что мне лениво заморачиваться с порядковыми номерами ревизий, а оттого использовал подстановку текущей даты и времени, а так-же, в отличии от инструкции по сборке ядра, "искуственно" добавлена версия, которая затем добавиться в имя deb-пакетов. Ну и порядок инструкция для make-kpkg задан сразу пачкой, а не по отдельности.
После того как ядро собралось:
# dpkg -i linux-image-2.6.31.4-bfs304_og.20091020.102119_i386.deb
Выбор ранее не выбранного пакета linux-image-2.6.31.4-bfs304.
(Чтение базы данных ... на данный момент установлено 282999 файлов и каталогов.)
Распаковывается пакет linux-image-2.6.31.4-bfs304 (из файла linux-image-2.6.31.4-bfs304_og.20091020.102119_i386.deb)...
Done.
Настраивается пакет linux-image-2.6.31.4-bfs304 (og.20091020.102119) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.31.4-bfs304 /boot/vmlinuz-2.6.31.4-bfs304
Тут ждала первая неожиданность - не собрался /boot/initrd.img-2.6.31.4-bfs304. Поэтому его сборку, по подсказке Pilson'а, выполнил отдельно:
# mkinitramfs -o /boot/initrd.img-2.6.31.4-bfs304 2.6.31.4-bfs304
параметрами переданы имя собираемого initrd-файла и версия ядра.
Собственно ядро установилось, initrd собрался.
Что-ж, пошёл на:
# reboot
Если возникнут проблемы - напишу отдельно ;)

четверг, 15 октября 2009 г.

Сборка и установка ядра под Debian

Зададимся целью: собрать "универсальное" ядро, чтобы потом им делиться с друзьями, знакомыми, да и самим спокойно портировать куда угодно ;)

Для начала ставим пакеты fakeroot, kernel-package, libncurses5-dev:
aptitude install fakeroot kernel-package libncurses5-dev
Все зависимости будут подтянуты автоматом...
Затем берём нужный архив с kernel.org и сливаем и распаковываем его в /usr/src (берём для примера ядро 2.6.31.4).
$ cd /usr/src
$ sudo -s
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.4.tar.bz2
# tar xjf linux-2.6.31.4.tar.bz2
# if [ -d linux ]; then rm linux; fi; ln -s linux-2.6.31.4 linux
# cd linux
Тут есть один момент. Так как у нас уже есть рабочее ядро в установленной системе то, если не хотим выставлять все галочки в конфигурации нового ядра с нуля, берём готовый config либо из /boot либо из /proc:
# cp /boot/config-$( uname -r ) .config
# zcat /proc/config.gz > .config
В итоге имеем предварительную заготовку к конфигурации нашего нового ядра.

Теперь конфигурируем ядро под специфические для нас цели, либо добавляем опции для новых модулей, либо... Одним словом - творчество:
# make menuconfig
Тут инетресно будет ответить, что если мы сразу-же выйдем из меню, то можем увидеть что-то подобное этому:
.config:903:warning: symbol value 'm' invalid for RFKILL_INPUT
.config:2920:warning: symbol value 'm' invalid for DRAGONRISE_FF
.config:2937:warning: symbol value 'm' invalid for GREENASIA_FF
.config:2939:warning: symbol value 'm' invalid for THRUSTMASTER_FF
.config:2940:warning: symbol value 'm' invalid for ZEROPLUS_FF
имеет смысл найти эти опции при конфигурировании нового ядра и посмотреть что да к чему... Кстати, если кому интересно под X-ами заниматься конфигурированием, то может сделать так:
# make xconfig
Важно! Не забываем сказать "Kernel module loader" в "Loadable module support", так как возможны варианты. Ну всё. Пимпочки поотмечали, кнопочки понажимали, из окошек вышли, новый конфиг сохранили, теперь приступим к сборке. Для начала сделаем:
# make-kpkg clean
Если до этого сборка не производилась, то увидим что-то наподобие этого:
exec make kpkg_version=12.021 -f /usr/share/kernel-package/ruleset/minimal.mk clean
====== making target minimal_clean [new prereqs: ]======
This is kernel package version 12.021.
test ! -f .config || cp -pf .config config.precious
test ! -e stamp-building || rm -f stamp-building
test ! -f Makefile || \
make    ARCH=i386 distclean
make[1]: Entering directory `/usr/src/linux-2.6.31.4'
CLEAN   scripts/basic
CLEAN   scripts/kconfig
CLEAN   include/config
CLEAN   .config .config.old include/linux/autoconf.h
make[1]: Leaving directory `/usr/src/linux-2.6.31.4'
test ! -f config.precious || mv -f config.precious .config
rm -f modules/modversions.h modules/ksyms.ver scripts/cramfs/cramfsck scripts/cramfs/mkcramfs
Ну, а теперь, собственно, собираем ядро:
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_image
og.091015.00 - означает лишь ревизию нашей сборки. Может быть любой - у кого насколько фантазии хватит :) После того как предыдущая команда нормально выполнится, можно также дать такой "джентельменский набор":
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_headers
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_manual
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_doc
# fakeroot make-kpkg --initrd --revision=og.091015.00 kernel_source
После этого получим набор из следующих deb-пакетов:
  • linux-image-2.6.31.4_og.091015.00_i386.deb
  • linux-headers-2.6.31.4_og.091015.00_i386.deb
  • linux-manual-2.6.31.4_og.091015.00_all.deb
  • linux-doc-2.6.31.4_og.091015.00_all.deb
  • linux-source-2.6.31.4_og.091015.00_all.deb

располагаться они будут в /usr/src.
Нам остаётся их только установить через dpkg:
# cd /usr/src
# dpkg -i ./linux-image-2.6.31.4_og.091015.00_i386.deb
и т.д.
Конфигурация к GRUB'у должна будет выполниться автоматически, равно как и собраться initrd.
Финальный шаг:
# reboot