LINUX.ORG.RU

Создание патча для ядра

 , , , ,


1

1

Доброй ночи.

Недавно создавал тему, в которой указывал на проблемы с радеоном (прошу, не надо холиваров!). Единственное решение, как я понял, это патч для ядра, ибо из исходников собирать не буду. Т.е. к стандартному арчелинуху добавить патч. Как его создать? Прикладываю ссылки на багтрекер и (наверное) содержимое патча. Сам я никогда с патчами дел не имел, мой первый раз. Спасибо.

https://bugs.freedesktop.org/show_bug.cgi?id=91294

https://bugs.freedesktop.org/attachment.cgi?id=117048

патч подразумевает сборку ядра из исходников, без вариантов

anonymous
()

это патч для ядра, ибо из исходников собирать не буду

Это как?
Патч применяется к /drivers/gpu/drm/radeon/si_dpm.c
Это модуль ядра. Можно выкачать и собрать только его, а потом использовать insmod.

anonymous
()
Ответ на: комментарий от leonid

Окей. А как найти это самый модуль, как писал анон? Скачать сорцы пакменом/как-там-правильно-их-комиуниздить или есть тулзы для выкачивания модулей?

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

Выкачиваете исходники ядра, переходите в директорию drivers/gpu/drm/radeon, применяете патч:

patch si_dpm.c < patch.diff
Потом запускаете из этой директории make. Он должен сбилдить модуль, который потом можно воткнуть в рабочее ядро с помощью insmod или modprobe. Думаю, будет достаточно insmod module_name.ko. Как сделать так, чтобы оно загружалось при старте системы, читайте маны по систем-ди.

anonymous
()
Ответ на: комментарий от anonymous

Не понял на этапе патчинга. Его же ещё создать нужно, не? Или достаточно отредактировать файлы и собрать модуль?

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

Можно поправить файл руками. Либо как написано, но подразумевается, что в patch.diff должно быть

--- a/drivers/gpu/drm/radeon/si_dpm.c	2015-07-10 21:51:29.234185270 +0200
+++ b/drivers/gpu/drm/radeon/si_dpm.c	2015-07-10 21:50:34.509053724 +0200
@@ -2925,6 +2925,7 @@
 	/* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
 	{ PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
 	{ PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
+	{ PCI_VENDOR_ID_ATI, 0x6811, 0x1462, 0x2015, 0, 120000 },
 	{ 0, 0, 0, 0 },
 };
 

anonymous
()
Ответ на: комментарий от anonymous

Дошло, спасибо! Кстати, с автоинжектом... Можно просто добавить в modules-load.d файл с чем-то типа «/home/maxik/modulename(.ko)»? И нужно будет блэклистить радеон?

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

Kernel modules can be explicitly loaded during boot and are configured as a static list in files under /etc/modules-load.d/.

Наверное этого будет достаточно. Если я правильно понимаю, что такое блэклист, он здесь не нужен. У меня пробелы в знаниях систем-ди. Лучше спросить тех, кто его использует.

anonymous
()
Ответ на: комментарий от anonymous

Насчёт блэка... А не нужен-ли он для блока оригинала? Вроде патченный модуль будет дублем, не? Система съест оба и будет былинный отказ.

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

А не нужен-ли он для блока оригинала?

Он должен замениться тем, что Вы соберёте. Не вижу смысла иметь два модуля. Если выполнить make install, то собранный kernel object должен установиться вместо старого куда-нибудь в /sys/module/.

anonymous
()
Ответ на: комментарий от mradermaxlol

Система съест оба

При загрузке ругнётся, что функции с теми же именами уже экспортированы и другую копию загружать не станет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Судя по докам арча, сраться придётся не с ядром и компиляцией (это изи), а с системой на скрасноглазженом ядре :)

mradermaxlol
() автор топика
Ответ на: комментарий от i-rinat

Спасибо, сэкономили мне кучу потерянного времени на трахание (неохлаждённое) с системой :) С утра буду красноглазить.

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

Лучше поглядеть в доках, как оборачивать собранное ядро в пакет твоего дистрибутива. Во всех крупных есть свои инструменты для этого. (Кроме слаки ☺). А пакет он и есть пакет. Захотел — удалил.

Патч минимальный, проблем вызвать не должен.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Так не в этом дело, дело в атомной ё*ле с системой, модулями и прочим говном. Серьёзно, арч вики заполнен фразами «If you have a custom built kernel...». Понимаю, что патч минимальный, но мне будет комфортнее каждый раз пересобирать модуль, или создать скрипт длчя этого :)

mradermaxlol
() автор топика
Ответ на: комментарий от anonymous

Ох ты ж. Всё, спать пора. Бред пишу. make install не сработает, нет таргета install в мейкфайле. Нужно make modules_install от корня, где исходники ядра (/usr/src/linux). В /sys/module модули попадают уже после инициализации. Лежат вроде в /lib/modules. Не суть важно. Послушай гентушника и сделай наоборот, короче.

anonymous
()
Ответ на: комментарий от mradermaxlol

«Custom built kernel» почти всегда означает «ядро с большими патчами и правками, несовместимое по ABI со стандартным.

В твоём случае ты выкачиваешь PKGBUILD стандартного, стокового ядра (yaourt -G linux), добавляешь свой патч в PKGBUILD и собираешь с заменой стандартного пакета linux. Дальше система ведёт себя так, как будто это стандартное ядро. Просто каждую версию придётся заново собирать.

intelfx ★★★★★
()
Ответ на: комментарий от mradermaxlol

Никогда не возился с собственнособранными ядрами в Archlinux. Но в Debian нет проблем с ядрами, собранными через make-kpkg. Вряд ли они будут в Archlinux.

Сюрпризы были при сборке deb-пакет через make deb-pkg, то есть скриптами самого ядра. Вроде, какая-то бяка с ссылками source и build, подробностей не вспомню.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Так, окей. Можно по порядку - что мне делать? Я так понял, что я топаю в /usr/src/linux, патчу модуль, make «что-то-лень-писать», настраиваю модулс-лоад и т.п.,конфигурация бутлоадера, ребут?

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

Выше арчеводы пишут, что проще будет всё ядро собрать с этим патчем, а не только один модуль. Ядро собирается через make menuconfig. Только там модули надо повключать нужные. Есть в арче аналог genkernel?

anonymous
()
Ответ на: комментарий от intelfx

Звучит заманчиво... 1) Bfq и bfs считаются глобальными? Да/нет?

2) Можно, пожалуйста, подробную инструкциб по сборке йогуртом?

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

BFQ и BFS — да. Они много чего изменяют.

Йогурт — не сборщик. Йогурт — обёртка над кучей других тулз. Здесь он нужен ровно для того, чтобы получить тарболл (архив) со скриптом сборки (PKGBUILD). Получив его (он автоматически распаковывается в текущий каталог), ты делаешь следующее:

  1. идёшь в подкаталог linux
  2. кладёшь в него свой патч (патчи)
  3. открываешь файл PKGBUILD любым текстовым редактором
  4. в массив source вписываешь имена патчей через пробел или перевод строки
  5. в функцию prepare() вписываешь команды патчинга (рядом с уже имеющимися) — patch -Np1 -i "${srcdir}/имя-файла-патча"
  6. сохраняешь файл
  7. находясь в каталоге с PKGBUILD и патчами, делаешь команду updpkgsums
  8. там же делаешь (от имени пользователя, не от рута) makepkg -s
  9. идёшь пить чай или гулять (стоковое ядро собирается долго или очень долго, в зависимости от мощности железа)
  10. наконец, там же делаешь sudo pacman -U linux{,-headers}*.pkg.tar
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от mradermaxlol

Стоковое ядро, со всеми включенными опциями — 2 минуты? У меня i7-4700MQ собирает его полчаса минимум (а процессор едва ли не флагманский).

С флагом -i, конечно, проще. Я хотел явно описать все шаги, чтобы не создавалось ощущения «магии».

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

в массив source вписываешь имена патчей через пробел или перевод строки

В любом месте?

mradermaxlol
() автор топика
Ответ на: комментарий от intelfx

И как прописывать? Просто добавить строчку

patch.diff

Или

«patch.diff»

? Я ничего в этом не понимаю :)

mradermaxlol
() автор топика
Ответ на: комментарий от intelfx

Эхх, ошибка при красноглазинге :С

[maxik@m-Arch linux]$ ls change-default-console-loglevel.patch linux-4.1.tar.sign linux.preset patch.diff config linux-4.1.tar.xz patch-4.1.6.sign PKGBUILD config.x86_64 linux.install patch-4.1.6.xz [maxik@m-Arch linux]$ nano PKGBUILD [maxik@m-Arch linux]$ makepkg -sri ==> Сборка пакета: linux 4.1.6-1 (Ср авг 26 10:20:47 UTC 2015) ==> Проверяю необходимые для запуска зависимости... ==> Проверяю необходимые для сборки зависимости... ==> Установка недостающих зависимостей... [sudo] пароль для maxik: разрешение зависимостей... проверка конфликтов...

Пакеты (1) xmlto-0.0.26-1

Будет загружено: 0,02 MiB Будет установлено: 0,07 MiB

:: Приступить к установке? [Y/n] y :: Получение пакетов ... xmlto-0.0.26-1-x86_64 22,9 KiB 246K/s 00:00 [############################] 100% (1/1) проверка ключей [############################] 100% (1/1) проверяется целостность пакета [############################] 100% (1/1) загрузка файлов пакетов [############################] 100% (1/1) проверка конфликтов файлов [############################] 100% (1/1) проверяется доступное место [############################] 100% (1/1) установка xmlto [############################] 100% ==> Получение исходных файлов... -> Найден linux-4.1.tar.xz -> Найден linux-4.1.tar.sign -> Найден patch-4.1.6.xz -> Найден patch-4.1.6.sign -> Найден config -> Найден config.x86_64 -> Найден linux.preset -> Найден patch.diff -> Найден change-default-console-loglevel.patch ==> Проверка исходных файлов с помощью sha256sums... linux-4.1.tar.xz ... Готово linux-4.1.tar.sign ... Пропущен patch-4.1.6.xz ... Готово patch-4.1.6.sign ... Пропущен config ... Готово config.x86_64 ... Готово linux.preset ... Готово patch.diff ... Готово change-default-console-loglevel.patch ... Готово ==> Проверка подписей исходных файлов с помощью gpg... linux-4.1.tar ... СБОЙ (неизвестный открытый ключ 79BE3E4300411886) patch-4.1.6 ... СБОЙ (неизвестный открытый ключ 38DBBDC86092693E) ==> ОШИБКА: Одна или более PGP подписей не может быть проверена! ==> Removing installed dependencies... проверка зависимостей...

Пакеты (1) xmlto-0.0.26-1

Будет освобождено: 0,07 MiB

:: Хотите удалить эти пакеты? [Y/n] y (1/1) удаление xmlto [############################] 100% [maxik@m-Arch linux]$

mradermaxlol
() автор топика
Ответ на: комментарий от i-rinat

чо за бред? это в арче такая порнография? в дебиане кладешь новый модуль в /lib/modules/<kernel>/extra или updates, делаешь depmod - и всё, грузится новый вместо старого.

anonymous
()
Ответ на: комментарий от intelfx

Так, со скипом PGP-check получилось вот что:

patching file drivers/gpu/drm/radeon/si_dpm.c

Hunk #1 FAILED at 2925.

1 out of 1 hunk FAILED — saving rejects to file drivers/gpu/drm/radeon/si_dpm.c.rej

==> ОШИБКА: Произошел сбой в prepare().

Преждевременный выход...

[maxik@m-Arch linux]$

mradermaxlol
() автор топика
Ответ на: комментарий от intelfx

У меня i7-4700MQ собирает его полчаса минимум

Никогда не понимал, чего там в конфиге навключали. У меня тоже ядро арча очень долго собиралось всегда. А вот в генте — минут 15-20 на Core2Duo T4200

anonymous
()
Ответ на: комментарий от mradermaxlol

Читать-то умеешь? Хотя бы старайся понять, чё он от тебя хочет.

Не может он твой кривой патч наложить. Если интересно — смотри тот файл, который он предлагает тебе посмотреть и исходник. И думай над тем, где ты был неправ

anonymous
()
Ответ на: комментарий от anonymous

Кхм... При попытке патчинга ругается, при ручном редактировании всё равно не получается, ибо перезаписываются исходники.

mradermaxlol
() автор топика
Ответ на: комментарий от anonymous

Кажется, получилось. Makepkg -srie --skippgpcheck спас меня.

mradermaxlol
() автор топика
Ответ на: комментарий от smilessss

Патч этот вроде в составе Linux 4.2, но я хочу ванильное ядро арча :) Пусть там будет один недопатчефикс, но оно останется арчелинухом, и не будет срачей. Походу, тема закрыта, ядро компилируется. Спасибо всем за помощь!

mradermaxlol
() автор топика
Ответ на: комментарий от mradermaxlol

build a default Linux kernel

А, тогда всё понятно. Надо полагать, имеется в виду defconfig, а он сам по себе очень минималистичен. Там далеко не «всё включено».

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от mradermaxlol

Ты спрашивал «можно подробнее?» про insmod. Я тебе и ответил. Есть драйверы, которых нет в ядре Linux. Они устанавливаются командами make и sudo make isntall.

ZenitharChampion ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.