1. 程式人生 > >Linux下給核心或原始碼製作和打補丁操作命令--diff、patch

Linux下給核心或原始碼製作和打補丁操作命令--diff、patch

前言

在做開發的過程中難免需要給核心及下載的一些原始碼打補丁或者說是升級,所以我們學習在Linux下使用diff製作補丁以及如何使用patch打補丁顯得尤為重要。

diff與patch命令介紹

1、 diff命令

NAME

diff - find differences between two files

SYNOPSIS

diff [options] from-file to-file

--------------------

簡單的說,diff的功能就是用來比較兩個檔案的不同,然後記錄下來,也就是所謂的diff補丁。

語法格式:diff 【選項】 原始檔(夾) 目的檔案(夾),就是要給原始檔(夾)打個補丁,使之變成目的檔案(夾),術語也就是“升級”。

下面介紹三個最為常用選項:

-r 是一個遞迴選項,設定了這個選項,diff會將兩個不同版本原始碼目錄中的所有對應檔案全部都進行一次比較,包括子目錄檔案。

-N 選項確保補丁檔案將正確地處理已經建立或刪除檔案的情況。

-u 選項以統一格式建立補丁檔案,這種格式比預設格式更緊湊些。

2、 patch命令

------------------

NAME

patch - apply a diff file to an original

SYNOPSIS

patch [options] [originalfile [patchfile]]

but usually just

patch -pnum

------------------

簡單的說,patch就是利用diff製作的補丁來實現原始檔(夾)和目的檔案(夾)的轉換。這樣說就意味著你可以有原始檔(夾)――>目的檔案(夾),也可以目的檔案(夾)――>原始檔(夾)。

下面介紹幾個最常用選項:

-p0 選項要從當前目錄查詢目的檔案(夾)

-p1 選項要忽略掉第一層目錄,從當前目錄開始查詢。

在這裡以例項說明:

--- old/modules/pcitable Mon Sep 27 11:03:56 1999

+++ new/modules/pcitable Tue Dec 19 20:05:41 2000

如果使用引數-p0,那就表示從當前目錄找一個叫做old的資料夾,在它下面尋找modules下的pcitable檔案來執行patch操作。

如果使用引數-p1,那就表示忽略第一層目錄(即不管old),從當前目錄尋找modules的資料夾,在它下面找pcitable。這樣的前提是 當前目錄必須為modules所在的目錄。而diff補丁檔案則可以在任意位置,只要指明瞭diff補丁檔案的路徑就可以了。當然,可以用相對路徑,也可 以用絕對路徑。不過我一般習慣用相對路徑。

-E 選項說明如果發現了空檔案,那麼就刪除它

-R 選項說明在補丁檔案中的“新”檔案和“舊”檔案現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)

下面結合具體例項來分析和解決,分為兩種型別:為單個檔案打補丁和為資料夾內的多個檔案打補丁。

環境:在ubuntu9.10下面以ubuntu使用者登陸。

目錄樹如下:

|-- bootloader

|-- debug

|-- images

|-- kernel

|-- program

|-- rootfiles

|-- software

|-- source

|-- sysapps

|-- tmp

`-- tools

下面在program資料夾下面建立patch資料夾作為實驗用,然後進入patch資料夾。

為單個檔案進行補丁操作

1、建立測試檔案test0、test1

[[email protected] patch]$ cat >>test0<

> 111111

> 111111

> 111111

> EOF

[[email protected] patch]$ more test0

111111

111111

111111

[[email protected] patch]$ cat >>test1<

> 222222

> 111111

> 222222

> 111111

> EOF

[[email protected] patch]$ more test1

222222

111111

222222

111111

2、使用diff建立補丁test1.patch

[[email protected] patch]$ diff -uN test0 test1 > test1.patch

【注:因為單個檔案,所以不需要-r選項。選項順序沒有關係,即可以是-uN,也可以是-Nu。】

[[email protected] patch]$ ls

test0 test1 test1.patch

[[email protected] patch]$ more test1.patch

patch檔案的結構

? 補丁頭

補丁頭是分別由---/+++開頭的兩行,用來表示要打補丁的檔案。---開頭表示舊檔案,+++開頭表示新檔案。

一個補丁檔案中的多個補丁

一個補丁檔案中可能包含以---/+++開頭的很多節,每一節用來打一個補丁。所以在一個補丁檔案中可以包含好多個補丁。

? 塊

塊是補丁中要修改的地方。它通常由一部分不用修改的東西開始和結束。他們只是用來表示要修改的位置。他們通常以@@開始,結束於另一個塊的開始或者一個新的補丁頭。

? 塊的縮排

塊會縮排一列,而這一列是用來表示這一行是要增加還是要刪除的。

? 塊的第一列

+號表示這一行是要加上的。

-號表示這一行是要刪除的。

沒有加號也沒有減號表示這裡只是引用的而不需要修改。

***diff命令會在補丁檔案中記錄這兩個檔案的首次建立時間,如下***

--- test0 2006-08-18 09:12:01.000000000 +0800

+++ test1 2006-08-18 09:13:09.000000000 +0800

@@ -1,3 +1,4 @@

+222222

111111

-111111

+222222

111111

[[email protected] patch]$ patch -p0 < test1.patch

patching file test0

[[email protected] patch]$ ls

test0 test1 test1.patch

[[email protected] patch]$ cat test0

222222

111111

222222

111111

3、可以去除補丁,恢復舊版本

[[email protected] patch]$ patch -RE -p0 < test1.patch

patching file test0

[[email protected] patch]$ ls

test0 test1 test1.patch

[[email protected] patch]$ cat test0

111111

111111

111111

為多個檔案進行補丁操作

1、建立測試資料夾

[[email protected] patch]$ mkdir prj0

[[email protected] patch]$ cp test0 prj0

[[email protected] patch]$ ls

prj0 test0 test1 test1.patch

[[email protected] patch]$ cd prj0/

[[email protected] prj0]$ ls

test0

[[email protected] prj0]$ cat >>prj0name<

> --------

> prj0/prj0name

> --------

> EOF

[[email protected] prj0]$ ls

prj0name test0

[[email protected] prj0]$ cat prj0name

--------

prj0/prj0name

--------

[[email protected] prj0]$ cd ..

[[email protected] patch]$ mkdir prj1

[[email protected] patch]$ cp test1 prj1

[[email protected] patch]$ cd prj1

[[email protected] prj1]$ cat >>prj1name<

> ---------

> prj1/prj1name

> ---------

> EOF

[[email protected] prj1]$ cat prj1name

---------

prj1/prj1name

---------

[[email protected] prj1]$ cd ..

2、建立補丁

[[email protected] patch]$ diff -uNr prj0 prj1 > prj1.patch

[[email protected] patch]$ more prj1.patch

diff -uNr prj0/prj0name prj1/prj0name

--- prj0/prj0name 2006-08-18 09:25:11.000000000 +0800

+++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800

@@ -1,3 +0,0 @@

---------

-prj0/prj0name

---------

diff -uNr prj0/prj1name prj1/prj1name

--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800

+++ prj1/prj1name 2006-08-18 09:26:36.000000000 +0800

@@ -0,0 +1,3 @@

+---------

+prj1/prj1name

+---------

diff -uNr prj0/test0 prj1/test0

--- prj0/test0 2006-08-18 09:23:53.000000000 +0800

+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800

@@ -1,3 +0,0 @@

-111111

-111111

-111111

diff -uNr prj0/test1 prj1/test1

--- prj0/test1 1970-01-01 08:00:00.000000000 +0800

+++ prj1/test1 2006-08-18 09:26:00.000000000 +0800

@@ -0,0 +1,4 @@

+222222

+111111

+222222

+111111

[[email protected] patch]$ ls

prj0 prj1 prj1.patch test0 test1 test1.patch

[[email protected] patch]$ cp prj1.patch ./prj0

[[email protected] patch]$ cd prj0

[[email protected] prj0]$ patch -p1 < prj1.patch

patching file prj0name

patching file prj1name

patching file test0

patching file test1

[[email protected] prj0]$ ls

prj1name prj1.patch test1

[[email protected] prj0]$ patch -R -p1 < prj1.patch

patching file prj0name

patching file prj1name

patching file test0

patching file test1

[[email protected] prj0]$ ls

prj0name prj1.patch test0

總結

? 單個檔案

diff –uN from-file to-file >to-file.patch

patch –p0 < to-file.patch

patch –RE –p0 < to-file.patch

? 多個檔案

diff –uNr from-docu to-docu >to-docu.patch

patch –p1 < to-docu.patch

patch –R –p1

應用

為核心打補丁

1、解壓

因為釋出的補丁檔案都是使用gzip壓縮的。

$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz

2、然後進入你的核心原始碼目錄

$cd linux-2.4.21

3、打補丁

$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1

相關推薦

Linux核心原始碼製作補丁操作命令--diffpatch

前言 在做開發的過程中難免需要給核心及下載的一些原始碼打補丁或者說是升級,所以我們學習在Linux下使用diff製作補丁以及如何使用patch打補丁顯得尤為重要。 diff與patch命令介紹 1、 diff命令 NAME diff - find differences between two files

windowsLinux定時啟動關閉服務

ref sta article start 處理程序 window pin blog win http://blog.csdn.net/clare504/article/details/17410643 1、Windows下的定時啟動程序可以采用系統的計劃和任務,定時

Linux使用diffpatch製作補丁(已經實踐可行!)

簡單的說,diff的功能就是用來比較兩個檔案的不同,然後記錄下來,也就是所謂的diff補丁。語法格式:diff 【選項】 原始檔(夾)目的檔案(夾),就是要給原始檔(夾)打個補丁,使之變成目的檔案(夾),術語也就是“升級”。下面介紹三個最為常用選項: (adsbygoogle =

Linux使用核心原始碼單獨編譯某一模組

使用Linux在於折騰。生命不息,折騰不止。 在vmware中安裝了LinuxMint 18,自帶核心是4.4,於是自己手動將核心版本升級到了4.8,但是安裝新的核心後,發現vmware螢幕無法自動適應客戶機,於是 lspci -knn查看了下顯示模組,發現VGA沒有可用

Linux指定目錄指定文件類型生成md5文件

shell linux md5 對指定目錄下擴展名為.asset,.manifest,.wem,.bnk的文件計算md5並匯總到指定文件中。md5文件內容格式: 文件名,md5類似:Audio_Knives_Skill_1_43_9E69E797.wem,bc87ec6bce97e93824a0f

linuxperforce(p4)的使用方法命令

使用方法 open log bcd mman port 當前 包含 label 環境變量: export P4PASSWD=abcdefg export P4CLIENT=dyoldfish.com export P4USER=dyoldfish expor

Linux安裝mysql(離線安裝在線安裝)

命令 安裝 this glib leg rpm /usr node star 一:在線安裝mysql 1、首先檢測一下,mysql之前有沒有被安裝   命令:rpm -qa | grep mysql 2、刪除mysql的命令: rpm -e --nodeps `rpm -q

linuxcpu加壓

cal 計算 linu sca color time lin linux下 one 計算pi: time (echo "scale=500;4*a(1)"|bc -l -q) #!/bin/bashfor i in `seq 1 1000`do (time ec

Linux的文件查看編輯

linux 文件查看 文件編輯 1.查看 1) cat 查看文件內容 cat 文件名 cat file1 查看file1文件的內容(將file1的內容打印到標準輸出中) cat file1 file2 查看f

Linux更改oracle客戶端字符集服務端字符集

啟動 dia 系統 detail roc gb2 set rom com from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客戶端字符集和服務端字符集 1.Linux 下更改

linux重啟weblogic(關閉啟動)

遠程文件 hup acl middle 16px target html sin 服務器 本文轉自:http://blog.sina.com.cn/s/blog_4b5bc011010110nq.html ssh遠程連接Linux服務器! 開啟weblogic:

linux源碼安裝jdk1.8tomcat8.5

ubuntu srv hotspot 源碼安裝 tar build ali bit 低版本 Java是目前可移植性較高的語言,相當火熱,tomcat運行就需要Java語言環境 0.java簡介 1)tomcat運行需要對應的Java環境,Java環境通過安裝jdk來獲得

linux利用CC++ 語言調用需要root權限的函數

編譯程序 註意 步驟 oot 登錄 調用 get bsp 屬於 1、setuid法(1)登錄root用戶,將程序設置成root:root所有者(等價於:登錄root用戶編譯程序)。也可直接將普通用戶加入root組中,那麽編譯程序不用來回切換用戶。(2)登錄root用戶設置程

LinuxPostgreSQL主備環境搭建切換

1. 概念 資料庫熱備:資料庫熱備是指為主資料庫的建立、維護和監控一個或多個備用資料庫,它們時刻處於開機狀態,同主機保持同步。當主機失靈時,可以隨時啟用熱備資料庫來代替,以保護資料不受故障、災難、錯誤和崩潰的影響。 流複製(streaming replication):PostgreSQL提

Linux清空使用者登入記錄命令歷史的方法

清除登陸系統成功的記錄,也就是last命令看到的記錄 [[email protected] ~]# echo > /var/log/wtmp 此檔案預設開啟時亂碼的,裡面可以看到ip等等資訊 [[email protected] ~]# echo >/va

Linux,同一個指令碼使用bash sh 啟動,表現不同,sh 啟動失敗

Linux下,同一個指令碼使用bash 和sh 啟動,表現不同,sh 啟動失敗 指令碼內容 現象 原因 參考連結 指令碼內容 source setup.bash source /opt/ros/kine

【轉載】Linux各資料夾的含義用途 Linux各資料夾的含義用途

原文地址:https://www.cnblogs.com/lanqingzhou/p/8037269.html Linux下各資料夾的含義和用途 Linux根目錄”/“下各個系統資料夾的含義和用途 1、/boot 該目錄預設下存放的是Linux的啟動檔案和核心。 2、/initrd 它的英文

linuxgdb除錯檢視原始碼

 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。 &nb

Linux管理員許可權獲取(susudo的區別)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux maven 編譯 spark 原始碼

1. 安裝maven  1)將安裝包解壓到指定目錄: [[email protected] apache-maven-3.5.3]# tar -zxf /opt/maven/apache-maven-3.5.3-bin.tar.gz -C /usr/local/