用kexec迅速切换内核
作者:d00m3d
来自: LinuxSir.Org
声明:本文旨在技术探讨,任何人如因本文而引起任何损毁,资料及精神损失等,或一切问题,本人绝不负责,You are at your own risks!
前言
很早以前就希望实现如何不重置起动(冷起动 System reboot)就使用新建成或者测试不同版本的内核,这个话题好像比较少人探讨,我以前曾经提问过,http://www.linuxsir.org/bbs/showthread.php?t=211738
也很感谢有兄弟提供正面的回覆,可是因为当时水平有限,未能成功。今天为了纪念 linuxsir 重光,特书本文以示热烈庆祝,欢贺一番:)
部骤
首先,有两个先要满足条件(Pre-requisites):
2. 系统需要安装 kexec-tools
内核方面,主流发行版的内核其实都已加入支持,所以用发行版内核的话,基本不用担心支援问题。
只要检查 /boot/config-2.6.xxxxxxxx 就知道了
或者
cat /boot/config-2.6.xxxxxxx |grep KEXEC
答案是 y 便行。
如果内核是自己动手编译的话,请谨记加入 kexec 系统呼叫的支援:
[*] kexec system call (EXPERIMENTAL)
至於安装 kexec-tools 方面,可以编译源码或者用发行版提供的:
如要编译就先下载 kexec-tools 源码,可以到内核官方网站,路径是:
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/
今天为止,最新版本是 2.0.0:
http://www.kernel.org/pub/linux/kernel/people/horms/kexec-tools/kexec-tools-2.0.0.tar.bz2
cd kexec-tools-2.0.0
./configure --prefix=/usr
make
再以 root 身分执行
make install
以上会把下列东西安装:
/usr/lib/kexec-tools/kexec_test
/usr/sbin/kdump
/usr/sbin/kexec
一般发行版或教材都是将命令放在 /sbin 里的,没关系,就移一下吧:
mv /usr/sbin/kexec /sbin/kexec
如果用发行版的就简单一点,直接 apt-get,yum 回来,比如:
apt-get install kexec-tools 或 emerge -av kexec-tools 之类,总之就是为了加入 /sbin/kexec 这个系统命令。
如果一切顺利,现在就有戏了。先检查一下 /boot 里安装了哪些内核:
total 11224
-rw-rw-r-- 1 root root 794675 Sep 24 2007 System.map-2.6.22.7
-rw-rw-r-- 1 root root 853714 Jan 26 2008 System.map-2.6.24
-rw-rw-r-- 1 root root 858565 Sep 16 16:13 System.map-2.6.25.14
-rw-rw-r-- 1 root root 856752 May 27 13:15 System.map-2.6.25.4
-rw-rw-r-- 1 root root 44436 Sep 24 2007 config-2.6.22.7
-rw-rw-r-- 1 root root 47026 Jan 26 2008 config-2.6.24
-rw-rw-r-- 1 root root 54631 Sep 16 16:13 config-2.6.25.14
-rw-rw-r-- 1 root root 54581 May 21 10:49 config-2.6.25.4
drwxr-xr-x 2 root root 4096 May 28 09:06 grub
-rw-rw-r-- 1 root root 1866424 Sep 24 2007 lfskernel-2.6.22.7
-rw-rw-r-- 1 root root 1947800 Jan 26 2008 lfskernel-2.6.24
-rw-rw-r-- 1 root root 2024732 Sep 16 16:13 lfskernel-2.6.25.14
-rw-rw-r-- 1 root root 2017244 May 27 13:15 lfskernel-2.6.25.4
d00m3d@BlackMesa:~$
再检查下 /boot/grub/menu.lst 里加载内核的语句,如:
root (hd0,5)
kernel /boot/lfskernel-2.6.25.4 root=/dev/sda6 ro nomce vga=0x317
boot
这是待加载内核 2.6.25.4 的内容及相关选项。
要用 /sbin/kexec 加载另一内核,语法是:
也就是将内核映像的名称跟选项对号入座,我的情况就写成:
即可加载。
我一直不喜欢使用 ramdisk 或者 initramfs 之类,所以没有 initrd,如果系统需要使用 initrd,就将其正确路径加入便行,如:
kexec -l /boot/lfskernel-2.6.25.4 --append="root=/dev/sda6 ro nomce vga=0x317" --initrd=xxxxxxxxxxx
想重启内核,就以 kexec -e 来切换。执行情况如下:
d00m3d@BlackMesa:~$ su -
Password:
root@BlackMesa:~#
root@BlackMesa:~# kexec -l /boot/lfskernel-2.6.25.4 --append="root=/dev/sda6 ro nomce vga=0x317"
setup_linux_vesafb: 1024x768x16 @ e0000000 +300000
root@BlackMesa:~# cat /proc/version
Linux version 2.6.25.14 (d00m3d@BlackMesa) (gcc version 4.3.2 (GCC) ) #1 SMP PREEMPT Tue Sep 16 16:10:50 HKT 2008
root@BlackMesa:~#
当前内核是 2.6.25.14,准备切换成 2.6.25.4
root@BlackMesa:~# kexec -e
经过一轮热起动系统设置後,系统会再次进入登陆状态。重新登陆:
Password:
Last login: Wed May 28 09:40:34 +0800 2008 on tty1.
No mail.
root@BlackMesa:~#
root@BlackMesa:~# cat /proc/version
Linux version 2.6.25.4 (d00m3d@BlackMesa) (gcc version 4.3.1 20080523 (prerelease) (GCC) ) #1 SMP PREEMPT Tue May 27 12:33:36 HKT 2008
root@BlackMesa:~#
嘿嘿,大功告成!
补充一句,新加载的内核也可以是:
1. 当前内核本身,不停变更都可以的
2. 或者是旧版没有编入 kexec 系统呼叫支援的内核,只不过 warm boot 启动後再无法执行 /sbin/kexec 去变更另一版了
结语
很多时候,冷启动重启系统是很讨厌的,花时甚长,有了 /sbin/kexec,只要当前内核加入了 kexec 系统呼叫的支援,就能随意切换另一版本的内核,对经常调试内核或想尝鲜的人提供了方便,好不快哉!
d00m3d 敬上
(2008年9月25日 Linuxsir 重光纪念)
參考文献
http://www.ibm.com/developerworks/linux/library/l-kexec.html
http://gentoo-wiki.com/TIP_kexec
http://code.google.com/p/atv-bootloader/wiki/Understandingkexec
PS:还有其他小贴士集合在此 【毁灭小贴士】集合 :)
http://www.linuxsir.org/bbs/thread329032.html
首先,坏消息:我们没有实现平滑升级。如果您已经安装了 Hiweed 1.0,要安装 2.0 的话,只能备份资料后进行全新安装。不过看了下面的好消息,希望您能开心些:
- 基于 Ubuntu 8.10
- 新的默认字体:文泉驿正黑(很漂亮!)
- 新的默认输入法:ibus 拼音(接近搜狗、谷歌、紫光拼音!)
- 新的默认桌面管理器:LXDE(比XFCE更加轻量级、快速!)
- 全能播放器 SMplayer 0.6.1 (基于 MPlayer 1.0rc2,可播放 rmvb、APE、FLAC,基本上涵盖常见格式)
- 图形处理软件 GIMP 2.6.1 (新的UI)
- 浏览器 Firefox 3.0.3
- 轻量级开发利器:Geany IDE
- 轻量级文件管理器:PCManFM
- 轻量级编辑器:leafpad
- 轻量级光盘刻录软件:xfburn
- 更加轻量级的邮件客户端 :Claws Mail 3.5.0
- 轻量级电驴下载工具: MLDonkey
- 轻量级 BT 下载工具: Trasmission Bittorrent
- 新版语音聊天工具: Skype 2.0
- 腾讯官方 QQ for Linux 1.0 preview2
- 最新内核 2.6.27
本站提供电信下载地址:
http://59.60.159.30/hiweed-desktop_2.0beta_i386.iso
更多下载地址
http://ftp.osuosl.org/pub/hiweed/desktop/
ftp://ftp.osuosl.org/pub/hiweed/desktop/
http://server.itbbs.cn/os/hiweed/
BT 种子hiweed-desktop_1.0-1_i386.rar 感谢 www.nxus.cn
ftp://202.115.64.131/Hiweed-Linux/(教育网,西南地区。感谢 Cifan H)
http://ftp.ubuntu.org.cn/Hiweed-Linux/
http://221.12.160.174/Hiweed-Linux/
http://hiweed.9ooo.net/ (即本站)
ftp://210.26.50.234/mirror/Hiweed-Linux/
ftp://distro:tachin@mirror.tachin.net/pub/Hiweed-Linux/
http://www.xixtv.com.cn/doc/hiweed.rar 下载后请改扩展名 rar 为 iso。感谢魏艺宽!
http://mirror.rootguide.org/hiweed-linux/desktop/
电驴下载:
ed2k://|file|hiweed-desktop_1.0final.iso|683724800|F82716481B32BDAB689CC796941CD3C5|h=QH2BRWFEN7LIX346ELTPY7EZPPVCOV4T|/
1、系统情况:
操作系统:Redhat AS4
数据库:mysql 4.1.18
应用服务器:JBoss 3.2.7
服务器: 4 x3.00GHz的Intel Xeon CPU
数据库和应用服务器都部署在同一台服务器上。
简单跟踪了一下,发现平常内存、io负载都不大,数据库连接数也不多。只是很奇怪的是mysql的cpu负载始终是99.9%,但整个系统的速度还行,开始怀疑是JVM、数据库参数、索引没有优化导致的,因此先着手对java虚拟机参数及数据库参数进行了调整。
2、java虚拟机调优
- 调整虚拟机的参数
JAVA_OPTS=”$JAVA_OPTS -Xms512m -Xmx1024m -server -XX:MaxPermSize=300m -XX:MaxNewSize=300m”
- 调整jboss的数据库连接池,修改最大连接数及连接回收时间
<min-pool-size>20</min-pool-size>
<max-pool-size>300</max-pool-size>
<idle-timeout-minutes>1</idle-timeout-minutes>
<min-pool-size>20</min-pool-size>
3、数据库调优
- 对所有的表,优化及增加索引。
发现一个好用的mysql工具navicat,感觉比ems 好用,用这东西增加索引方便多了。
- 调整mysql参数
原来是基于my-medium.cnf 修改的参数,由于担心是大数据量查询sort区等不够及程序存在内存泄露问题,因此基于my-huge.cnf进行调整。
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 32M
thread_concurrency = 8
max_connections=300
#skip-networking
#log-bin
server-id = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
#safe-updates
[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
调整后,支撑了3天左右,除了mysql的cpu占用始终是99%外,系统整体运行基本正常,忙于其他事情,没有继续跟踪。没想到大年初一接了一堆报警短信,执行查看了系统参数,发现系统竟然没有swap区,欣喜一阵,可能是这原因吧,于是临时建立swap区。
4、增加swap区
在/swap下生成1G的文件
# mkdir /swap
# dd if=/dev/zero of=/swap/swapfile bs=500M count=2
- 创建为swap文件
#mkswap /swap
让swap生效
#swapon /swap
- 查看一下swap
#swapon -s
- 把新增的swap文件加到fstab文件中让系统引导时自动启动
#vi /etc/fstab
/swap/swapfile swap swap defaults 0 0
增加后,重启应用及服务,mysql的cpu占用还是持续性为99.9%,而且运行上一段时间还是出现无法登录的情况。远程登录到系统,发现内存、io、swap区占用都很正常,数据库连接数也很正常,而且在停止mysql和jboss后,直接重启jboss,不能正常启动成功,需要等上一会儿,怀疑是文件句柄及tcp连接尚未正常释放。联系以前遇到的情况,怀疑与操作系统允许的最大句柄数有关。
用ulimit -a|grep open 命令查看了结果为:
open files (-n) 1024
用cat /proc/sys/fs/file-max查看结果为:
379816
由于数据库和jboss同时部署在同一台服务器上,在负荷较小的情况下用lsof -u root |wc -l查看root用户的句柄数仍然为700多,因此在负荷较高的情况下,用户的最大句柄数1024是有点小。
5、修改操作系统句柄数
5.1、修改操作系统的最大限制数
- 修改 /etc/sysctl.conf
增加fs.file-max = 8061540
- 在/etc/pam.d/login 中添加
session required /lib/security/pam_limits.so
- 在/etc/security/limits.conf 中添加
root - nofile 1006154
修改root用户的句柄数(包括hard和soft)限制为1006154
- 修改 /etc/rc.local 添加
echo 8061540 > /proc/sys/fs/file-max
5.2、修改用户最大限制数
考虑到重启服务器的风险,先暂时修改一下启动jboss的root用户的/root/.bash_profile,增加如下内容:
ulimit -n 65535
重启jboss和mysql。
连续观察了几天,发现cpu始终占用99.9%的情况解决掉了,继续观察中。
6、参考文档
http://www.bea.com.cn/support_pattern/Too_Many_Open_Files_Pattern.html
apt-get install lshw
lshw
刚来到这里要办的几件重要事情之一,就是给宿舍申请网络。学生宿舍的网络是由两个 不同的实体来动作的。我所住的房子是归selfnet──一个1999年由学自己生建立的旨在为宿舍内学生提供Internet接入服务的组织管理和运营 的。当我来到他们的办公室时,第一个引起我注意的就是桌上放着一摞Ubuntu的安装盘(就是现在还在我家积压着一些的那种),供来者免费领取。办公室的 墙壁上还贴着各种关于Linux的宣传海报。这种浓重的Linux氛围,正如我想像的那样。
在后来接触到的很多和计算机相关事情中,都能感受到Linux和开源软件真正的被推崇、被重视:
关于计算机的所有的介绍/向导/说明,都必然有为Linux专门设置的部分内容。学校的VPN接入服务网页上的Linux部分除了涉及与Windows下对应的那个Cisco客户端,还专门为一个开源的VPN客户端的使用方法进行介绍。
校园的主计算机房(Computer Pool)虽然有些让我失望的用的是Windows XP系统(大概也是考虑大众的使用习惯吧,德国Linux普及得再好,Windows的市场占有率还是相对很高的),然而系统上安装的软件很多都是开源或 者免费的。默认浏览器是Mozilla,杀毒软件是Antivir,在开始菜单里你还能看到(g)VIM、Ghostview、Putty等等。不过出乎 我意料的是Office套件学校还是采用了Micro$oft的Office。等到了计算机系的机房,从外往里一看,所有没人用的机器都停留在 Ubuntu默认的登录画面,十分气势。
上周五上了第一次算法的练习课,虽然教授给了一个可以得到VC6的License的网址 ,但希望学生使用GCC来做作业的意思是很明显的,何况习题中还有调用xv的内容。
反观国内,虽然我不是计算机专业的,但从认识的计算机专业的同学、朋友口中,也能 对Linux的受重视程度略知一二。记得一次一个计算机系的同学看我拿着一本关于Linux的书时很惊讶的问我怎么也学这个。当我对计算机系能更多的接触 Linux表示出极大的羡慕时, 她说,我们就是讲操作系统时用过两次,就看看进程、线程什么的……这次在德国,我们班上有个从同济来的学计算机的老兄,据说看过几遍内核的代码,但令我不 解的是,他既不用Linux,对内核以外(或者说书本以外)所有关于Linux的东西也知之甚少。看上去还是个微软的忠实拥趸,几次劝我不要那么反感微 软,“微软还是很出色”的。这两天,大概由于教授的作业,这位仁兄在我看来是有点“硬着头皮”的装了个Ubuntu。装完后由于自己在这方面的知识缺乏, 到处碰壁,然后不断的在MSN上抱怨Linux这不是那不是,大喊“Linux drives me crazy!──大哥,是你自己要用的,没人逼你好不好?
今天先到这里吧,真不知国内什么时候才能形成一个很好的对Linux认识和重视的氛围。
Update [06.05.14]:
昨天在去海德堡的火车上和两位计算机科班出身的同学交流了一下,在听了他们从内核的角度讨论操作系统的问题后,发现自己对Linux的优越性其实在 某种程度上是一种盲目的支持。当他们给我讲解我从来没听说过的“大内核和微内核的优劣”时,我只能说我只是会使用一下Linux罢了。看来有太多的东西要 学习和掌握。不过,在看待Linux和Windows的态度上,我不能说我是中立的,但我也不能说我的同学是客观的,呵呵……
from: ownlinux.cn





