RHEL6.2 编译内核过程

  1. Kdump工具

 

今天给服务器升级内核,实验环境rhel6.2,升级前内核版本2.6.26,升级后内核版本3.3.6.步骤如下:

下载linux-2.6.29.4.tar.bz2到/usr/src 

  Kdump的工作机制是在内核崩溃时, 通过kexec 工具由BIOS启动一个备用内核,
由备用内核执行一系列任务,保存内存中崩溃内核的状态, 供后续故障分析用.

启动

1、下载内核源码,可在

# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2 
# tar -jxvf linux-2.6.27.tar.bz2 
# cd linux-2.6.27 
# make mrproper 
# make menuconfig 
# make clean 
# make bzImage 
# make modules 
# make modules_install 
# mkinitrd /boot/initrd_2.6.27.img 2.6.27

  本文默认AMD或INTEL X86_64架构, RHEL7系统环境. 

主板BIOS–》Grub–》内核–》运行级–》运行级的结果

2、将下载的内核代码拷贝至/usr/src下,cp linux-3.3.6.tar.gz /usr/src/。

执行mkinitrd命令时,提示”No module dm-mem-cache found for kernel 2.6.27,
aborting.”时,表明该版本的mkinitrd有bug。 
解决方法,1是当使用mkinitrd时,使用”-without-dmraid”这个参数。2是在使用mkinitrd之前,先创建一个noraid文件。创建方法如下: 

1.1 内核管理工具Kdump安装

运行级

3、解压,tar -zxvf linux-3.3.6.tar.gz。

# echo “DMRAID=no” > /etc/sysconfig/mkinitrd/noraid 
# chmod 755 /etc/sysconfig/mkinitrd/noraid

  Kdump是RHEL7中自带的内核管理工具.在RHEL7.1之前的版本,kdump作为安装完成之后的可选组件自动安装,从RHEL7.1开始kdump被植入安装界面,作为系统基础工具供安装选择.

0 关机

4、建立软链接,ln -s linux-3.3.6 rhel。

然后再运行mkinitrd命令。

可以通过下面命令直接RPM包安装.

1 单用户(修复模式)

5、进入rhel目录,cd /usr/src/rhel。

 

yum -y install kexec-tools
rpm -q kexec-tools

2 无NFS模式

6、把原来编译产生的文件删除,make
mrproper。假如以前编译过内核,会产生上述文件,将会造成编译的失败。

这里我采用了第一种办法 

同时,Kdump还配备了图形化管理工具,可以通过下面命令安装.

3 无图像界面的完全模式

7、配置内核,从下面选择一种,一般选择make menuconfig。

# mkinitrd /boot/initrd-2.6.27.img 2.6.27 –without-dmraid
yum -y install system-config-kdump

4 自定义模式

make config 传统的文本内核编译模式,但出错后无法返回。

执行完mkinitrd后,就要在启动菜单中增加编译好的内核信息,以便启动时可以选择内核版本。 

  对于RHEL7.4及之后的版本,kdump支持INTEL IOMMU.
而不支持RHEL7.3及之前的版本.

5 有图像界面的完全模式

make menuconfig 基于文本的内核编译模式,出错可返回,建议使用此等模式。

# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.27 
# cp System.map /boot/System.map-2.6.27

1.2 通过命令行配置kdump内存容量

6 重启

make xconfig 基于图形化的内核编译模式

打开/etc/grub.conf文件,增加以下内容到文件结尾。

  kdump能监控系统内核运行状态,其地位比较特殊.
kdump的内存空间是在系统启动时,由引导程序分配的,相对于系统内核,kdump内存是一个独立的空间.

 

make oldconfig 只对当前内核稍作修改

title CentOS (2.6.27) 
root (hd0,0) 
kernel /vmlinuz-2.6.27 ro root=LABEL=/ 
initrd /initrd-2.6.27.img

可以通过如下命令指定kdump的内存空间大小.

给Grub加密码

配置后“exit”,系统询问“Do you wish to save your new kernel
configuration?”,选择“yes”。

保存,重启,进行grub的启动菜单中,选择”CentOS(2.6.27)”,即可使用编译好的内核。 
如果你觉得make
modules_install后面的步骤太麻烦的话,就直接用下面的命令让系统帮你做好了 

crashkernel=128M     #为kdump保留128M的内存空间.

cd /boot/grub

8、确定倚赖关系,make dep。

# make install

   crashkernel的值可以设置成“auto”,在一些拥有较大内存的系统中,利于实现Kdump的自动化管理.

vi menu.lst

9、确定内核源码中没有文件,make clean。

下面是运行时的提示信息: 

crashkernel=auto

在timeout上面加一行

10、编译内核,make bzImage。时间较长

sh /usr/src/linux-2.6.27/arch/x86/boot/install.sh 2.6.27 arch/x86/boot/bzImage System.map “/boot” 
WARNING: No module dm-mem-cache found for kernel 2.6.27, continuing anyway 
WARNING: No module dm-message found for kernel 2.6.27, continuing anyway 
WARNING: No module dm-raid45 found for kernel 2.6.27, continuing anyway

  当然,crashkernel的值还可以通过如下形式实现更灵活的配置.

password 密码

11、编译内核模块,make modules。时间很长。

这些只是提示,对系统没有什么影响,经本人查阅相关的资料。 
可能是内核和mkinitrd的BUG,大家可以参考一下这篇文章 
 
通过给内核打dm-raid45这个补丁,可以解决掉”WARNING: No module dm-raid45
found for kernel 2.6.29.4, continuing anyway”这个提示 
 
至于其他的两个没有仍然找不到解决的办法,希望大家知道的,给我留言!

  crashkernel=<范围1>:<大小1>, <范围2>:<大小2>

保存退出

12、安装模块,make modules_install。

谢谢!

crashkernel=512M-2G:64M,2G-:128M    #当系统内存在512M-2G之间时,为Kdump保留64M的内存空间;当系统内存大于2G时,为Kdump保留128M的内存空间.

grub-install –no-floppy /dev/sda #让修改的grub启动内容生效

13、安装内核,make install。

  还可以这样:

 

这条命令主要完成以下工作:(1)把压缩内核映象拷贝到/boot目录下,
并创建相应的System.map符号链接;(2)调用mkinitrd程序创建内核的initrd映象。修改GRUB配置文件,
/etc/grub.conf或/boot/grub/grub.conf。

crashkernel=128M@16M    #为Kdump保留128M的内存空间,内存地址从16M(physical address 0x01000000)开始.

修改运行级

一些朋友手动完成“make
install”所完成的工作。我尝试了一下,遇到一些问题。我对于grub认识不是很透彻,个人认为还是使用make
install稳妥一些。

1.3 Kdump的存储

init 数字

14、重启即可。

  Kdump的配置在/etc/kdump.cnf中.
kdump提供多种方式将捕获到内核崩溃数据本地保存或保存到远程主机.

 

图片 1

#path /var/crash    #kdump本地存储目录,默认是存放在/var/crash目录下,可以根据使用习惯设置.
path /usr/local/cores 
...
#raw /dev/vg/lv_kdump    #kdump可以直接写入移动介质.
raw /dev/sdb1
...
#nfs my.server.com:/export/tmp    #kdump可以通过NFS保存到网络上其它存储设备中.
nfs test.example.com:/export/cores
...
#ssh user@my.server.com      #kdump可以通过SSH传输协议,保存远程主机上.
#sshkey /root/.ssh/kdump_id_rsa
ssh user@test.example.com
sshkey /root/.ssh/mykey

服务

  kdump.conf中还可以在 core_collector makedumpfile 选项后加上” -c “,
使kdump文件能够被压缩,以节省存储空间.

chkconfig –list #列出服务状态(启动的)

core_collector makedumpfile -c

systemctl start kdump.service    #启动Kdump服务
systemctl enable kdump.service    #使Kdump开机自启
systemctl is-active kdump       #检查Kdump是否已启动
active
echo 1 > /proc/sys/kernel/sysrq   #模拟内核崩溃,检查/var/crash/是否自动保存Kdump捕获的内核崩溃数据, 以确定Kdump是否正常工作
echo c > /proc/sysrq-trigger

服务名称    运行级状态

  需要注意的是

sshd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

  (1)在RHEL7之前的版本中,kdump的存储目录会随着kdump服务的启动而由系统自动创建.
RHEL7中,如果改变了kdump的存储目录,则必须在启动kdump服务之前,手动创建kdump的存储目录,否则kdump服务会启动失败.

 

  (2)如果在安装界面禁用了kdump, 而安装完成之后再通过systemctl start
kdump启动kdump, 会报内存不足无法启动的错误.
kdump的内存空间是在内核加载之前由boot分配的, 所以必须修改boot.
最好使用kdump的图形管理工具 system-config-kdump 加载kdump的默认配置,
使kdump处于可用状态, 然后重启系统, systemctl status kdump
服务处于激活状态(active).

修改

1.4 利用crash功能分析内核崩溃

chkconfig –level 1 sshd on

  利用crash功能组件能够分析linux内核崩溃时的网络、磁盘、CPU、系统内核状态,快速定位故障点.

sshd服务在运行级1的时候默认启动

crash组件可以通过RPM包安装.

chkconfig –level 1 sshd off

sudo yum -y install crash       #安装crash
sudo debuginfo-install kernel    #安装内核调试模块

sshd服务在运行级1的时候默认关闭

 sudo crash /usr/lib/debug/lib/modules/<kernel>/vmlinux
/var/crash/<timestamp>/vmcore  #启动crash调试

如果没有打运行级则调整2345运行级状态

测试一下:

chkconfig sshd on

图片 2

chkconfig sshd off

图片 3

 

crash基本调试命令:

xinetd是个特殊的服务

crash>log    #崩溃时日志记录
crash>bt     #崩溃时的堆栈信息
crash>vm     #崩溃时的内存状态
crash>ps     #崩溃时的进程状态
crash>files   #崩溃时的打开的文件
crash>exit   #退出crash

比如开启telnet服务

2 linux内核调校

首先让ekrb5-telnet为开启状态

2.1 kernel的调校途径

再xinetd为开启状态

  RHEL7中提供三种内核调校方法:

如果有一个不是开启则不成功

  (1)使用sysctl 命令;

 

  (2)修改/etc/sysctl.d/ 目录下的内核配置文件;

所有基于xinetd 的服务:都和telnet开启方法一致

  (3)通过shell 在/proc/sys 目录下挂载虚拟文件系统;

 

2.2 sysctl命令可以列出、读取、设置内核参数,
还可以将参数设置为临时或永久.

重启服务

sysctl -a        #列出所有可调校的项
sysctl kernel.version    #列出kernel的版本信息

sysctl <tunable class>.<tunable>=<value>       #使调校参数临时生效
sysctl -W <tunable class>.<tunable>=<value>   #使调校参数永久生效

service 服务名restart

2.3 修改/etc/sysctl.d/99-sysctl.conf 目录下的99-sysctl.conf文件

 

cp /etc/sysctl.d/99-sysctl.conf /etc/sysctl.d/99-sysctl.conf.bak    #备份系统默认的内核参数文件
vim /etc/sysctl.d/99-my.conf    #创建新的内核参数文件

...
<tunable class>.<tunable> = <value>   #写入要调校的参数类和值
 <tunable class>.<tunable> = <value>
...
save    #保存文件
reboot\ sysctl -p /etc/sysctl.d/99-my.conf  #重启系统或者使用sysctl -p 命令载入新的内核参数配置

停止服务

2.4 sysctl 调校内核参数

service 服务名stop

(1)调整最大请求的aio数量.

 

sysctl -a | grep fs.aio    #查看内核默认的最大aio值
sysctl fs.aio-max-nr=2048576  #临时调整aio最大值

启动服务

图片 4

service 服务名start

(2)开启本地ipv4转发功能.

 

sysctl net.ipv4.ip_forward = 1

*防火墙会影响服务,关闭防火墙

(3)设定进程能被分配到的最大内存空间.

chkconfig iptables off

sysctl vm.max_map_count = 65530

service iptables stop

(4)设定系统中同时运行的最大进程数.

 

sysctl kernel.threads-max = 16161

*telnet不能用root直接登录,用普通用户登录,执行su -变为root用户

  在root权限下,通过sysctl 命令的内核参数调校, 基本上能直接控制linux
的内核所有行为, 满足实际生产中的绝大多数需求.

 

  

/etc/rc.d/rc.local

系统启动时候执行的最后一个服务,默认存在,一般不取消

 

程序与进程

查看系统现在运行的程序

ps -ax

-a 所有用户的

-x 拓展的

 

进程编号 运行终端  
状态(S等待,s睡眠,T是停止未退出程序,Z是僵尸程序,R正在运行)运行多长时间  
命令

  PID    TTY       
STAT                                                          
TIME           COMMAND

    1 ?        Ss     0:01 /sbin/init

 

top 系统进程监控器

top – 09:53:35(系统时间)up  1:41(系统运行时间),  5
users(当前登录用户数),  load average: 0.00, 0.00, 0.01(系统负载值)

Tasks: 197 total(系统进程数),   1 running(运行数), 196
sleeping(睡眠数),   0 stopped(停止未退出),   0 zombie(僵尸)

Cpu(s):  0.2%us,  0.3%sy,  0.0%ni, 99.2%id(CPU剩余数),  0.3%wa, 
0.0%hi,  0.0%si,  0.0%st

Mem:   2980496k total(物理内存总数),  1023280k
used(最大使用内存数),  1957216k free(最小空闲数),   132928k
buffers(网络使用缓存)

Swap:  5079032k total(虚拟内存总数),        0k
used(虚拟内存最大使用数),  5079032k free(虚拟内存最小空闲数),  
488952k cached (系统准备快速使用的内存)

 

进程编号 用户                               状态  CPU使用 内存使用
运行时间 命令

  PID    USER      PR  NI  VIRT  RES  SHR    S    %CPU    %MEM    
TIME+    COMMAND

 2869 root         20   0  2660 1120  848    R    1.0     0.0     
0:00.25  top

 

内存计算

最大使用内存数-系统准备快速使用的内存=现在系统使用的内存

 

 

系统负载值(一台计算机的使用量是10.00)

                      每3分钟 每5分钟 每15分钟

load average(平均值): 0.00,   0.00,   0.01

 

 

关闭进程

kill -9 进程号

-9 强制执行

 

killall -9 进程名称

-9 强制执行

 

计划任务

每天1:00要求备份系统用户

1、系统用户要备份的内容/etc/passwd /etc/shadow
/etc/group文件为系统所有的用户信息文件

2、/home目录里面是系统用户的文件目录

制作方法每天1:00把文件和目录都复制到/sysbak目录里面就行了

 

crond服务

crondtab -e 进入计划任务编排

分钟 小时 天   月  星期    命令

0    1     *   *    *      mkdir -p /sysbak

时间要求必须是表能出现的

每分钟运行的

*/1 * * * *

每小时

0 */1 * * *

每天

0 0 */1 * *

每月

0 0 0 */1 *

每星期

0 0 0 0 */1

 

间隔时间

1,30 * * * *

 

连续

1-30 * * * *

 

星期0-7 0和7都是星期天

 

编排好了以后,一定要把crond服务重启一下

service crond restart

 

date 查看系统时间

date -s 0059 修改时间

 

 

 

本文出自 “王道–旭忠著(MakeWong)” 博客

主板BIOS–》Grub–》内核–》运行级–》运行级的结果 运行级 0 关机 1
单用户(修复模式) 2 无NFS模式 3 无图像界面的完全模式 4 自定义…

相关文章