您的位置:首页 > 运维架构 > Linux

Linux内核编译以及perfctr模块安装

2010-08-21 14:41 633 查看
Linux内核编译以及perfctr模块安装

零、需求介绍

需要使用PAPI得到硬件级的数据,即与微指令相关的数据,例如L1/L2 cache miss、TLB miss、Cycle等,而PAPI需要perfctr(Performance-monitoring counters support)模块的支持,而Linux内核当中默认没有perfctr模块,并且perfctr只在某些内核上被支持,它实际上是内核的一个补丁,需要重新编译内核,打上补丁才能在内核上运行perfctr模块。更多信息参考papi和perfctr的INSTALL文件。

一、环境介绍
Intel(R) Xeon(R) CPU ,X86_64平台;
物理机<建议不要在虚拟机上试,否则可能出现问题,后面介绍>

CentOS release 5.4 (Final)

内核版本是2.6.18-164.el5-x86_64

查看内核、平台等信息
#uname -a
Linux gc04vm13 2.6.18-164.el5<原来内核> #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
查看操作系统版本
#cat /etc/issue
CentOS release 5.4 (Final)
查看CPU信息
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
1  Intel(R) Xeon(R) CPU           E5520  @ 2.27GHz  <只给虚拟机分配了一个CPU>


二、准备工作
(i)下载papi,可以在http://icl.cs.utk.edu/papi/custom/index.html?lid=51&slid=69上下载各个版本的papi,这里下载papi-3.6.0。

papi中包含了perfctr,用户不需要单独下载perfctr,(当然也可以单独下载,网址是http://user.it.uu.se/~mikpe/linux/perfctr),这里选择2.6版本的perfctr。
解压papi,阅读papi-3.6.0/src/perfctr-2.6.x目录下的INSTALL文件,里面讲到“该版本的perfctr适用于如下版本的Linux内核:在papi-3.6.0/src/perfctr-2.6.x/patches目录下,若存在patch-kernel-*补丁,说明适用于*版本的Linux内核,我们选择2.6.19版本的linux内核。

注意: PERFCTR 的版本并不是和linux内核版本相对应的,比如ompi自带的perfctr-2.6.x可适用于很多版本的linux内核,例如2.4.26版本的内核。

(ii)下载linux-2.6.19.tar.bz2,在网站 http://www.kernel.org/pub/linux/kernel/ 上可以下载任何版本的linux内核。

一般情况下,当前内核版本是x.y.***版本的话,编译的新内核版本最好也是x.y.***版本,例如不要从2.4.x升级到2.6.x,因为两者差异比较大,一般[主].[次]版本号相同的内核可以顺利升级。

(iii) 认真看完perfctr的INSTALL文件,里面详细说明了安装步骤和测试。

三、安装步骤

(1)解压内核
bzip2 -d linux-2.6.19.tar.bz2
tar xvf linux-2.6.19.tar
生成linux-2.6.19目录

(2)复制内核到/usr/src目录下
cp -r linux-2.6.19 /usr/src/

(3) 解压papi到目录/opt下,

tar zxvf papi-3.6.0.tar.gz

cp papi-3.6.0 /opt/

(4)
cd /usr/src/linux-2.6.19
make mrproper

(5)在内核目录下执行update-kernel
cd /usr/src/linux-2.6.19
/opt/papi-3.6.0/src/perfctr-2.6.x/update-kernel
<必须在内核目录下执行,否则在后续选择内核模块时找不到perctr>

若内核版本有问题则出现如下信息
Error: no suitable patch found for kernel 2.6.19zkl-perfctr
See perfctr-2.6.x/patches/ for supported kernel versions,

可以查看perfctr-2.6.x/patches/下支持的内核版本。

(6)该步骤可以跳过,也可以这样做

拷贝原有内核的.config到当前内核目录下
cd /usr/src/linux-2.6.19
cp /usr/src/kernels/2.6.18-164.el5-x86_64/.config .
(7)配置选择内核模块

cd /usr/src/linux-2.6.19
make menuconfig


选择模块:

查看perfctr-2.6.x目录下的INSTALL文件,它有如下这些内容,其意思是说必须选择这样几个模块:
(i)Loadable module support 选项下,一般默认即可,这个模块的功能是帮助系统可以动态加载模块。



(ii)Processor type and features选项下的Performance-monitoring counters support(即PERFCTR),

这个必须选择,笔者做实验觉得应该将PERFCTR选择为(M),其子项均选择为*,将它编译成可动态加载的模块,请按如下方式选择。



注意:
我在做实验时,最开始将PERFCTR选择为*,将其编译进内核,最后安装完毕,始终不能执行perfectr的实例,查看系统目录/lib/modules/'uname -r'/drivers下也没有perfectr模块,使用lsmod不能查看到perfctr模块,既然编译进了内核,应该能看到的,不知啥原因?更不能使用命令modprobe perfctr加载模块(因为不是以动态加载模块的形式加载的),可能与没有将PERFCTR模块设置为M有关。

内核模块选择操作方式:
选择模块是按Y会出现*,按M会出现M,按N可以取消选择。也可以按空格键从*切换到无,为大写M(键下大写M)表示编译成可动态加载的模块,*表示编译进入内核。
(iii)内核支持APIC
此外必须保证内核支持APIC(Advanced Programmable Interrupt Controller高级可编程中断控制器),这是因为后面papi要使用,所以请保证选中了APIC相关项,可以按"/",然后键入APIC,搜索以下与之相关的模块是否选择了,这个模块实际上在在Processor type and features选项下,模块选择完毕,可以使用命令grep PIC /usr/src/linux-2.6.19/.config查看apic是否选择,选择了的话应该显示CONFIG_X86_GOOD_APIC=y等字样,papi的INSTALL文件中说到“SMP(多核,对称多处理器)上默认选择了该项,但是UP(单处理器)上默认没选择”。

----------------------------------------------------------------------------------------
以下摘自perfctr的INSTALL文件
You should either configure with modules (CONFIG_MODULES=y) AND module
versions (CONFIG_MODVERSIONS=y), or completely without modules
(CONFIG_MODULES=n). Modules without module versions is an inherently
unsafe configuration which is not recommended.

Loadable module support选项

You should also enable at least CONFIG_PERFCTR, CONFIG_PERFCTR_VIRTUAL,
and CONFIG_PERFCTR_GLOBAL.

Processor type and features选项下的Performance-monitoring counters support(即PERFCTR)选项下的所有选项都选中

You may also select CONFIG_PERFCTR=m to build the bulk of the driver (或者设为M,编译成动态加载的模块)
as a loadable kernel module; the module will be named `perfctr'.

Note: The perfctr kernel patch adds one word to the `thread_struct'
type, which makes the patched kernel binary incompatible with an
unpatched one. This is why it is important to distinguish the patched
kernel via EXTRAVERSION and CONFIG_MODVERSIONS.
----------------------------------------------------------------------------------------

(7)修改/usr/src/linux-2.6.19/Makefile,加上扩展版本号,对该内核给一个标记,
EXTRAVERSION =-zkl-perfctr
这样做之后,您编译内核完成后,你的内核版本就是linux-2.6.19-zkl-perfctr

(8)编译内核

第一种做法=================================================================================

# make clean
# make vmlinux modules <使用此命令编译内核和模块> 动作完成后在/usr/src/linux-2.6.19/下生成了模块相关文件,例如在drivers中有很多相关文件
# make modules_install 安装模块,此命令会利用上面在/usr/src/linux-2.6.19/下生成的模块相关文件,对它们进行编译,在系统目录/lib/modules/2.6.19-zkl-perfctr下生成模块,例如可以在drivers中看到perfctr模块
# make bzImage 编译生成内核文件,/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
# make install 执行此命令必须保证之前生成了内核文件bzImage
sh /usr/src/linux-2.6.19/arch/x86_64/boot/install.sh 2.6.19-zkl-perfctr arch/x86_64/boot/bzImage System.map "/boot"
此命令等同于第二种方法中的(e),只不过使用make install命令会自动完成e中的几种动作,实现内核多重启动
=====================================================================================

或者

第二种做法

<建议使用第一种>
===============================================================================

(a) make clean 将之前生成的.o文件删除掉,这样不会产生新旧版本的误差

(b) make bzImage
命令执行成功将提示如下信息,在/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
Root device is (8, 3)
Boot sector 512 bytes.
Setup is 7252 bytes.
System is 1794 kB
Kernel: arch/x86_64/boot/bzImage is ready (#1)

(c) make modules 制作出模块相关的文件

(d) make modules_install 安装模块

(e)实现内核多重启动

cp /usr/src/linux-2.6.19/arch/x86_64/boot/bzImage / (/表示一条命令太长了,换行)
> /boot/vmlinux-2.6.19-zkl-perfctr

cp /usr/src/linux-2.6.19/System.map /
> /boot/System.map-2.6.19-zkl-perfctr

手动生成initrd-2.6.19-zkl-perfctr.img文件到/boot目录下:
cd /usr/src/linux-2.6.19
[root@gc04vm13 linux-2.6.19]# mkinitrd /boot/initrd-2.6.19zkl-perfctr.img 2.6.19-zkl-perfctr (注意内核是2.6.19-zkl-perfctr,这是因为前面修改了Makefile中的版本扩展号,该命令将在/boot目录下生成initrd-2.6.19zkl-perfctr.img文件)

编辑系统内核启动文件
vim /boot/grub/menu.lst

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0 #对应到第一个title
timeout=10 #系统内核选择时的延迟
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-164.el5.img
##加上以下启动新内核的语句
title CentOS (2.6.19-zkl-perfctr)
root (hd0,0)
kernel /vmlinuz-2.6.19-zkl-perfctr ro root=/dev/VolGroup00/LogVol00 # 这是表示内核文件是/boot/vmlinux-2.6.19-zkl-perfctr
initrd /initrd-2.6.19-zkl-perfctr.img # 这是前面生成的文件/boot/initrd-2.6.19zkl-perfctr.img

=================================================================================

(10)重新启动系统,
在启动菜单中将会出现两个内核选项,使用上下按钮选择新内核启动
或者
将新内核设置为默认启动内核,即修改上面文件中default=1

(11)系统重启后,可以使用命令查看perfctr模块是否安装上,
# modprobe perfctr 加载模块
lsmod 显示模块
rmmod perfctr移除模块
若perfctr模块安装成功后,你将看到perfctr模块,并且你可以在 /lib/modules/2.6.19-zkl-perfctr/kernel/drivers/perfctr中看到perfctr模块perfctr.ko

(12)编译安装perfctr,

#cd /opt/papi-3.6.0/src/perfctr-2.6.x
#make
#mknod /dev/perfctr c 10 108 <可能提示已存在文件,删除再建即可>
#chmod 644 /dev/perfctr
#make PREFIX=/usr/local install

至此,安装全部完成,perfctr相关文件安装再/usr/local下的bin、include、lib下

(13)测试

测试perfctr-2.6.x下面的例子,出现结果,证明安装perfctr安装成功

[root@gc04vm13 perfctr-2.6.x]# examples/global/global

PerfCtr Info:
abi_version 0x05010501
driver_version 2.6.32 DEBUG
cpu_type 5 (?)
cpu_features 0x7 (rdpmc,rdtsc,pcint)
cpu_khz 2259879
tsc_to_cpu_mult 1
cpu_nrctrs 0
cpus [0], total: 1
cpus_forbidden [], total: 0
cpu type 5 (?) not supported

不支持,这是因为以上步骤我是在VMware虚拟机中完成的,换成物理机就没问题,正常情况下是运行后每隔5秒刷现一次

涉及的命令:

cp -r papi-3.6.0  /opt/
cp linux-2.6.20.tar.gz /usr/src/kernels
cd /usr/src/kernels
tar zxvf  linux-2.6.20.tar.gz
cd linux-2.6.20
#make clean <当前内核未编译过时不需要执行该命令>
#make mrproper <当前内核未编译时不需要执行该命令>
/opt/papi-3.6.0/src/perfctr-2.6.x/update-kernel
cp 当前内核目录/.config . <复制当前内核下的.config文件到当前目录>
make menuconfig
做如下选择:
(1)Processor type and features选项下的Performance-monitoring counters support,即要支持硬件计数器
(2)搜索 APIC 选项,查看是否已经选上y,没有则选上
(也可以在退出 menuconfig 后使用 grep APIC .config 查询APIC相关选项是否是y)
退出 menuconfig,保存。

make modules
make modules_install
make bzImage
make install

完毕后选择新内核重新启动
新内核启动后
modprobe perfctr
lsmod | grep perfctr
cd /opt/papi-3.6.0/src/perfctr-2.6.x/
make
examples/perfex -i
examples/global/global  检测perfctr是否能正常运行,若出现错误,重启系统
mknod /dev/perfctr c 10 108
chmod 644 /dev/perfctr
make PREFIX=/usr/local install  将perfctr的头文件、库、可执行命令安装到/usr/local下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐