|
[color="Blue"]A篇:当时我就震惊了
[color="Blue"]B篇:当时我就想要了
[color="Blue"]C篇:当时我就手贱了
D篇,现在开始搞飞机
搞完这一篇,你应该会在两种下场之一:
1. 系统性能显著提升,明显感到比原来快多了
2. 系统彻底启动不了了。
甲。内核优化编译。
首先,我假设你已经重启完毕了。
内核编译这个应该不用我废话了,N年前就写过的。对系统性能影响最大的第一个是 kernel, 第二是 glibc 。D篇就是来搞定他们两个的。
OpenSUSE_内核编译教程
http://cn.opensuse.org/OpenSUSE_内核编译教程_(kernel_2.6.x)
既然开始折腾,那篇文档里面的东西也不够用。
1. 我们之前定义的 CFLAGS 编译参数在内核编译的时候是不被采用的。
要优化编译就要用强。
解压kernel 源码以后,编辑目录下有个叫 Makefile 的文件。把所有 O2 替换成 O3。如果不会用 vim 的话随便拿个图形文本处理软件替换一下,很简单的。只要你别用 Openoffice.org Writer 都不会出问题。
注:是英文欧2 不是数字零2。还是那句话,如果你不知道为什么要换,别问。
2.配置内核的时候有两个选项一定要改:
General Setup -> Optimize for size
去掉前面的对钩,要不然刚才白改了。下面有个
Choose SLAB Allocator
选 SLUB
其它的根据自己情况选吧,在 Processor type and features 里面多花点功夫,如果不是多核就别选 Symmetric multi-processing support ,等等等等。这些在上面那个链接里面都有提及。
3. 切记,
make && make modules_install && make install 之后
还要加一行 make headers_install
安装 header 文件,我们后面要用。
其它问题,上面给的链接讲得很详细了。第N次说。不知道打什么补丁的请不要打任何补丁,别问了。出了事再来问呵呵。
乙。 优化编译 glibc 。
装上新内核以后用它重启一遍看看,如果启动不了请撞墙后重试。不要跳过上一步来这一步,会死人的。
到下面链接
http://download.opensuse.org/factory/repo/src-oss/suse/src/
找 glibc 开头 src.rpm 结尾的软件包下下来,别安装。
比如我下的是:glibc-2.9-15.15.src.rpm 先新建一个目录,把它挪进去,然后解压
- mkdir rpm
- mv glibc-2.9-15.15.src.rpm rpm
- cd rpm
- unrpm glibc-2.9-15.15.src.rpm
复制代码
编辑解压出来的 glibc.spec
找到
--with-tls --with-__thread --enable-kernel=2.6.4
把 2.6.4 换成你要在机器上跑的最低内核版本。比如 opensuse 11.1 自带 2.6.27 而你编译了 2.6.29 稳定版内核。如果你仍然想能用 自带内核启动,这里填 2.6.27。则 2.6.27 及以上版本都能启动,如果你像我一样填了 2.6.29 那么自带内核启动不了了,显示版本过低,但是大于等于 2.6.29 内核的都可以启动。这也是为什么这一步开始的时候一定要求重启。免得新内核起不来,旧内核也被 glibc 废了。
此外,在编译的时候会报告缺少 html 文件和 info 文件,我们把相应行从 spec 文件删掉。借此机会熟悉一下 spec 文件。不用太仔细了解,很少有机会用到它。
spec 文件就是生成 RPM 的控制文档,一个打包会根据里面的信息去获取源码,打补丁,编译后获取文件安装路径并将其做成二进制的包。可以看到,软件包的依赖性其实是写在 spec 文件中的。
找到文件中下面各个部分,删除掉:
- %package info
- License: GPL v2 or later
- Summary: Info Files for the GNU C Library
- Group: Documentation/Other
- PreReq: %{install_info_prereq}
- AutoReqProv: on
-
- %description info
- This package contains the documentation for the GNU C library stored as info files. Due to a lack of resources, this documentation is not complete and is partially out of date.
复制代码
以上代码是定义子软件包信息,一个 spec 文件可以打一系列包。比如 kde4-kwrite, kde4-dolphin 其实都是 kdebase 的子软件包。这里是定义了一个叫做 glibc-info 的软件包,由于 src.rpm 文件有点问题,所以需要手动处理,去掉它。
-
- %package html
- License: GPL v2 or later; LGPL v2.1 or later
- Summary: HTML Documentation for the GNU C Library
- Group: Documentation/HTML
- AutoReqProv: on
-
- %description html
- This package contains the HTML documentation for the GNU C library. Due to a lack of resources, this documentation is not complete and is partially out of date.
复制代码
同上,glibc-html 子包。
-
- mkdir -p $RPM_BUILD_ROOT/usr/share/doc/glibc
- cp -p manual/libc/*.html $RPM_BUILD_ROOT/usr/share/doc/glibc
复制代码
这是生成 html 的语句,不删除编译会出错。
-
- %post info
- %install_info --info-dir=%{_infodir} %{_infodir}/libc.info.gz
- %postun info
- %install_info_delete --info-dir=%{_infodir} %{_infodir}/libc.info.gz
复制代码
对 info 包的后处理脚本,删除。
-
- %files info
- %defattr(-,root,root)
- %doc %{_infodir}/libc.info.gz
- %doc %{_infodir}/libc.info-?.gz
- %doc %{_infodir}/libc.info-??.gz
复制代码
-
- %files html
- %defattr(-,root,root)
- %doc %{_prefix}/share/doc/glibc
复制代码
上面两段是规定子软件包中文件的信息。没有包也没有文件了,删。
保存之后
mv * /usr/src/packages/SOURCES/ && mv /usr/src/packages/SOURCES/*.spec .
这是把当前目录下所有东西都移动到 rpm 编译目录,再把控制编译的文件 glibc.spec 挪回来。
最优美漫长的编译开始了:
依赖性处理
如果你有过编译经验,一定会想到依赖性问题。一个Linux系统就是搭积木搭起来的。下面太监了,上面没法弄。
编译一个软件前,所需的代码/库/软件必须装好,不然只有失败一条路。
这里用 rpmbuild 主要就是解决这个依赖性问题,你不用手动下代码。如果不满足依赖性,会*出:
error: Failed build dependencies:
libstdc++-devel is needed by glibc-2.9-15.29.x86_64
libselinux-devel is needed by glibc-2.9-15.29.x86_64
这就简单了,直接装上提到的包,再来 rpmbuild:
zypper in libstdc++-devel libselinux-devel
一条命令搞定依赖性。
Header 文件缺失
这种情况可能出现也可能不出现,取决于你的架构:
比如64位机器用 2.6.29.x 的内核编译 glibc 的时候,会出现
n file included from /lib/modules/2.6.29.4-default/build/include/linux/byteorder/little_endian.h:12,
from /usr/include/asm/byteorder.h:79,
from /lib/modules/2.6.29.4-default/build/include/linux/atalk.h:5,
from ../sysdeps/unix/sysv/linux/netatalk/at.h:25,
from ../sysdeps/unix/sysv/linux/sa_len.c:22:
/lib/modules/2.6.29.4-default/build/include/linux/swab.h:6:22: error: asm/swab.h: 没有那个文件或目录
make[2]: *** [/usr/src/packages/BUILD/glibc-2.9/cc-nptl/socket/sa_len.o] 错误 1
make[2]: Leaving directory `/usr/src/packages/BUILD/glibc-2.9/socket'
make[1]: *** [socket/subdir_lib] 错误 2
make[1]: Leaving directory `/usr/src/packages/BUILD/glibc-2.9'
make: *** [all] 错误 2
error: Bad exit status from /var/tmp/rpm-tmp.57914 (%build)
此时不必惊慌,看看提示,错误的意思大概就是没有/lib/modules/2.6.29.4-default/build/include/asm-x86/swab.h 这个文件(asm 目录软链接到 asm-86)
通过:
sudo touch /lib/modules/2.6.29.4-default/build/include/asm-x86/swab.h
搞定。
劫后英雄传
编译完成以后,会在 /usr/src/packages/RPMS 目录下面生成 rpm
具体生成的包会列出来,注意看最后几行的屏幕输出。
此时已经生成了 SRPM 包和几个 rpm 文件
glibc-2.9-15.15.x86_64.rpm
glibc-devel-2.9-15.14.x86_64.rpm
glibc-i18ndata-2.9-15.14.x86_64.rpm
glibc-locale-2.9-15.14.x86_64.rpm
glibc-obsolete-2.9-15.14.x86_64.rpm
glibc-profile-2.9-15.14.x86_64.rpm
SRPM或者叫src.rpm文件仅仅包含源码,安装它没有任何意义。建议 mv 到其它目录以备后用。
而几个 rpm 才是编译成果。一个 glibc,一个 glibc-devel,看看默认系统里面有没有:
rpm -q glibc glibc-devel glibc-i18ndata glibc-locale glibc-obsolete glibc-profile
发现大部分都有,那就用原有的包都升级替换成新编译的成果。
- sudo rpm -Uhv --force 包1 包2.......
复制代码
大功告成。重启一下体验一下。
别忘了打扫刚才生成rpm 的战场,下次还要用:
- cd /usr/src/packages/SOURCES/
- rm *
- cd /usr/src/packages/BUILD/
- rm -rf *
复制代码
如果需要具体步骤的一些解释,欢迎跟帖提出。
待续 |
|