『Linux』补丁制作指南

这篇具有很好参考价值的文章主要介绍了『Linux』补丁制作指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

『Linux』补丁制作指南,运维笔记,1024程序员节

前言

我们在参与某些开源项目的过程当中,经常会遇到漏洞之类的问题,需要我们打补丁解决。尤其是 Linux 源码,源码代码量较多,在修改完内核并发布新内核的时候,基本采用补丁的方式进行发布,而不是将整个内核打包发布

我们使用补丁发布有很多好处

  • 补丁体积很小,方便成员获取
  • 补丁方便保存,本地可以保存多个版本内核
  • 使用方便快捷,直接将补丁放到源码对应目录,然后执行相应命令即可

注:博主本人并没有给 linux 提过补丁,本文仅为学习提交补丁的记录,希望对大家有帮助,勿喷

如果了解这方面的佬,也欢迎评论区交流

diff / patch

生成补丁

我们以经典的 linux 0.11 版本源码为例,假如说我们当前目录下有两个源码文件夹,未经修改的源码文件夹为 linux-0.11,以及修改完毕的补丁源码 linux-0.11-new

注:linux 0.11 是早期的 Linux 内核版本,发布于 1991 年,相当古老,仅供学习使用,但是工程上已经没有使用价值,最新版内核可以到下方的源码库寻找

linux 源码库:torvalds/linux: Linux kernel source tree (github.com)

linux 0.11 源码库:karottc/linux-0.11: the source code of linux-0.11 for study linux kernel (github.com)

『Linux』补丁制作指南,运维笔记,1024程序员节

我们可以拉取两份 linux 0.11 源码,其中一份保持原样,另外一份做出相应修改,并且重命名文件夹为 linux-0.11-new

注:我这里拉取源码时使用参数 --exclude=.git 排除 .git 文件夹,防止后续打补丁干扰。如果 git 版本过低,没有该功能,可以先克隆,再删除文件夹

git clone --exclude=.git git@github.com:karottc/linux-0.11.git

或者是

git clone git@github.com:karottc/linux-0.11.git
git clone git@github.com:karottc/linux-0.11.git ./linux-0.11-new
rm -rf linux-0.11/.git
rm -rf linux-0.11-new/.git

然后使用下面的 diff 命令,输出原始源码和修改之后的源码的文件区别,并重定向输出到 linux.patch 补丁文件中

sudo diff -uprN linux-0.11/ linux-0.11-new/ > linux.patch

注:.patch 为约定俗称的补丁文件扩展名,尽量遵守规范,除此之外名字可以随便起

『Linux』补丁制作指南,运维笔记,1024程序员节

参数解释:

  • -u: 生成统一格式的差异输出,通常用于生成补丁文件。
  • -p: 在差异输出中显示更多的上下文信息,以方便阅读。
  • -r: 对目录进行递归比较,而不仅仅比较单个文件。
  • -N: 当比较的文件是空文件时,也显示差异信息。

使用补丁

我们可以直接在当前目录下执行如下打补丁命令

patch -p0 < linux.patch

注:-p 参数代表忽略哪级文件路径,0 标识去掉全路径,1 标识去掉第一层路径

或者是进入未经修改的 linux 源码根目录下执行如下打补丁命令

patch -p1 < ../linux.patch

注:这里的重定向符号大家注意不要写反,我开始就写反了,然后执行命令后系统就会卡死,不会报错,但是也不会终止

我这里简单作为示例,仅修改了 README.md 文件

『Linux』补丁制作指南,运维笔记,1024程序员节

举例解释 -p 参数,比如说 patch 文件片段如下

--- 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

最后我们可能出现冲突,通常是因为原始文件已经被修改过,这时我们只需要手动解决这些冲突,然后重新执行补丁即可

注:但是建议最好不要手动修改原版代码,不然后续改比较麻烦

撤销补丁

我们可以执行如下命令撤销补丁

patch -Rp0 < linux.patch

或者是进入未修改源码根目录,然后执行如下命令

patch -Rp1 < ../linux.patch

单文件补丁

上面是对于整个文件夹打补丁,下面将会讲解如何对单个文件打补丁

使用单独文件依次打补丁,可以更加有效的验证补丁正确性,方便后续进行功能测试

比如说我们当前目录有原文件 a.c ,修改之后的文件 b.c,我们可以使用如下命令生成补丁文件

diff -u a.c b.c > test.patch
# 使用补丁
patch a.c < test.patch
# 撤销补丁
patch -RE < test.patch

quilt

简介

当我们在开发自己项目的过程中,可能会只制作大量补丁,管理这些数量庞大的补丁会非常耗费时间

所以 linux 内核开发者 Andrew Morton 开发出 quilt 补丁管理工具,以帮助我们更好的管理补丁

官方相关文档

  • quilt-doc.dvi (shakthimaan.com)
  • Linux Kernel Configuration - Managing Your Patches With quilt (linuxtopia.org)
  • quilt man | Linux Command Library

本章将会简单讲解 quilt 使用流程,更多详细信息可以查看上方官方文档

使用

只要我们在源代码树里使用了 quilt 命令,quilt 就会在源代码树的根目录建立两个特殊目录:patches 和.pc

patches 文件夹下为管理的补丁文件

.pc 文件夹下保存着其内部工作状态

可以使用如下命令安装

sudo apt-get install quilt

新建补丁文件

quilt new xxx.patch

补丁文件关联修改文件,关联后即可对文件进行修改,如要关联多个文件,重复添加然后修改即可

quilt add file

查看补丁是否正确

quilt diff

保存补丁,之后补丁文件会保存在 patches

quilt refresh

git

git 提供了两种补丁方案

  • git diff 生成的 .diff 文件
  • git format-patch 生成的 .patch 文件

git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成

git format-patch 生成的 .patch 文件 含有 commmit 信息,一个 commit 对应一个 patch 文件

注:本章将会简单讲解 git 补丁流程,如果您需要更详细的文档说明,博主会将在每小章开头附上 git 官网文档链接,供您参考

git diff

官方文档:Git - git-diff Documentation (git-scm.com)

制作补丁命令如下

# 单独文件补丁
git diff Test.java > test.patch
# 所有文件补丁
git diff  > test.patch

指定 commit id 制作补丁

git diff [commit sha1 id] [commit sha1 id]> test.patch

git format-patch

官方文档:Git - git-format-patch Documentation (git-scm.com)

制作当前分支超前于指定分支提交的补丁

注:命令示例即为制作超前于 master 分支的补丁

git format-patch -M master

制作某次提交以后的补丁

git format-patch [commit id]

某两次提交之间补丁

git format-patch [commit sha1 id]..[commit sha1 id]

应用补丁

检查补丁文件

git apply --stat   xxx.patch

检查能否应用成功

git apply --check xxx.patch

使用补丁

git am --signoff < xxx.patch

但是可能会出现我们上面提到的冲突,导致使用补丁失败,出现如下错误

$ git am PATCH
Applying: PACTH DESCRIPTION
error: patch failed: file.c:137
error: file.c: patch does not apply
error: patch failed: Makefile:24
error: libavfilter/Makefile: patch does not apply
Patch failed at 0001 PATCH DESCRIPTION
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

解决冲突

使用下面命令自动合并不冲突代码,保留冲突部分

执行后会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决

解决完冲突后删除后缀为 .rej 的文件,然后提交代码到源码库即可文章来源地址https://www.toymoban.com/news/detail-714159.html

git  apply --reject  xxxx.patch

参考链接

  • linux内核生成补丁和打补丁的方法 - 知乎 (zhihu.com)
  • 为文件/文件夹打补丁 - 简书 (jianshu.com)
  • Linux diff 命令 | 菜鸟教程 (runoob.com)
  • Linux patch命令 | 菜鸟教程 (runoob.com)
  • patch 命令打补丁,diff 命令制作补丁-腾讯云 (tencent.com)
  • Linux 下打 patch-腾讯云开发者社区-腾讯云 (tencent.com)
  • Quilt初探 - 使用 quilt 產生和管理 patch
  • quilt补丁制作 | Luobu (luobudiao.github.io)
  • 提交第一份 Patch 到 Linux Kernel - HackMD

到了这里,关于『Linux』补丁制作指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 好用且免费的CodeWhisperer,给1024程序员节送礼来了

          国庆期间没有胆量去人从众的景点,关在家里刷手机时意外在亚马逊的User Group公众号上发现了CodeWhisperer这么个好东西(bu yao qian),以后撸代码也可以提高生产力(fang yang mo yu)了,这还不赶紧上手试一下。看官方介绍说它支持流行的IDE开发工具,包括VS Code、Intelli

    2024年02月08日
    浏览(53)
  • 1024程序员节带你玩转图片Exif信息获取之JavaScript

    目录 一、前言 二、背景 三、Exif.js          1、Exif.js 简介 2、Exif.js 引入 四、多场景展示数据获取 1、原始图片直接获取  2、base64 编码文件加载  3、文件上传的方式加载  五、总结        1024是2的十次方,二进制计数的基本计量单位之一。1G=1024M,而1G与1级谐音,也有一

    2024年02月20日
    浏览(60)
  • 1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

    Spring实战系列文章: Spring实战 | Spring AOP核心秘笈之葵花宝典 Spring实战 | Spring IOC不能说的秘密? 国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题

    2024年02月08日
    浏览(81)
  • 1024程序员狂欢节 | IT前沿技术、人工智能、数据挖掘、网络空间安全技术

    一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理了前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术,四大热点领域近期

    2024年02月06日
    浏览(66)
  • 1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月07日
    浏览(84)
  • 1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    浏览(54)
  • 1024程序员节?我们整点AI绘图玩玩吧,一文教你配置stable-diffusion

    需提前准备:一台高性能的电脑(尤其是显存)、python、Git、梯子。 其实Github上有很多关于Stable diffusion的库,综合对比之后,我选取的是比较全面的AUTOMATIC1111这个,源码链接:Stable-diffusion(Github) 找到安装那块的教程,此教程以windows为例。 ps:如果你电脑上已经有了pyt

    2024年01月16日
    浏览(74)
  • PHP框架开发实践 | 1024 程序员节:通过index.php找到对应的controller是如何实现的

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:PHP进阶实战教程。 🎉欢迎 👍点赞✍评论⭐收藏

    2024年02月08日
    浏览(71)
  • Linux命令基础,黑马程序员学习笔记

    command [-options] [parameter] command:命令本身 -options:[可选,非必填]命令的一些选项,可以通过选项控制命令的行为细节 parameter:[可选,非必填]命令的参数,多数用于命令的指向目标等 示例: ls -l /home/itheima ls是命令本身,-l是选项, /home/itheima是参数意思是以列表的形式,显示/home

    2024年02月19日
    浏览(100)
  • 1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

    🌹欢迎来到 爱书不爱输的程序猿 的博客, 本博客致力于知识分享,与更多的人进行学习交流 🚩🚩🚩 点击直达福利 一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理

    2024年02月08日
    浏览(79)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包