基于lxcfs的docker容器procps软件包升级方案(二)——修改free源码


上篇文章介绍完了lxcfs文件系统,通过使用lxcfs,挂载宿主机的/var/lib/lxcfs/proc到容器内部/docker/proc路径下,就能够找到该容器的自身meminfo、cpuinfo以及stat等proc文件,如下:
[root@ad5b4a2dff42 ~]# ll /docker/proc/                                                                                                            
total 0
-r--r--r-- 1 root root 0 Oct 23 09:18 cpuinfo
-r--r--r-- 1 root root 0 Oct 23 09:18 diskstats
-r--r--r-- 1 root root 0 Oct 23 09:18 meminfo
-r--r--r-- 1 root root 0 Oct 23 09:18 stat
-r--r--r-- 1 root root 0 Oct 23 09:18 swaps
-r--r--r-- 1 root root 0 Oct 23 09:18 uptime

接下来,进行下一步,修改procps软件包的源码(该软件包包含命令有free、kill、pgrep 、pkill、pmap 、ps 、skill 、snice 、sysctl、tload 、top、uptime 、vmstat、w 、watch ,此次修改源码只关注top、free和uptime三个命令)
使用的是centos:6.6的基础镜像,首先看一下procps软件包的版本,如下
[root@c4c026aef8d3 ~]# rpm -qa|grep procps                                                                                                         
procps-3.2.8-30.el6.x86_64

可以看到,版本是3.2.8,,去网上下载3.2.8版本的procps软件包源码,具体的下载地址就不提供了,可以自行百(谷)度(歌)。为避免对宿主机的影响,笔者是在一个centos6.6的容器中进行的源码修改、编译安装以及测试工作。下载完解压后,使用docker cp拷贝到容器中。看一下源码的目录结构,如下

[root@csmp-05 procps-3.2.8]# ls
AUTHORS      COPYING.LIB  kill.1     pgrep.1  pmap.c       ps      README.top  slabtop.c  sysctl.conf    tload.c  top.h     vmstat.8  watch.c
BUGS         dummy.c      Makefile   pgrep.c  proc         pwdx.1  skill.1     snice.1    sysctl.conf.5  TODO     uptime.1  vmstat.c  w.c
CodingStyle  free.1       minimal.c  pkill.1  procps.lsm   pwdx.c  skill.c     sysctl.8   t              top.1    uptime.c  w.1
COPYING      free.c       NEWS       pmap.1   procps.spec  README  slabtop.1   sysctl.c   tload.1        top.c    v         watch.1

首先,修改free命令的源码,其实比较简单,free命令读取的是meminfo文件,文件路径为/proc/meminfo,我们要做的就是将这一路径改为/docker/proc/meminfo。理论上,应该将源码梳理清楚后再进行修改,但是因为项目赶得紧,因此只能用快办法。首先,搜一下源码中哪里定义了这个路径,如下

root@csmp-10 procps-3.2.8]# grep -r "\/proc\/meminfo" *
free.1:.IR /proc/meminfo "\-\- memory information"
proc/sysinfo.c:#define MEMINFO_FILE "/proc/meminfo"
proc/sysinfo.c:// As of 2.6.24 /proc/meminfo seems to need 888 on 64-bit,
slabtop.1:and it not a measure of physical memory. The 'Slab' field in the /proc/meminfo
vmstat.8:/proc/meminfo

显然,我们只要替换这几处的/proc/meminfo为/docker/proc/meminfo即可,如下:

[root@ad5b4a2dff42 procps-3.2.8]# grep -r "\/proc\/meminfo" *
free.1:.IR /docker/proc/meminfo "\-\- memory information"
proc/sysinfo.c:#define MEMINFO_FILE "/docker/proc/meminfo"
proc/sysinfo.c:// As of 2.6.24 /docker/proc/meminfo seems to need 888 on 64-bit,
slabtop.1:and it not a measure of physical memory. The 'Slab' field in the /docker/proc/meminfo
vmstat.8:/docker/proc/meminfo

修改完编译,编译之前需要安装两个依赖包,由于之前笔者已经使用centos6.6的iso镜像只做了一个本环境内的yum源,因此直接使用yum安装

yum  -y install ncurses-devel ncurses

安装完依赖包之后,编译安装,会自动替换原有的各命令

make
echo $?
make install
echo $?

执行free命令,查看效果,如下

root@ad5b4a2dff42 ~]# free -g
         total       used       free     shared    buffers     cached
Mem:             8          1          6          0          0          0
-/+ buffers/cache:          1          6
Swap:            8          0          7

下面是同一个宿主机上的一个没有修改过的容器中执行free的结果

[root@ba28b1ba171d ~]# free -g                                                                                                                     
         total       used       free     shared    buffers     cached
Mem:           251         90        161          1         10         11
-/+ buffers/cache:         69        182
Swap:           15          1         14

很明显,经过修改之后的free命令,执行后显示出来的是该容器的内存使用情况而非宿主机的了,成功。

0 个评论

要回复文章请先登录注册