文档章节

Ubuntu14.04下kpatch源码安装使用

BookShu
 BookShu
发布于 2016/12/08 20:21
字数 1468
阅读 98
收藏 1
点赞 0
评论 0

背景

  Kpatch是给Linux内核打热补丁的工具,所谓热补丁,就是指打完补丁后,补丁可立即生效,而不需要像传统打补丁那样必须重启Linux才能生效。

Kpatch简介

  最早出现的打热补丁工具不是Kpatch,而是Ksplice。但是Ksplice被Oracle收购后,一些发行版生产商就不得不开发自己的热补丁工具,分别是Redhat的Kpatch和Suse的KGraft。同时,在这两家厂商的推进下,kernel4.0开始,开始集成了livepatch技术,该技术和其他热补丁技术类似。
  Kpatch虽然是Redhat研发,但其也支持Ubuntu、Debian、Oracle Linux等的发行版,本文将介绍在Ubuntu14.04下安装和使用Kpatch软件。

不足

  热补丁不是万能的,尤其是现在技术还不足够成熟的时候。在使用Kpatch热补丁前,我们需要知道Kpatch的不足之处:
    1.如果在已经打过patch的环境继续打patch,那么新patch必须是基于上个patch打的补丁。
    2.不支持修改数据结构的patch,如果有这样的patch,用户必须改代码。
    3. 不支持修改__init函数的补丁。
    4.不支持修改静态数据。
    5.不支持修改vdso的函数,因为其运行在用户空间。

准备

  注意:必须保证有15GB的空闲磁盘空间,以便在~/.kpatch下生成中间缓存文件。   1.安装编译Kpatch所需的依赖环境:

apt-get install make gcc libelf-dev

  安装kptch-build运行所需的环境:

apt-get install dpkg-dev
apt-get build-dep linux

# optional, but highly recommended
apt-get install ccache
ccache --max-size=5G

  安装内核调试信息:

# Add ddebs repository
codename=$(lsb_release -sc)
sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
EOF

# add APT key
wget -Nq http://ddebs.ubuntu.com/dbgsym-release-key.asc -O- | sudo apt-key add -
apt-get update && apt-get install linux-image-$(uname -r)-dbgsym

安装Kpatch

  从github下载源码,路径为:https://github.com/dynup/kpatch。这里我没有使用master,而是用了当前最新的branch——v0.3.4。安装较为简单:

make
make install

  **注意:**如果使用了新的内核,那么也需要重新编译并安装Kpatch,因为它会根据当前kernel版本,生成一些符号表文件。如果没有重新编译安装Kpatch,那么你在使用Kpatch-build时,就会出现“unable to find Module.symvers for kpatch core module.”的错误。

使用Kpatch

  Kpatch安装完成后,提供了kpath和kpatch-build这两个脚本程序。其中,kpatch-build通过源代码、patch文件、config文件等生成一个或多个ko模块,kpatch再加载这些ko模块,从而达到打热补丁的效果。

准备内核源代码

  从http://www.kernel.org或者其他镜像源下载3.9.0及以上的kernel版本(Kpatch不支持3.9以下的版本),尽量选择国内的镜像,下载速度会稍微快一些。我这里使用3.9版本的kernel代码。

cd /usr/src
wget http://mirror.lzu.edu.cn/kernel/v3.x/linux-3.9.tar.gz
tar zxvf linux-3.9.tar.gz
cd linux-3.9
# 生成.config文件,为了编译较快,我这里只使用较精简的config
make localmodconfig
# 编译并安装新版本的kernel
# 如果编译过程中出现什么问题,请参考其他文章解决,这里不再详述
make bzImage -j 4 && make modules -j 4 && make modules_install && make install
# 配置grub,使最新编译的kernel生效,详细配置方法可参考我其他博客
reboot

生成热补丁

  重启后,再进入/usr/src目录,做一份代码的拷贝,并在拷贝代码中,在Kpatch允许的范围内,修改一些代码,然后生成patch文件。我这里是在创建文件夹的地方增加了一行打印,调用的地方不会太多,而且容易触发,查看效果比较直观。

cd /usr/src
cp -arf linux-3.9 linux-3.9-modify
vim linux-3.9-modify/fs/namei.c
# 查找vfs_mkdir关键字,并在vfs_mkdir函数中的字段定义后,直接加入一些打印,我这里加入了“printk(KERN_ERR "kpatch test mkdir\n");”创建文件夹后,就会打印kpatch test mkdir。
# 创建patch文件
diff -Naur linux-3.9 linux-3.9-modify > my.patch

  之后,就可通过kpatch-build生成ko模块。

kpatch-build -s /usr/src/linux-3.9 /usr/src/my.patch

  上面命令行中,-s后跟kernel源代码的目录。-r后跟指定的vmlinux,若不直接指定vmlinux,kpatch就会从源目录中查找vmlinux,如上所示中,我们就没有指定vmlinux。patch文件至于最后的位置。kpatch-build更多的参数可通过命令kpatch-build --help或者man kpatch-build来查看。

打入热补丁

  kpatch-build如果运行失败,可通过日志文件~/.kpatch/build.log来查看失败的具体原因。如果运行成功,则会在当前目录生成ko文件。因为我的patch名为my.patch,根据其名称生成规则,就生成了名为kpatch-my.ko的模块文件。注意,kpatch-build生成的ko文件,不能通过insmod的方式来装载,而必须使用kpatch load来装载。并通过kpatch unload来卸载,同时,也可通过kpatch list来查看加载信息。

# kpatch load kpatch-my.ko 
loading patch module: kpatch-my.ko


# kpatch list
Loaded patch modules:
kpatch_my

Installed patch modules:

  加载成功后,再任意创建一个目录,查看/var/log/kern.log或者dmesg,相关日志如下:

# dmesg
[31478.707301] kpatch: loaded patch module 'kpatch_my'
[31839.683442] kpatch test mkdir

  期望的打印出现,证明我们这次打热补丁完美成功。

apt-get安装kpatch

  如果觉得源码安装kpatch麻烦,可直接使用apt-get安装,解决所以依赖问题。当然,这种方法不能选择自己想要的版本,而且版本偏老。

apt-get install kpatch
apt-get install kpatch-build

© 著作权归作者所有

共有 人打赏支持
BookShu
粉丝 30
博文 116
码字总数 86364
作品 0
西安
高级程序员
编译并使用kpath不重启更新linux-kernel

yum install ncurses-devel -y tar -xvf linux-4.9.3.tar.xz cd linux-4.9.3/ make menuconfig make all make modules_install make install Kpatch主要有四个组件。 kpatch-build 产生hot p......

a120518129 ⋅ 2017/01/16 ⋅ 0

打补丁无需重启补丁有望合并到 Linux 内核

甲骨文的Ksplice,SUSE的kGraft和Red Hat的kpatch,是三种不用重启就能为Linux Kernel打补丁的机制,这项功能对于基础设施运营商具有重要价值。现在,内核Live Patching机制有望在未来合并到...

oschina ⋅ 2014/11/13 ⋅ 20

steam无法安装32的包

在ubuntu14.04上使用steam的时候,估计是不小心删除了某些文件,一直提示要安装 但是安装发现总是失败。 后来看了一篇文章发现安装安卓源码也需要安装这些包,谷歌给的解决方法是安装别的包就...

geange ⋅ 2015/12/30 ⋅ 0

1 ubuntu安装docker

Ubuntu Ubuntu 14.04及以上版本 Ubuntu14.04版本官方软件源中已经自带了Docker包,可以直接安装: $ sudo apt-get update $ sudo apt-get install -y docker.io $ sudo ln -sf /usr/bin/doc......

DevOPS666 ⋅ 2017/08/22 ⋅ 0

ubuntu14.04 wifi频繁掉线

各位使用ubuntu的小伙伴们,你们的无线稳定吗,我使用的是ubuntu14.04,电脑是e530c,无线频繁掉线,基本到了无法忍受的程度。 使用的内核3.14 , 3.15,3.15,4.0,4.1,都会掉线。 我上网查,有的...

coolcao ⋅ 2015/05/04 ⋅ 8

Ubuntu安装mysql乱码,Sock等问题的提问!

本人环境,Ubuntu14.04,。对于安装mysql的若干问题 我安装的是mysql5.5 用最简单的apt-get 安装,安装之后,插入中文数据出现乱码,网上一堆说修改my.cnf的说法,完全解决不了。 之后用源码编...

JianXinTan ⋅ 2014/12/08 ⋅ 9

【腾讯云的1001种玩法】微信个人订阅号后台server搭建入门教程

搭建公众号后台server 以腾讯云自带的ubuntu14.04为例: 1.安装nginx+php7+mysql5,以及需要的扩展; 由于ubuntu14.04默认软件库为php5,需要加入第三方库,来apt-get方式安装PHP7; 当然,也...

⋅ 2017/12/18 ⋅ 0

c开源项目webbench学习

webbench是用c语言来实现的网站压力测试工具,可以并发产生3万个链接测试网站。在学习webbench时候最好先简单了解一下http协议,推荐小日本的一本书《图解http》,适合入门,图文并茂,先简单...

菏泽小朱 ⋅ 2017/04/22 ⋅ 0

各位大牛,ubuntu下 apache cgi怎么配啊? 我按照网上的方法配置完了,现在访问python脚本就会提示选择打开方式,然后按照文本方式打开了。大半天了,不知道怎么解决。

virtualbox安装的ubuntu14.04 sudo apt-get install apache2 装完apache,找不到httpd.conf文件,网上找的答案是Ubuntu的Apache配置文件是/etc/apache2/apache2.conf 但是按照http://blog.s...

rose_weep ⋅ 2014/08/17 ⋅ 8

红帽开发动态内核补丁机制,修补系统无需重启

在SUSE宣布了kGraft项目——一种不用重启就能为Linux Kernel打补丁的机制——之后,Red Hat也透露了它的类似项目kpatch。与被甲骨文公司收购的Ksplice项目一样,kpatch允许不用重启或重新启动...

oschina ⋅ 2014/03/06 ⋅ 26

没有更多内容

加载失败,请刷新页面

加载更多

下一页

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 36分钟前 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部