Использование комманд diff и patch.

17.05.2019

( 2007-02-05 )

Комманды diff и patch представляют собой мощную комбинацию. Они часто используются для получения разницы между оригинальными файлами и обновленными, что бы другие люди, у которых есть только только оригинальные файлы могли обновить их используя файлы, которые содержат только разницу. В этой статье показаны базовые принципы использования этих команд.

В этой статье используются без объяснения некоторые базовые команды Linux, такие как смена смена директории, копирование файлов и редактирование текстовых файлов.

Использование diff для создания простого патча

Наиболее простой пример использования команды diff - получение различий между двумя файлами, оригинальным и обновленным. Можете, например, написать насколько слов обычного текста, сделать какие-нибудь изменения, и сохранить измененния во второй файл. Теперь вы можете сравнить эти эти два файла, используя команду diff:

$ diff originalfile updatedfile

Конечно, надо заменить originalfile и updatedfile соответствующими именами файлов. В результате должно получиться что-то вроде этого:

1c1 < These are a few words. \ No newline at end of file --- > These still are just a few words. \ No newline at end of file

Обратите внимание: Что бы продемонстрировать создание простого патча, я использовал оригинальный файл, содержащий строку "These are a few words.", и измененный файл, содержащий строку "These still are just a few words." Вы можете создать эти файлы сами, если хотите запустить команду из статьи и получить тот же результат.

1c1 показывает номер строки и то, что с ней надо сделать. Обратите внимание, что может быть сразу несколько строк(например, 12,15, что означает со строки 12 до строки 15). Символ "c" означает, что патч заменит эту строку. Есть еще два других символа: "a" и "d". Они означают "добавить"(add) и "удалить"(delete) соответственно. Таким образом, синтаксис следующий: (номер строки или диапазон строк)(c,a или d)(номер строки или диапазон строк), хотя когда используются "a" или "d", одна из частей (номер строки или диапазон строк) может содержать только номер одной строки.

    Когда используется "c", номера строк слева - это строки в оригинальном файле, которые надо заменить строками, находящимися в патче, а номера строк справа - это строки, которые должны быть в пропатченном файле.

    Когда используется "a", номер слева может быть только номером одной строки, который показывает, где надо добавить строку в пропатченном файле, а номера строк справа - это строки, которые должны быть в пропатченном файле.

    Когда используется "d", номера строк слева - это строки, которые надо удалить, чтобы получить пропатченную версию файла, а номер строки справа может быть только номером одной строки, который показывает где будут строки в пропатченном файле, если они не будут удалены. Вы можете подумать, что последний номер не нужен, но не забывайте, что патч можно применить для восстаноления исходного файла. Это будет объяснено позже.

Знак "<" означает, что патч должен удалить символы после этого знака, а знак ">" означает, что символы после этого знака надо добавить. Когда надо заменить строки ("c" между номерами строк), вы увидите оба знака: и "<", и ">". Когда надо добавить строку ("a" между номерами строк), вы увидите только знак ">", а когда надо удалить строку ("d" между номерами строк), вы увидите только знак "<".

Строка "\ No newline at end of file" появилась из-за того, что я не не нажал enter после того как набрал слова. Считается хорошим тоном заканчивать текстовый файл пустой строкой. Некоторым программам она необходима для работы. Поэтому эта строка появилась после работы команды diff. Добавим пустые строки в конец файлов, и получим более короткий вывод команды diff:

1c1 < These are a few words. --- > These still are just a few words.

Как вы возможно заметили, я не объяснил что означают 3 знака "-". Они означают конец строк, которые надо заменить и начало строк на которые надо заменить. Разделение старых и новых строк. Вы увидите это знак только при замене ("c" между номерами строк).

Если мы хотим создать патч, мы должны поместить вывод команды diff в файл. Конечно это можно сделать, скопировав его из консоли и вставив в вашем любимом текстовом редакторе, а затем сохранив этот файл, но есть способ проще. Мы можем с помощью bash направить вывод команды diff в текстовый файл:

$ diff originalfile updatedfile > patchfile.patch

Опять же не забудьте заменить originalfile и updatedfile на соответствующие имена файлов. Вы наверное знаете, что опция bash ">" работает со всеми командами. Это очень полезное свойство.

Применение простого патча, который мы создали

Мы можем использовать патч, который только что создали, чтобы получить из оригинального файла обновленный. Для этого надо скопировать оригинальный файл и патч в одно и тоже место. И затем применить патч:

$ patch originalfile -i patchfile.patch -o updatedfile

Естественно, и здесь надо изменить имена файлов на необходимые. Если все прошло хорошо, должен получиться файл, идентичный обновленному. Вы можете убедиться в этом, используя команду diff с опцией "-s":

$ diff -s updatedfile /updatefile

Замените текст между [ и ] на путь к оригинальному файлу. Например, если обновленный файл, который вы использовали при создании патча находится в родительской директории вышай текущей, то "" надо заменить на ".." (bash понимает это как родительскую директорию от текущей). И конечно надо изменить имена файлов на верные.

Поздравляю! Если diff сообщила, что файлы идентичные, вы только что успешно создали и применили патч! Однако формат патча, который мы только что использовали не единственный. В следующей главе мы рассмотрим другой формат патча.

Контекстный патч

В первой главе мы создали патч, используя нормальный формат команды diff. Однако этот формат не обеспечивает контекстной зависимости, а использует строки целиком. Создадим патч для того же файла, но используя контектсный формат:

$ diff -c originalfile updatedfile

Результат получится следующий:

*** originalfile 2007-02-03 22:15:48.000000000 0100 --- updatedfile 2007-02-03 22:15:56.000000000 0100 *************** *** 1 **** ! These are a few words. --- 1 ---- ! These still are just a few words.

Как вы видите, здесь включено имя файла. Это значит, что нам не придется набирать его во время применения патча. Далее идет дата и время последнего изменения файла. строка с 15 "*" показывает начало изменений. Они показывают, что надо сделать со следующим блоком текста. Два номера 1 - это номера строк (здесь тоже может быть сразу несколько строк), а "!" означает, что строки надо заменить. Строка с "!" перед тремя "-" должна быть заменена второй строкой с "!", которая идет после трех "-"(конечно сам! не будет включен; это синтаксис контекстного формата). Как вы можете видеть, здесь нет знаков "c", "a" и "d".Действие, которое нужно сделать, определяется символом в начале строки. "!" означает замену. Другие символы - "+", "-" и " " (пробел). "+" означает добавление, "-" означает удаление, а " " означает ничего не делать: патч использует его чтобы убедиться, что он изменяет правильную часть файла.

Применять этот патч легче: при тех же условиях, что и для предыдущего патча (записываем вывод команды diff в файл, затем копируем патч и оригинал в одно и то же место), надо выполнить следующую команду:

$ patch -i patchfile.patch -o updatedfile

Вы возможно сейчас думаете: зачем нам надо указывать имя нового файла? Это надо сделать из-за того, что патч старается изменить существующий файл, а не создает новый. Это удобно при создании патча для нескольких файлов сразу. Это приводит нас к следующей цели: создание патча для дерева файлов. Рассмотрим это в следующей главе.

Получение различий между несколькими файлами

Наиболее простой способ получить различия между несколькими файлами - это положить их в одну директорию и выполнить команду diff для этой директории целиком. Вы можете просто передать команде diff в качестве параметров имена директорий вместо имен файлов:

$ diff originaldirectory/ updateddirectory/

Обратите внимание: Если в директория есть поддиректории, то надо использовать опцию "-r".

В результате должно получится что-то вроде этого:

Diff originaldirectory/file1 updateddirectory/file1
1c1 < This is the first original file. --- > This is the first updated file. diff originaldirectory/file2 updateddirectory/file2 1c1 < This is the second original file. --- > This is the second updated file. 14d13 < We"re going to add something in this file and to delete this line. 26a26 > This is line has been added to this updated file.

Обратите внимание: Я создал несколько несколько файлов для примера. Вы можете скачать архив, содержащий эти файлы: .

Как вы видите, нормальный формат содержит только имена файлов и изменяемые строки.

Теперь используем контекстный формат:

Diff -c originaldirectory/file1 updateddirectory/file1 *** originaldirectory/file1 2007-02-04 16:17:57.000000000 +0100 --- updateddirectory/file1 2007-02-04 16:18:33.000000000 +0100 *************** *** 1 **** ! This is the first original file. --- 1 ---- ! This is the first updated file. diff -c originaldirectory/file2 updateddirectory/file2 *** originaldirectory/file2 2007-02-04 16:19:37.000000000 +0100 --- updateddirectory/file2 2007-02-04 16:20:08.000000000 +0100 *************** *** 1,4 **** ! This is the second original file. S O --- 1,4 ---- ! This is the second updated file. S O *************** *** 11,17 **** C E - We"re going to add something in this file and to delete this line. S O --- 11,16 ---- *************** *** 24,28 **** --- 23,28 ---- C E + This is line has been added to this updated file. Something will be added above this line.

Первая вещь, которую вы должны были заметить - это увеличение размера; контекстный формат содержит больше информации, чем нормальный. Этого не было заметно в первом премере, так как не было контекста. Однако теперь контекст есть, и за счет него размер патча увеличился. Кроме того, вы наверное заметили, что имя файла повторяется дважды. Это возможно сделано для того, чтобы легче было понять когда начался патч следующего файла или для обеспечения лучшего восстановления.

Другой способ получить разницу между между несколькими файлами - это написать скрипт, который выполняет команду diff несколько раз и добавляет результат выполнения в один файл. Мы не будем рассматривать этот способ, так как положить все файлы в одну директорию горазда проще.

Создать патч было легко, но использование директорий ставит следующую проблему: бедут ли патч изменять только соответствующие файлы в текущей директории, или будет использовать соответствующий путь, указанный в файле? Чтобы узнать это, смотрите следующую главу!

Применение патча к нескольким файлам

В предыдущей главе мы создали патч для нескольких файлов, воспользовавшись следующей командой:

$ diff -c originaldirectory/ updateddirectory/ > patchfile.patch

Обратите внимание: мы используем контекстный формат патча, так как это является хорошим тоном.

Теперь надо использовать полученный патч. Скопируйте оригинальную директорию и патч куда-нибудь и примените следующую команду:

$ patch -i patchfile.patch

Однако возникает ошибка, что невозможно найти файлы для патча. Команда пытается найти файл file1 в текущей директории (по умолчанию патч убирает все пути перед именем файла). И конено файла нет, так как мы пытаемся обновить файлы в директории originaldirectory. Поэтому мы должны заставить патч использовать полный путь. Это делается следующим образом:

$ patch -p0 -i patchfile.patch

Обратите внимание: Вы может подумать, что можно просто переместиться в originaldirectory и запустить патч. Но это не так! Так делать не стоит: если в в патче содержатся поддиректории, то он будет искать их в рабочей директории, и не найдет, или найдет не те. Используйте опцию "-p", чтобы заставить патч искать файлы в поддиректориях.

Опция "-p" говорит патчу сколько слэшей (включая то, что перед ними, обычно директории) нужно вырезать перед именем файла (обратите внимание, что при использовании опции "-p0", патч будет будет искать файлы и в originaldirectory и в updateddirectory).Когда мы устанавливаем 0, это означает что не надо удалять пути, но можно поставить 1, чтобы удалить первый слэш, или 2, чтобы удалить два слэша, и т.д. Это может быть полезно, если если в патче используется структура каталогов, отличная от вашей. Например, если в патче используется следующая структура каталогов:

(...) *** /home/username/sources/program/originaldirectory/file1 2007-02-04 16:17:57.000000000 +0100 --- /home/username/sources/program/updateddirectory/file1 2007-02-04 16:18:33.000000000 +0100 (...)

Вам надо просто посчитать количество слэшей (/ (1) home/ (2) username/ (3) sources/ (4) program/ (5)) и передать это число в опцие "-p". Если вы используете "-p5", то патч будет искать и в originaldirectory/file1 и в updateddirectory/file1. Не забудьте, что патч рассматривает два слэша друг за другом (как в /home/username//sources) как один. Это вызвано тем, что иногда патч скрипты добавляют дополнительный слэш между директориями.

Восстановление оригинального файла из пропатченного

Иногда возникает необходимость восстановить оригинальный файл из пропатченного. Например, если в нем содержится ошибка. Для этого надо использовать опцию "-R":

$ patch -p0 -R -i patchfile.patch

Обычно эта операция проходит без ошибок, и вы получаете исходный файл. Однако лучше на всякий случай сделать резервную копию перед восстанолением файлов.

Унифицированный формат

Есть еще один формат вывода различий командой diff: унифицированный формат. Он более компактен, так как содержит уменьшенные контекстные строки. Однако он поддерживается только GNU diff и patch. Если вы его используете, вы должны быть уверены, что у пользователей, для которых патч предназначен, GNU patch. Linux допускает использование этого формата.

Унифицированный формат похож на контекстный, но это не одно и тоже. Патч в унифицированном формате можно создать так:

$ diff -u originaldirectory/ updateddirectory/

Результат будет седующий:

Diff -u originaldirectory/file1 updateddirectory/file1 --- originaldirectory/file1 2007-02-04 16:17:57.000000000 +0100 +++ updateddirectory/file1 2007-02-04 16:18:33.000000000 +0100 @@ -1 +1 @@ -This is the first original file. +This is the first updated file. diff -u originaldirectory/file2 updateddirectory/file2 --- originaldirectory/file2 2007-02-04 16:19:37.000000000 +0100 +++ updateddirectory/file2 2007-02-04 16:20:08.000000000 +0100 @@ -1,4 +1,4 @@ -This is the second original file. +This is the second updated file. S O @@ -11,7 +11,6 @@
C E -We"re going to add something in this file and to delete this line. S O @@ -24,5 +23,6 @@ C E +This is line has been added to this updated file. Something will be added above this line.

Как вы видите, номера строк заключены между "@". Кроме того, есть дополнительный пробел после "+" или "-". Это экономит несколько байт. Другое различие: в унифицированном формате нет специального знака для замены. Он просто удаляет старые строки ("-") и добавляет новые ("+"). Разница между этими действиями заключается в том, что при замене используется один и тот же номер строки, а при удалении и добавлении разные.

Сравнение форматов

Читая про три разных формата, вы вероятно задумались: а какой же выбрать? Вот небольшое сравнение:

    Нормальный формат наиболее совместимый. Любые команды похожие на diff/patch должны понять его. Его недостаток - это отсутствие контекста.

    Контекстный формат широко распространен, но не все команды его понимают. Его преимущество в наличии контекста.

    Унифицированный формат тоже включает контекст, и при этом более компактем. Но его поддерживает только GNU diff and patch.

Если вы уверены, что патч буду использовать только пользователи с GNU diff/patch, то лучше всего выбрать унифицированный формат, так как он более компактный. В большинстве других случаев лучший выбор - это контекстный формат. Нормальный формат следует использовать если вы уверены, что пользователь будет применять патч командами, не поддерживающими контекстный формат.

Изменение количества контекстных строк

Можно заставить команду diff включать в патч сеньшее количество строк контекста, чем должно быть. В больших патчах это может сильон уменьшить его размер. Однако если уменьшить количество контекстных строк, это может привести в неработоспособности патча. Цитати из справки GNU diff: "Для большинства операций в патче должно быть хотя бы две строки контекста."

Указать количество контестных строк можно несколькими способами:

    Если вы хотит использовать контекстный формат, вы можете вы можете совместить эти указания, добавив в опцию "-C". Пример:

    $ diff -C 2 originaldirectory/ updateddirectory/

    Предыдущая команда будет использовать контекстный формат с двумя контекстными строками.

    Если вы хотит использовать контекстный формат, вы можете вы можете совместить эти указания, добавив в опцию "-U". Пример:

    $ diff -U 2 originaldirectory/ updateddirectory/

    Предыдущая команда будет использовать унифицированный формат с двумя контекстными строками.

    Если не указывать какой формат вы хотите использовать, то команда будет выглядеть примерно так:

    $ diff -2 originaldirectory/ updateddirectory/

    Однако это будет работать только если вы определите формат. Вам необходимо использовать эту опцию или с "-c" или с "u".

Заключительные слова

Несмотря на то, что эта статья описывает множество особенностей работы команд diff и patch, она не может описать все их возможности. Если вы хотите узнать больше об этих командах, вы можете прочитать страницу помощи по этим командам и

Главный писатель по вопросам технологий

Вам кто-то послал по электронной почте файл PATCH, и вы не знаете, как его открыть? Может быть, вы нашли файл PATCH на вашем компьютере и вас заинтересовало, что это за файл? Windows может сказать вам, что вы не можете открыть его, или, в худшем случае, вы можете столкнуться с соответствующим сообщением об ошибке, связанным с файлом PATCH.

До того, как вы сможете открыть файл PATCH, вам необходимо выяснить, к какому виду файла относится расширения файла PATCH.

Tip: Incorrect PATCH file association errors can be a symptom of other underlying issues within your Windows operating system. These invalid entries can also produce associated symptoms such as slow Windows startups, computer freezes, and other PC performance issues. Therefore, it highly recommended that you scan your Windows registry for invalid file associations and other issues related to a fragmented registry.

Ответ:

Файлы PATCH имеют Uncommon Files, который преимущественно ассоциирован с Unknown Apple II File (found on Golden Orchard Apple II CD Rom).

Файлы PATCH также ассоциированы с Elonex ONEt+ Patchn File (Elonex), General Patch File и FileViewPro.

Иные типы файлов также могут использовать расширение файла PATCH. Если вам известны любые другие форматы файлов, использующие расширение файла PATCH, пожалуйста, свяжитесь с нами , чтобы мы смогли соответствующим образом обновить нашу информацию.

Как открыть ваш файл PATCH:

Самый быстрый и легкий способ открыть свой файл PATCH - это два раза щелкнуть по нему мышью. В данном случае система Windows сама выберет необходимую программу для открытия вашего файла PATCH.

В случае, если ваш файл PATCH не открывается, весьма вероятно, что на вашем ПК не установлена необходимая прикладная программа для просмотра или редактирования файлов с расширениями PATCH.

Если ваш ПК открывает файл PATCH, но в неверной программе, вам потребуется изменить настройки ассоциации файлов в вашем реестре Windows. Другими словами, Windows ассоциирует расширения файлов PATCH с неверной программой.

Установить необязательные продукты - FileViewPro (Solvusoft) | | | |

PATCH Инструмент анализа файлов™

Вы не уверены, какой тип у файла PATCH? Хотите получить точную информацию о файле, его создателе и как его можно открыть?

Теперь можно мгновенно получить всю необходимую информацию о файле PATCH!

Революционный PATCH Инструмент анализа файлов™ сканирует, анализирует и сообщает подробную информацию о файле PATCH. Наш алгоритм (ожидается выдача патента) быстро проанализирует файл и через несколько секунд предоставит подробную информацию в наглядном и легко читаемом формате.†

Уже через несколько секунд вы точно узнаете тип вашего файла PATCH, приложение, сопоставленное с файлом, имя создавшего файл пользователя, статус защиты файла и другую полезную информацию.

Чтобы начать бесплатный анализ файла, просто перетащите ваш файл PATCH внутрь пунктирной линии ниже или нажмите «Просмотреть мой компьютер» и выберите файл. Отчет об анализе файла PATCH будет показан внизу, прямо в окне браузера.

Перетащите файл PATCH сюда для начала анализа

Просмотреть мой компьютер »

Пожалуйста, также проверьте мой файл на вирусы

Ваш файл анализируется... пожалуйста подождите.

В дополнение к объяснению того, как применять и отменять патчи, здесь приводится краткое описание структуры различных ветвей ядра (и примеров того, как применять их конкретные патчи).

Что такое патч (patch)?

Патч, или заплатка — это небольшой текстовый документ, содержащий суть изменений между двумя разными версиями исходных текстов. Патчи создаются с помощью программы "diff". Для правильного применения патча вам нужно знать, на основе чего он был создан, и в какую новую версию патч превратит исходные тексты ядра. И то и другое может быть представлено в метаданных файла патча и, возможно, в его названии.

Как применить или отменить патч?

Патч применяется с помощью программы "patch". Эта программа читает файл различий (или патч) и делает изменения в нужных местах исходных текстов.

Патчи для ядра Linux генерируются относительно родительского каталога, содержащего исходные тексты ядра.

Это означает, что пути к файлам внутри файла патча содержат имя директории исходных текстов ядра, относительно которой этот патч генерировался (или имена некоторых других директорий подобно «a/» или «b/»).

Поскольку это имя вряд ли будет совпадать с именем директории исходных текстов ядра на вашей машине (хотя часто оно помогает увидеть, для какой версии ядра был создан данный патч), вам следует перейти в свою директорию, содержащую исходные тексты ядра и затем отбросить первый элемент в путевых именах файлов в файле патча до того, как его применить (для этого служит ключ -p1 в программе "patch").

Чтобы отменить примененный патч, используйте ключ -R. Например, если вы применили патч следующим образом:

Patch -p1 < ../patch-x.y.z

то отменить его можно так:

Patch -R -p1 < ../patch-x.y.z

Как передавать файл заплатки/патча программе "patch"?

Это (как и в других Unix-подобных системах) может быть сделано несколькими способами. Во всех примерах, указанных ниже, я передаю файл (в разархивированном виде) программе через стандартный ввод, используя следующий синтаксис:

Patch -p1 < path/to/patch-x.y.z

Программе "patch" можно передать имя файла, используя ключ -i, как в следующем примере:

Patch -p1 -i путь/к/патчу-x.y.z

Если файл патча содержится в архиве gzip или bzip, и вы не хотите распаковывать его заранее, можно вызвать "patch" так:

Zcat path/to/patch-x.y.z.gz | patch -p1 bzcat path/to/patch-x.y.z.bz2 | patch -p1

Если файл патча содержится в архиве, и вы хотите разархивировать его вручную до применения, (в примерах ниже это предполагается), это можно сделать так:

Gunzip patch-x.y.z.gz bunzip2 patch-x.y.z.bz2

Это даст вам обычный текстовый файл, который можно передавать программе "patch" через стандартный ввод или через ключ -i, как вам захочется.

К числу других интересные ключей программы "patch" относятся -s, вынуждающий программу не выводить никаких сообщений, кроме сообщений об ошибках, что позволяет лучше их заметить, и ключ --dry-run который заставляет программу просто выдать листинг того, что будет происходить, а в реальности ничего не менять. Наконец, ключ --verbose указывает программе "patch" о потребности вывода максимума информации о происходящем.

Основные ошибки

Когда программа "patch" применяет патч, она пытается проверить файл разными способами. В частности, проверяется, что файл является допустимым патч-файлом и что код, окружающий биты, которые должны быть изменены, соответствует контексту патча.

Если программа "patch" считает, что в патче что-то выглядит неправильно, она может выбрать один из вариантов поведения — отказаться проводить изменения и закончить работу или попытаться найти способ применения патча с небольшими изменениями.

Один из примеров ситуации «что-то не так», которую программа пытается исправить, — это когда контекст изменений присутствует, нужные строки находятся, но у них другие номера. Так может случиться, к примеру, если программа "patch" делает изменения в середине файла, но по каким-то причинам несколько строк в начале файла были добавлены или удалены. Если все остальное в порядке, программа обычно подгоняет номера строк и применяет патч.

Всякий раз, когда программа "patch" применяет патч с его предварительной модификацией, она сообщает вам, что патч применен с "подгонкой" ("fuzz").

Вы должны быть осторожны с подобными изменениям, поскольку даже если все выглядит верно, это не всегда так, и что-либо может быть неправильно.

Когда программа встречает изменения, которые она не может сделать даже с подгонкой, она отвергает их и производит файл с расширением.rej (reject file). Вы можете прочитать его, чтобы точно узнать, какие изменения не удалось применить, и при желании что-то исправить.

Если вы не применяете к исходным текстам своего ядра неофициальные патчи, а используете только патчи с ресурса kernel.org, применяя их в правильном порядке, и не делаете самостоятельных изменений в исходных текстах ядра, то вы никогда не увидите сообщений "fuzz" или "reject" от программы "patch". Если они будут выдаваться, это свидетельствует об порче ваших локальных исходных текстов или скаченного патча. Вам стоит попробовать снова закачать патч, а если и это не устранит проблемы, то следует скачать полные исходные тексты ядра с kernel.org.

Давайте посмотрим на другие сообщения, которые может генерировать программа "patch".

Если программа останавливается и выводит сообщение "File to patch:", значит она не смогла найти файл патча. Обычно это означает, что вы забыли указать ключ -p1 или находитесь не в нужной директории. Но иногда так случается, когда вы применяете патч, для которого нужен ключ -p0, а не -p1 (исследуйте файл патча на предмет этого, и если это так, то это ошибка человека, создавшего патч, и она поправима).

Если вы получили сообщение "Hunk #2 succeeded at 1887 with fuzz 2 (offset 7 lines)." или подобное, это означает, что программа "patch" регулировала применяемые изменения (в данном случае пришлось передвинуться на 7 строк от того места, где они должны были применяться, чтобы их стало можно применить). Результирующий файл может получиться правильным или неправильным в зависимости от причин, по которым исходный файл был не таким, как ожидалось. Так часто случается, когда вы пытаетесь применить патч не к той версии ядра.

Если вы получили сообщение "Hunk #3 FAILED at 2387.", это означает что программа не смогла применить патч даже с подгонкой. В этом случае генерируется файл.rej с информацией о неудавшемся изменении, а также файл с расширением.orig, содержащий оригинальный текст, который не удалось заменить.

Сообщение "Reversed (or previously applied) patch detected! Assume -R? [n]" означает, что программа обнаружила, что патч уже применен.

Если вы действительно применяли этот патч и вторичное применение — это ошибка, нажмите [n] и завершите выполнение программы. Если вы применяли его, а теперь хотели отменить, просто забыв ключ указать -R, нажмите [y]. Такое также случается, когда человек, создававший патч, поменял местами исходный и целевой каталоги, и в этом случае применение патча и заключается в отмене изменений.

Сообщение "patch: **** unexpected end of file in patch" или "patch unexpectedly ends in middle of line" означает, что программа не может обнаружить в файле патча нужное содержание. Это значит, что либо вы некорректно загрузили патч, либо пытаетесь применить патч не в разархивированном виде, либо применяете патч, переданный через почтовый клиент или что-то и подобное, разбивающее длинные строки на две. Зачастую такие предупреждения могут легко быть устранены путем объединения (конкатенации) таких двойных строк.

Как ранее указывалось, эти ошибки не могут проявиться, когда вы применяете официальные патчи с ресурса kernel.org в правильном порядке и к не измененным исходным текстам ядра. Таким образом, если это случается с патчами с kernel.org, это обозначает искажение патча при загрузке или исходных текстов на вашей машине, и вам стоит полностью заново перекачать исходные тексты ядра или патч, который вы намерены применить.

Есть ли альтернативы программе "patch"?

Они есть.

Можно использовать программу "interdiff" (http://cyberelk.net/tim/patchutils/) для создания патча, представляющего разницу между двумя патчами, и дальнейшего его применения.

Она позволит вам перейти, например, от 2.6.12.2 к 2.6.12.3 за один шаг. Флаг -z программы interdiff позволяет работать с патчами в архивах gzip и bzip2, не извлекая их заранее вручную и без использования zcat и bzcat.

Вот пример:

Interdiff -z ../patch-2.6.12.2.bz2 ../patch-2.6.12.3.gz | patch -p1

Однако, хотя эта программа поможет вам сэкономить один или два шага, рекомендуется применять все шаги, поскольку в некоторых случаях interdiff может сработать неправильно.

Другой альтернативой является сценарий "ketchup", написанный на языке python, который автоматически скачивает и применяет патчи (http://www.selenic.com/ketchup/).

Другими интересными инструментами являются diffstat, который показывает сводку изменений, сделанных программой patch; lsdiff, который выводит краткий перечень файлов, затрагиваемых заданным патч-файлом, вместе с номерами изменяемых строк; и grepdiff, показывающий список файлов, модифицируемых патчем, для которых элементы патча содержат заданное регулярное выражение.

Где я могу скачать патчи?

Не инкрементальность патча означает, например, что патч 2.6.12.3 подходит для обновления основной версии 2.6.12, но не промежуточной версии 2.6.12.2. Для применения патча 2.6.12.3 к существующему ядру 2.6.12.2 вы должны сперва отменить патч 2.6.12.2 (перейти назад к версии 2.6.12), а затем применить патч 2.6.12.3.

Вот небольшой пример:

$ cd ~/linux-2.6.12.2 # переход в директорию текстов ядра

$ patch -p1 -R < ../patch-2.6.12.2 # отмена 2.6.12.2 патча

$ patch -p1 < ../patch-2.6.12.3 # применение нового 2.6.12.3 патча

$ cd .. $ mv linux-2.6.12.2 linux-2.6.12.3 # переименование

Ядра -rc: релиз-кандидатные ядра

Это опытные ядра, выпускаемые Линусом, когда он сочтет, что текущее дерево git (приложение управления исходными текстами ядра) находится в состоянии, достаточно пригодном для тестирования.

Эти ядра не стабильны, и вам следует ожидать периодических проблем, если собираетесь их запускать. Однако они наиболее стабильны среди всех опытных ветвей ядра и, кроме того, в конечном итоге превращаются в стабильное ядро. Таким образом, очень важно тестировать их многим людям.

Это хороший выбор для тех, кто хочет тестировать новые ядра, но, на самом деле, не хочет экспериментировать. (Таким людям следует прочитать ниже разделы -git и -mm ниже).

Патчи -rc — не инкрементальные, они применяются к базовому ядру 2.6.x , подобно патчам 2.6.x.y, отмеченным выше. Часть номера версии ядра до суффикса -rcN указывает номер версии ядра, в которую, в конечном счете, все должно превратиться.

Таким образом, 2.6.13-rc5 означает, что это пятый кандидат-релиз для ядра 2.6.13, и патч должен применяться к версии 2.6.12.

Вот три примера наложения этого патча:

# первый пример, делающий из 2.6.12 версию 2.6.13-rc3

$ cd ~/linux-2.6.12 # переход в директорию текстов ядра

$ patch -p1 < ../patch-2.6.13-rc3 # применение патча

$ cd .. $ mv linux-2.6.12 linux-2.6.13-rc3 # переименование

# переход из 2.6.13-rc3 в 2.6.13-rc5 $ cd ~/linux-2.6.13-rc3 # переход в директорию текстов ядра

$ patch -p1 -R < ../patch-2.6.13-rc3 # отмена патча 2.6.13-rc3

$ patch -p1 < ../patch-2.6.13-rc5 # применение нового 2.6.13-rc5 патча

$ cd .. $ mv linux-2.6.13-rc3 linux-2.6.13-rc5 # переименование

# наконец попытка перехода от 2.6.12.3 к 2.6.13-rc5

$ cd ~/linux-2.6.12.3 # переход в директорию

$ patch -p1 -R < ../patch-2.6.12.3 # отмена 2.6.12.3 патча

$ patch -p1 < ../patch-2.6.13-rc5 # применение 2.6.13-rc5 патча

$ cd .. $ mv linux-2.6.12.3 linux-2.6.13-rc5 # переименование

Ядра -git

Эти ежедневные снимки дерева ядра Линуса (сделанные в репозитарии git, поэтому такое название).

Эти патчи обычно ежедневные и представляют текущее состояние версии Линуса. Они более экспериментальные, чем -rc ядра, поскольку генерируются автоматически даже без беглого взгляда на их работоспособность.

Патчи -git — не инкрементальные и применяются к базовому ядру 2.6.х или базовому ядру 2.6.x.rc, что видно из их имен. Патч с именем 2.6.12-git1 применяется к ядру 2.6.12, а патч с именем 2.6.13-rc3-git2 — к 2.6.13-rc3.

Вот несколько примеров применения патчей:

# из 2.6.12 к 2.6.12-git1

$ cd ~/linux-2.6.12 # переход в нужный каталог

$ patch -p1 < ../patch-2.6.12-git1 # применение патча 2.6.12-git1

$ cd .. $ mv linux-2.6.12 linux-2.6.12-git1 # переименование

# от 2.6.12-git1 к 2.6.13-rc2-git3

$ cd ~/linux-2.6.12-git1 # переход в нужную директорию

$ patch -p1 -R < ../patch-2.6.12-git1 # отмена патча 2.6.12-git1 # теперь вы имеете ядро 2.6.12

$ patch -p1 < ../patch-2.6.13-rc2 # применение патча 2.6.13-rc2 # ядро теперь 2.6.13-rc2

$ patch -p1 < ../patch-2.6.13-rc2-git3 # применение патча 2.6.13-rc2-git3 # ядро теперь 2.6.13-rc2-git3

$ cd .. $ mv linux-2.6.12-git1 linux-2.6.13-rc2-git3 # переименование

Ядра -mm

Это экспериментальные ядра, выпускаемые Андрю Мортоном (Andrew Morton).

Ветка -mm является неким видом полигона для образования патчей с новыми возможностями и другими экспериментальными особенностями.

После того, как некоторый патч доказывает свою ценность в ветке -mm в течении какого-то времени, Андрю предлагает его Линусу для включения в основную ветку.

Хотя по установленным правилам эти патчи передаются Линусу через ветку -mm, эти правила не всегда соблюдаются. Мейнтейнеры подсистем (или просто разработчики) иногда пересылают свои патчи напрямую Линусу, даже если они были объединены и протестированы в -mm (а иногда даже без предварительного тестирования в -mm).

Для обеспечения максимального тестирования в большинстве случаев следует стремиться получать патчи через -mm.

Эта ветка находится в постоянном развитии и содержит многочисленные экспериментальные возможности; имеется много отладочных патчей, не пригодных для магистральных веток и т.д. Она является наиболее экспериментальной из всех ветвей, описываемых в данном документе.

Эти ядра не подходят для использования в системах, которые должны быть стабильным, при их использовании имеется больше риска, чем при работе с ядрами из какой-либо другой ветки (не забывайте о резервном копировании — это нужно делать при использовании любого экспериментального ядра, и тем более при работе с ядрами из ветки -mm).

Для этих ядер, в дополнение ко всем другим экспериментальным патчам, как правило, поддерживаются различные изменения к основным ядрам ветки -git ядер к моменту выпуска.

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

Версии ядер -mm не выпускаются по какому-либо установленному плану, но обычно в промежутке между выпусками ядер -rc выходит несколько версий ядра -mm (обычно от одной до трех). Патчи ветки -mm применяются к базовому ядру 2.6.x (до выхода -rc версии) или к ветке -rc Линуса.

Вот несколько примеров того, как их применять:

# переход от 2.6.12 к 2.6.12-mm1 $ cd ~/linux-2.6.12 # переход в директорию 2.6.12

$ patch -p1 < ../2.6.12-mm1 # применение патча 2.6.12-mm1

$ cd .. $ mv linux-2.6.12 linux-2.6.12-mm1 # переименование

# переход от 2.6.12-mm1 к 2.6.13-rc3-mm3 $ cd ~/linux-2.6.12-mm1 $ patch -p1 -R < ../2.6.12-mm1 # отмена патча 2.6.12-mm1 # теперь вы имеете ядро 2.6.12

$ patch -p1 < ../patch-2.6.13-rc3 # применение патча 2.6.13-rc3 # теперь вы имеете ядро 2.6.13-rc3

$ patch -p1 < ../2.6.13-rc3-mm3 # применение патча 2.6.13-rc3-mm3

$ cd .. $ mv linux-2.6.12-mm1 linux-2.6.13-rc3-mm3 # переименование

На этом список разъяснений по различным ядра деревьев можно закончить.

Я надеюсь, что вам теперь ясно, как применять различные патчи и помочь в тестировании ядер.

Особая благодарность Рэнди Данлэп (Randy Dunlap), Ролфу Айке Беру (Rolf Eike Beer), Линусу Торвальсу (Linus Torvalds), Бого Эггерту (Bodo Eggert), Йоханнесу Стезенбаху (Johannes Stezenbach), Гранту Коди (Grant Coady), Павлу Мачеку (Pavel Machek) и другим, которых я забыл указать, за помощь в создании данного документа.

Любая женщина хочет выглядеть безупречно, но уставшие глаза и веки могут портить образ. Патчи сразу преобразят внешний вид. Зачем их применять – рассмотрим в статье.

Что такое патчи для глаз

Современное слово «патчи» звучит везде. Слово «патч» означает перепрограммирование. Емкий смысл привлек внимание косметологов, отсюда появились подушечки в виде полумесяца, пропитанные полезными компонентами.

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

Польза патчей

Все компоненты мгновенно проникают, усваиваются и воздействуют на кожу вокруг глаз.

Патчи применяются:

  1. При отеках : выводят влагу, восстанавливают и укрепляют сосуды, питают и разглаживают кожу.
  2. От морщин . Морщины – не всегда старость. Возможно не хватает влажности в клетках дермы. Справляются с задачей 2 типа патчей:
  • С гиалуроновой кислотой . Содержат мощные стимуляторы - антиоксиданты, пептиды и растительные экстракты. Есть серия для женщин старшего возраста с веществами, содержащими ботокс. Благодаря этим свойствам, кожа избавляется от пигментации, а морщины разглаживаются. Используйте их 1 раз в неделю.
  • С золотом . Особенность этого типа патчей - длительное время выдержки – до 50 мин. Маски имеют в составе ионы металла, витамины и глицерин. Минус - высокая стоимость.
  1. От синяков под глазами помогут пластыри содержащие пантенол, кофеин, эфирные масла. При использовании средства охладите маску – в таком состоянии она положительно влияет на сосуды.

Когда их нужно использовать

Применение экспресс-ухода возможно в любое время: после трудного дня или бессонной ночи. Пока собираетесь на работу - завтракаете и одеваетесь, маска за 20 минут подарит коже вокруг глаз свежий и отдохнувший вид.

Использовать патчи можно как разово, так и неоднократно - 2-3 раза в неделю в течение месяца. Эффект от масок будет накопительным и позволит разгладить мелкие морщинки.

Лучшие патчи

Petitfee, Black Pearl & Gold Hydrogel Eye Patch

Например, продукт с золотом и жемчугом Petitfee, Black Pearl & Gold Hydrogel Eye Patch популярен у любителей этого вида масок. Черные с золотой посыпкой патчи имеют удобную каплевидную форму.

Положительные отзывы об этой марке в том, что эти гидрогелевые пластыри плотно прилегают к коже, не вызывают дискомфорта, а в результате вы ощутите эффект. Они увлажняют, устраняют припухлости, разглаживают мелкие морщинки, отбеливают и улучшают внешний вид – как и заявлено производителями.

Gold Racoony (Secret Key)

Эти патчи помещены в коробку с изображением енота. Золотые пластыри успокаивают, разглаживают кожу, увлажняют и повышают упругость.

Hydro-gel eye patch gold by Natalia Vlasova

Это патчи российского производства. Появились на рынке одними из первых, и сразу завоевали доверие клиенток. Маски имеют моментальный и накопительный эффект. Состав позволяет достигнуть результата в виде разглаживающего эффекта.

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

E.G.F Hydrogel Golden Caviar Eye Patch, Orthia

Основная функция - восстановление кожи после тяжелого дня. Данная марка справляется со своей задачей. Веки будут выглядеть отдохнувшими, красивыми и здоровыми.

Как правильно наносить патчи – инструкция

  1. Очистите кожу. Перед применением она должна быть сухой.
  2. Немного подержите маски в руках, отсоедините защитный слой и нанесите на нужную зону. Тканевые немного намочите.
  3. При использовании патчей от темных кругов расположите их ближе к внутреннему веку. При разглаживании - ближе к вискам. Главное правило - кожа не должна собираться под маской.
  4. Изучите инструкцию – патчи отличаются друг от друга, поэтому время носки разное. Чаще маску следует держать 15-30 минут. Продолжительность тканевых пластырей - 40-60 минут.
  5. Снимайте патчи в правильном направлении - от носа к вискам, чтобы не повредить нежную кожу век.
  6. Не мойте лицо после использования масок. Излишки средства распределите по лицу как обычный крем.
  7. Приступайте к макияжу.

Как часто использовать патчи

Патчи можно использовать ежедневно, а можно 1-3 раза в неделю в течение нескольких месяцев. Можно пройти курс - 20-30 процедур в 3 месяца. Все зависит от того, насколько вы хотите изменить внешний вид. Для мгновенного эффекта подойдут экспресс-маски, для накопительного - следует применять дольше.

Какие патчи выбрать – зависит от вас. Цены и ассортимент разнообразны. Результаты вы заметите после первого применения, поэтому спорить об эффективности экспресс-масок нет смысла.

И я не хочу испортить то, что у меня есть. Ниже я опубликовал полный контент, который я нашел в Интернете, и это был чей-то ответ на вопрос, похожий на мой.

В Tue, 2007-03-20 в 14:32 -0500, Джеймс Боттомли писал:

Установлен ли MODULE в "n"? Похоже, что экспорт символов охраняется #ifdef MODULE по какой-то причине … кроме этого, я не могу это объяснить.

На самом деле, это ошибка … модульная конфигурация MODULES не MODULE. Можете ли вы попробовать это:

--- diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig diff --git a/drivers/scsi/scsi_scan.cb/drivers/scsi/scsi_scan.c index 0949145..a67f315 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -181,10 +181,8 @@ int scsi_complete_async_scans(void) return 0; } -#ifdef MODULE /* Only exported for the benefit of scsi_wait_scan */ EXPORT_SYMBOL_GPL(scsi_complete_async_scans); -#endif /** * scsi_unlock_floptical - unlock device via a special MODE SENSE command

Я нашел код выше онлайн как решение проблемы, с которой я столкнулся. Я пытаюсь создать модули для собственного ядра. Мой вопрос: как я могу применить вышеуказанный патч, пожалуйста? Думаю, я должен быть в каталоге, который я могу видеть /drivers , не так ли? Что мне делать после этого, пожалуйста?

Вот ошибка, которую я получаю, когда я выпускаю «make modules» для сборки своего ядра и связанных с ним драйверов устройств:

Sansari@ubuntu:~/WORKING_DIRECTORY$ make modules scripts/kconfig/conf --silentoldconfig Kconfig sound/soc/codecs/audience/Kconfig:40:warning: type of "SND_SOC_ES_SLIM" redefined from "boolean" to "tristate" sound/soc/codecs/audience/Kconfig:43:warning: type of "SND_SOC_ES_I2C" redefined from "boolean" to "tristate" sound/soc/codecs/audience/Kconfig:44:warning: choice value used outside its choice group sound/soc/codecs/audience/Kconfig:41:warning: choice value used outside its choice group CHK include/linux/version.h CHK include/generated/utsrelease.h make: `include/generated/mach-types.h" is up to date. CC arch/arm/kernel/asm-offsets.s GEN include/generated/asm-offsets.h CALL scripts/checksyscalls.sh CC [M] drivers/scsi/scsi_wait_scan.o Building modules, stage 2. MODPOST 1 modules ERROR: "__aeabi_unwind_cpp_pr0" undefined! ERROR: "__aeabi_unwind_cpp_pr1" undefined! ERROR: "scsi_complete_async_scans" undefined! ERROR: "wait_for_device_probe" undefined! make: *** [__modpost] Error 1 make: *** Error 2

@faheem – Спасибо. Я до сих пор не знаю, к каким файлам применить это изменение. Может ли кто-нибудь объяснить, что делает исправление? Какие файлы он обновляет и как? Мое понимание патча заключается в том, что вы добавляете его в файл. Он имеет несколько строк до и после изменения. Программа соответствует строкам в целевом файле, а затем применяет это изменение. Правильно ли я говорю, что выше исправление меняет kconfig и scsi_scan.c?

One Solution collect form web for “Как применить патч?”

Патчи применяются 1 с помощью команды patch . Каталог drivers/ который вы ищете, находится на верхнем уровне исходного дерева ядра; вы примените его примерно так:

$ cd ~/linux $ ls arch firmware lib README usr block fs MAINTAINERS REPORTING-BUGS virt COPYING include Makefile samples vmlinux CREDITS init mm scripts vmlinux-gdb.py crypto ipc modules.builtin security vmlinux.o debian Kbuild modules.order sound Documentation Kconfig Module.symvers System.map drivers kernel net tools $ patch -p1 < ~/path/patch-file.diff

Это в том, чтобы показать вам, что вы должны ожидать от правильного каталога. Некоторые из этих файлов находятся только после сборки (например, vmlinux), поэтому не беспокойтесь, если они отсутствуют. Параметр -p1 означает игнорировать -p1 a/ и b/ перед именами путей в патче (-p0 не будет игнорировать его, -p2 будет игнорировать a/drivers и т. Д.),

Это, надеюсь, ответит на ваш вопрос, но если вы на самом деле не создали свое ядро ​​без загружаемых модулей (чего у вас нет, если вы делаете make modules), вряд ли он исправит ошибку, которую вы видите.

Сноски
1 Вы также можете использовать git если вы используете его для контроля версий, но я предполагаю, что вы этого не сделали.