LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4521|回复: 35

由外至内加速你的Linux (openSUSE折腾指南)连载D

[复制链接]
发表于 2009-5-7 01:13:57 | 显示全部楼层 |阅读模式
[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 先新建一个目录,把它挪进去,然后解压

  1. mkdir rpm
  2. mv glibc-2.9-15.15.src.rpm rpm
  3. cd rpm
  4. 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 文件中的。

找到文件中下面各个部分,删除掉:

  1. %package info                                             
  2. License:        GPL v2 or later                           
  3. Summary:        Info Files for the GNU C Library         
  4. Group:          Documentation/Other                       
  5. PreReq:         %{install_info_prereq}                    
  6. AutoReqProv:    on                                       
  7.                                                          
  8. %description info                                         
  9. 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 文件有点问题,所以需要手动处理,去掉它。
                                                                        
  1.                                                       
  2. %package html                                                           
  3. License:        GPL v2 or later; LGPL v2.1 or later                     
  4. Summary:        HTML Documentation for the GNU C Library               
  5. Group:          Documentation/HTML                                      
  6. AutoReqProv:    on                                                      
  7.                                                                         
  8. %description html                                                      
  9. 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 子包。
                                                                        
  1.                                                    
  2. mkdir -p $RPM_BUILD_ROOT/usr/share/doc/glibc
  3. cp -p manual/libc/*.html $RPM_BUILD_ROOT/usr/share/doc/glibc
复制代码
  

这是生成 html 的语句,不删除编译会出错。


  1. %post info
  2. %install_info --info-dir=%{_infodir} %{_infodir}/libc.info.gz

  3. %postun info
  4. %install_info_delete --info-dir=%{_infodir} %{_infodir}/libc.info.gz
复制代码


对 info 包的后处理脚本,删除。


  1. %files info
  2. %defattr(-,root,root)
  3. %doc %{_infodir}/libc.info.gz
  4. %doc %{_infodir}/libc.info-?.gz
  5. %doc %{_infodir}/libc.info-??.gz
复制代码



  1. %files html
  2. %defattr(-,root,root)
  3. %doc %{_prefix}/share/doc/glibc
复制代码


上面两段是规定子软件包中文件的信息。没有包也没有文件了,删。

保存之后
mv * /usr/src/packages/SOURCES/ && mv /usr/src/packages/SOURCES/*.spec .

这是把当前目录下所有东西都移动到 rpm 编译目录,再把控制编译的文件 glibc.spec 挪回来。

最优美漫长的编译开始了:
  1. rpmbuild -ba 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
发现大部分都有,那就用原有的包都升级替换成新编译的成果。

  1. sudo rpm -Uhv --force 包1 包2.......
复制代码


大功告成。重启一下体验一下。

别忘了打扫刚才生成rpm 的战场,下次还要用:
  1. cd /usr/src/packages/SOURCES/
  2. rm *
  3. cd /usr/src/packages/BUILD/
  4. rm -rf *
复制代码

如果需要具体步骤的一些解释,欢迎跟帖提出。

待续
发表于 2009-5-7 01:22:19 | 显示全部楼层
第一次坐沙发
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-7 01:38:59 | 显示全部楼层
我的第四个连载就这样被你杀了
回复 支持 反对

使用道具 举报

发表于 2009-5-7 09:46:04 | 显示全部楼层
内核选项不明白的弟兄可以参考 金步国的 内核解释文章。
回复 支持 反对

使用道具 举报

发表于 2009-5-7 12:10:24 | 显示全部楼层
用的系统自带的2.6.27的内核,懒得打补丁,修改了makefile文件,但是编译的时候出现如下提示
HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf -s arch/x86/Kconfig
  CHK     include/linux/version.h
  UPD     include/linux/version.h
  CHK     include/linux/utsrelease.h
  UPD     include/linux/utsrelease.h
  SYMLINK include/asm -> include/asm-x86
  CC      kernel/bounds.s
cc1: error: output filename specified twice
make[1]: *** [kernel/bounds.s] 错误 1
make: *** [prepare0] 错误 2
是怎么一回事啊
回复 支持 反对

使用道具 举报

发表于 2009-5-7 14:40:21 | 显示全部楼层
cc1: error: output filename specified twice

你清理没有?
回复 支持 反对

使用道具 举报

发表于 2009-5-7 15:49:15 | 显示全部楼层
做了清理的,而且本来之前这个目录下也没有做过编译啊。
make clean
make mrproper
重新从源里下了一个2.6.29的也不行呢,同样的提示。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-7 16:21:14 | 显示全部楼层
Post by wenzi_lee;1984473
做了清理的,而且本来之前这个目录下也没有做过编译啊。
make clean
make mrproper

gcc 4.4 和 2.6.27 内核的问题?
而且 suse 里面自带已经打了不少补丁了。
换 .29
回复 支持 反对

使用道具 举报

发表于 2009-5-7 16:42:25 | 显示全部楼层
我不是从kernel的官网上下的,直接从http://download.opensuse.org/factory/repo/oss/suse/x86_64/下的kernel-source-2.6.29-6.5.x86_64.rpm 安装的,同样不会,是不是一定 要从官网上下才行哦,另gcc 4.3
回复 支持 反对

使用道具 举报

发表于 2009-5-7 17:49:13 | 显示全部楼层
唉,发现原因了,那个makefile的O2参数一改成O3就不行,为什么 呢?是哪里还要设置下?唉,看样子没命用O3了,现在在O2下解决了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表