Linux Kernel HOWTO: Исправление ядра с помощью заплаток

Previous Next Table of Contents

## 5. Исправление ядра с помощью заплаток

## 5.1 Наложение заплаток

Накладывающиеся обновления ядра распространяются в виде заплаток. Например, если у вас версия 1.1.45, и вас оповестили, что выпущен ``patch46.gz`' для него, это означает, что вы можете обновить ядро до версии 1.1.46 приложив эту заплатку. Вы можете захотеть сначала сделать резервную копию дерева исходных текстов ядра (сначала ``make clean`' и затем ``cd /usr/src; tar zcvf old-tree.tar.gz linux`' создаст для сжатый архивный файл с резервной копией).

Так, продолжая пример, приведенный выше, предположим, что у вас файл ``patch46.gz`' расположен в директории `/usr/src`. Выполним `cd` в `/usr/src` и выполним ``zcat patch46.gz | patch -p0`' (или ``patch -p0 < patch46`' если эта заплатка не является сжатой). Вы увидите некоторые вещи мелькающие на экране, которые сообщают вам, что программа пытается приложить куски заплатки на нужные файлы и информацию о том, удачна данная операция или нет. Обычно этот процесс идет слишком быстро, чтобы вы могли прочитать и вы можете не быть уверенными, удачна эта операция или нет, в этом случае вы можете использовать опцию `-s` для программы `patch`, которая заставляет `patch` выдавать только сообщение об ошибках (вы не получите сообщения ``эй, мой компьютер действительно что-то делает!'', но если вы это предпочитаете..). Для того, чтобы взглянуть на то какие разделы не прошли гладко, перейдите в директорию `/usr/src/linux` и посмотрите файлы с расширением `.rej`. Некоторые версии программы `patch` (старые версии, которые могли быть скомпилированы на более худших файловых системах) оставляют отклоненные файлы с расширением `#`. вы можете использовать команду ``find`' для того чтобы найти эти файлы:

        find .  -name '*.rej' -print

эта команда печатает список всех файлов, которые находятся в текущей директории и ее поддиректориях и имеют расширение `.rej` на стандартный вывод.

если все прошло правильно, то выполните команды ``make clean`', ``config`', и ``dep`' как описано в разделах 3 и 4.

Существует еще несколько опций для команды `patch`. Как было отмечено выше, `patch -s` запретит вывод всех сообщений за исключением сообщений об ошибках. Если вы храните ваше ядро где-то в другом месте, отличном от `/usr/src/linux`, то выполнение `patch -p1` (в этой директории) правильно выставит заплатку. Другие опции команды `patch` хорошо описаны в ее справочной странице.

## 5.2 Если что-то неправильно

(Замечание: этот раздел относится к большинству старых ядер).

Наиболее частая проблема возникает когда заплатка модифицирует файл, называемый ``config.in`' и он не выглядит достаточно правильно, потому-что вы изменили его опции для вашей машины. Это было исправлено, но эта проблема может возникнуть со старыми выпусками ядра. Для исправления этой проблемы посмотрите в файл `config.in.rej`, и посмотрите что осталось сделать оригинальной заплатке. Изменения обычно обозначаются символами ``+`' и ``-`' в начале строки. Посмотрите строки, которые окружают эти символы и запомните где установлено ``y`' или ``n`'. Теперь отредактируйте файл `config.in`, и измените ``y`' на ``n`' и ``n`' на ``y`' где это нужно. Выполните команду

        patch -p0 < config.in.rej

и если она выдала, что операция проведена удачно (без ошибок), то вы можете продолжать работу выполняя настройку ядра и его компиляцию. Файл `config.in.rej` все равно останется, но вы можете удалить его.

если у вас все равно существуют проблемы, то это значит, что вы могли установить заплатку не с тем номером. Если программа patch сообщает ``previously applied patch detected: Assume -R? (обнаружена предыдущая заплатка: использовать опцию -R?`', то вы скорее всего пытаетесь приложить заплатку с номером меньшим, чем номер версии вашего ядра; если вы ответите ``y`', то программа попытается вернуть ваши исходные тексты к предыдущей версии, и скорее всего это вызовет ошибку; поэтому вам понадобится установить заново все дерево исходных текстов (что может быть не такой уж плохой идеей).

Для того чтобы убрать изменения внесенные заплаткой, используйте команду ``patch -R`' с оригинальной заплаткой.

Лучше всего в случае, когда заплатки делают что-то неправильно, начать применять ее с новым деревом исходных текстов (например извлеченным из одного из файлов `linux-x.y.z.tar.gz`), и запустит процесс заново.

## 5.3 Избавляемся от файлов .orig

После всего нескольких заплаток у вас накопится куча файлов с расширением `.orig`. Например одно ядро 1.1.51, которое было последний раз почищено при версии 1.1.48. Удаление .orig файлов сохранило примерно половину мегабайта дисковой памяти.

        find .  -name '*.orig' -exec rm -f {} ';'

эта команда позаботится о вас. Версии программы `patch`, которые используют знак `#` для отклоненных файлов используют знак тильды `~` вместо `.orig`.

Существует лучший способ избавится от `.orig` файлов, который зависит от GNU программы `xargs`:

        find .  -name '*.orig' | xargs rm

или ``довольно безопасный, но несколько более многословный'' метод:

        find . -name '*.orig' -print0 | xargs --null rm --

## 5.4 Другие заплатки

Также существуют другие заплатки (я буду назвать их ``нестандартными''), кроме поставляемых Linus. Если вы накладываете такие заплатки, то заплатки от Linus могут работать неправильно и вы должны будете либо убрать их, изменить исходные тексты или заплатку, либо установить новое дерево исходных текстов, или выполнить комбинацию описанных действий. Это может быть очень расстраивающим, так что если вы не хотите изменять исходные тексты (с возможно плохим результатом), то удалите нестандартные заплатки до приложения заплаток полученных от Linus, или просто установите новое дерево исходных текстов. Затем вы можете посмотреть работают ли нестандартные заплатки. Если они не работают, то вы либо задержались с использованием старого ядра, поиграйтесь с исходными текстами или измените заплатку, либо просто дождитесь выхода новой версии нестандартной заплатки.

Какие существуют заплатки не входящие в стандартный дистрибутив? Вы вероятно слышали о них. Я использую такую заплатку для того, чтобы курсор на моей консоли не мигал, я ненавижу мигающие курсоры (Эта заплатка часто обновляется (или по крайней мере обновлялась) по мере выпуска новых версий ядра. Для большинства новых устройств драйвера разрабатываются как загружаемые модули и частота использования нестандартных заплаток значительно уменьшается.

Previous Next Table of Contents