Дисклеймер

Внимание: в этом блоге могут описываться события, явления и факты при помощи ненормативной лексики. Убедитесь, что Вы готовы к этому.

среда, 31 июля 2013 г.

Ядро Linux 3.10 и модули r8168, nvidia-drivers-325.08

После обновления ядра до версии 3.10 столкнулся с тем, что не получается выполнить пересборку модулей сетевой карты Realtek RTL 8111 и драйвера nvidia.
Указанная проблема не разрешалась ни путём "выжидания" новой версии ядра: с 3.10.1, 3.10.2, 3.10.3 результат оказался тем же - модули не собирались.

Для r8168-8.035.00 получал такой вот выхлоп:
make[2]: *** [/var/tmp/portage/net-misc/r8168-8.035.00-r1/work/r8168-8.035.00/src/r8168_n.o] Ошибка 1
make[1]: *** [_module_/var/tmp/portage/net-misc/r8168-8.035.00-r1/work/r8168-8.035.00/src] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-3.10.3'
make: *** [modules] Ошибка 2
 * ERROR: net-misc/r8168-8.035.00-r1::gentoo failed (compile phase):
 *   emake failed
А x11-drivers/nvidia-drivers-325.08 вываливалась с ошибкой:
make[2]: *** [_module_/var/tmp/portage/x11-drivers/nvidia-drivers-325.08/work/kernel] Ошибка 2
make[1]: *** [sub-make] Ошибка 2
make[1]: Выход из каталога `/usr/src/linux-3.10.3'
NVIDIA: left KBUILD.
nvidia.ko failed to build!
make: *** [module] Ошибка 1
 * ERROR: x11-drivers/nvidia-drivers-325.08::gentoo failed (compile phase):
 *   emake failed
Приходилось использовать ветку 3.9.* - с ней никаких проблем не возникало.
Однако терпение лопнуло и было принято решение о том, что нужно эту ситуацию как-то разрешить.
Путём гугления и поиска патчей, было найдено решение.
Пофиксить r8168 удалось только с обновлением до версии 8.036.00 (ссылка на дистрибутив) и применением патча для этой версии. Для того, чтобы пакет ужился в системе и не было проблем, рекомендую использовать локальный оверлей.

Если не знаете, как это сделать, вот мой способ:
1. добавляем в /etc/make.conf (или /etc/portage/make.conf) строку:
PORTDIR_OVERLAY="/usr/local/my"
2. создаём папку оверлея и ебилда:
mkdir -p /usr/local/my/net-misc/r8168/
3. копируем образец ебилда для версии 8.035, но с именем 8.036 в папку оверлея:
cp /usr/portage/net-misc/r8168/r8168-8.035.00-r1.ebuild /usr/local/my/net-misc/r8168/r8168-8.036.00.ebuild
4. создаём в папке /usr/local/my/net-misc/r8168/ директорию files:
mkdir /usr/local/my/net-misc/r8168/files/
5. в данную папку нужно поместить патч r8168-8.036.00-build-3.10.patch
а в самом ебилде в функции
src_prepare() {
        epatch "${FILESDIR}/${P}-build-3.8.patch"
}
нужно 3.8 заменить на 3.10

6. создаём файл Manifest:
ebuild /usr/local/my/net-misc/r8168/r8168-8.036.00.ebuild digest
7. (опционально) чтобы система не ругалась в духе
!!! Repository 'x-my' is missing masters attribute in '/usr/local/my/metadata/layout.conf'
!!! Set 'masters = gentoo' in this file for future compatibility
следуем советам системы, и поступаем следующим образом:
mkdir -p /usr/local/my/metadata/
echo 'masters = gentoo' > /usr/local/my/metadata/layout.conf
8.  Запускаем компиляцию с флагами по вкусу: emerge -1vba r8168. Модуль собран и работоспособен :-)

В случае с nvidia-drivers-325.08 всё куда проще. Достаточно скачать патч и положить его в директорию
/etc/portage/patches/x11-drivers/nvidia-drivers-325.08/
Как можно догадаться из пути, патч, находящийся в данной директории будет применяться только к версии 325.08.
Обращаю внимание на то, что в названии файла нужно убрать расширение txt, файл должен иметь имя nvidia-drivers-linux-3.10.patch.
Затем достаточно просто запустить компиляцию (или module-rebuild), и всё будет успешно собрано.

Проблема решена.

P.S. с ядром 3.10.4 всё также отлично собирается, и с 3.10.5 полёт нормальный.
P.P.S. версия nvidia-drivers-325.15 успешно компилируется без всяких дополнительных патчей.