文档章节

Ubuntu14.04下kpatch源码安装使用

BookShu
 BookShu
发布于 2016/12/08 20:21
字数 1468
阅读 107
收藏 1

背景

  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
0
打补丁无需重启补丁有望合并到 Linux 内核

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

oschina
2014/11/13
3.3K
20
steam无法安装32的包

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

geange
2015/12/30
28
0
红帽开发动态内核补丁机制,修补系统无需重启

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

oschina
2014/03/06
2.7K
26
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
0

没有更多内容

加载失败,请刷新页面

加载更多

精选Spring Boot三十五道必知必会知识点!

Spring Boot、Spring MVC 和 Spring 有什么区别? 1、Spring Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。 当我们恰当的使用 DI 或者是 IOC 的时候,...

java知识分子
23分钟前
1
0
docker多容器部署lnmp环境

环境:RHEL7.5 ip:192.168.10.102,主机名:lb02 一、创建web、数据库目录 web网站目录为:/wwwroot,属主属组:www [root@lb02 ~]# mkdir /wwwroot[root@lb02 ~]# useradd -s /sbin/nolo...

人在艹木中
52分钟前
1
0
eclipse运行springboot项目报错‘找不到或无法加载主类’

这是一个很烦躁的问题~,往往困住大家好长时间,然后各种百度。借此,咱将这个问题有可能产生的原因进行一下总结。若有不完善之处欢迎大家在下面留言指出~~ Duang!问题出现 然后开始尝试解决...

Code辉
今天
1
0
springboot oauth2 跨域设置

@Overridepublic void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/security/**") .authentica......

昆虫大侠
今天
1
0
08-利用思维导图梳理JavaSE-泛型

08-利用思维导图梳理JavaSE-泛型 主要内容 1.泛型的基本概念 1.1.定义 1.2.使用前提 1.3.使用泛型的好处 2.泛型的使用 2.1.泛型类定义 2.2.泛型对象定义 2.3.泛型中的构造方法 2.4.泛型方法的...

飞鱼说编程
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部