邪恶八进制信息安全团队技术讨论组's Archiver

ring04h 2007-1-22 17:15

[转载]Linux内核如何从2.4升级到2.6

信息来源:天极网
原始链接:[url]http://www.yesky.com/SoftChannel/72350107080589312/20031216/1754073_1.shtml[/url]

<br /><br />作为2.6.0的最后一个测试版本,2.6测试版经历了更多的检测器的检验,尤其是在当前对开发者进一步追捕内核bugs和稳定工作有非常重大的意义。一旦2.7版本开发树开展起来,必定将带来其新特征的研究热潮。

  本文的目的在于为2.4内核的读者提供一些升级到2.6内核的技巧。因为2.6内核仍然是个发展中的内核,或许你在运行中会遇到些问题,但是它的总体性能和稳定性还是非常好的。

  小知识:Linux采用了双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。

  目标用户

  本文主要针对Lunix2.4内核的用户。(如果之前没有的,可见The Linux Kernel HOWTO)

  准备工作:首先做好重要数据的备份工作

  在开始之前,请确定你的所有数据已经备份。

  第一步:当前2.6内核的安装(获取)

  首先,所有Linux内核的官方版本可以在[url]http://kernel.org/.[/url] 找到。通过镜像站点下载内核程序可以比较快捷迅速些。kernel.org 镜像站点列表:[url]http://kernel.org/mirrors[/url] 。

  然后下载GnuPG ,它主要用于检验新的内核程序的真实性和合法性。([url]http://www.kernel.org/signature.html.[/url])<br /><br /><span class="f14"> <b>第二步:熟悉已有文件</b>
<p>  至少需要熟悉顶级README文件、Documentation目录中的change文件,它们都是分布式的Linux内核源代码。<br /><br />  因为2.6.0-test是内核发展中的一个阶段(2.6.0没有扩展名-test,即是2.6的最初版本),所以其顶级README文件引自2.5开发内核的README文件。你将从这个文件中获得许多成功编译Linux内核的技巧。(具体内容见附1)</p>
<p>  “Documentation/Changes”文件列出了发展2.5内核的新需求,提供了新内核程序升级的软件列表。(主要内容见附2)</p>
<p>  <b>第三步:升级系统内每个change文件的版本</b></p>
<p>  新的2.6内核的升级工作涉及到许多实用程序的升级。对于某些change文件中列出的实用程序也不必担心,它们或许只是某种文件系统的特殊例子而已。但是,下面的文件还是必须至少要满足到下表给出的的最低版本:<br /></p>
<table width="500" cellspacing="1" cellpadding="0" border="0" bgcolor="#000000" align="center">
<tbody>
<tr bgcolor="#ffffff">
<td width="138" height="25">
<div align="center"><b>Name: </b></div></td>
<td width="155" height="25">
<div align="center"><b>Minimum version: </b></div></td>
<td width="203" height="25">
<div align="center"><b>How to find version:</b></div></td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">Gnu C Compiler</td>
<td width="155" height="20">
<div align="center">2.95.3</div></td>
<td width="203" height="20">gcc--version</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">Gnu Make</td>
<td width="155" height="20">
<div align="center">3.78</div></td>
<td width="203" height="20">make--version</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">binutils</td>
<td width="155" height="20">
<div align="center">2.12</div></td>
<td width="203" height="20">ld-v</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">util-linux</td>
<td width="155" height="20">
<div align="center">2.10o</div></td>
<td width="203" height="20">fdformat--version</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">module-init-tools</td>
<td width="155" height="20">
<div align="center">0.9.9</div></td>
<td width="203" height="20">depmod-V</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">procps</td>
<td width="155" height="20">
<div align="center">2.0.9</div></td>
<td width="203" height="20">ps--version</td></tr>
<tr bgcolor="#ffffff">
<td width="138" height="20">[procps 2.x]</td>
<td width="155" height="20">
<div align="center">[procps .x]</div></td>
<td width="203" height="20"></td></tr></tbody></table>
<p>  (若有变动,参见“Documentation/Change”中的最新更新。具体可见附2)</p>
<p>  下面的实用程序是文件系统中的特殊程序。若运行ext2 或ext3,那么就必须升级e2fsprogs。若运行jfs,就必须升级jfsutils,等等。如:<br /></p>
<table width="500" cellspacing="1" cellpadding="0" border="0" bgcolor="#000000" align="center">
<tbody>
<tr bgcolor="#ffffff">
<td width="104" height="25">
<div align="center"><b>Name:</b></div></td>
<td width="144" height="25">
<div align="center"><b>Minimum version: </b></div></td>
<td width="248" height="25">
<div align="center"><b>How to find version:</b></div></td></tr>
<tr bgcolor="#ffffff">
<td width="104" height="20">e2fsprogs</td>
<td width="144" height="20">
<div align="center">1.29</div></td>
<td width="248" height="20">tune2fs</td></tr>
<tr bgcolor="#ffffff">
<td width="104" height="20">jfsutils</td>
<td width="144" height="20">
<div align="center">1.0.14</div></td>
<td width="248" height="20">fsck.jfs -V</td></tr>
<tr bgcolor="#ffffff">
<td width="104" height="20">reiserfsprogs</td>
<td width="144" height="20">
<div align="center">3.6.3</div></td>
<td width="248" height="20">reiserfsck–V 2>&1| grep reiserfsprogs</td></tr>
<tr bgcolor="#ffffff">
<td width="104" height="20">xfsprogs</td>
<td width="144" height="20">
<div align="center">2.1.0</div></td>
<td width="248" height="20">xfs_db -V</td></tr>
<tr bgcolor="#ffffff">
<td width="104" height="20">nfs-utils</td>
<td width="144" height="20">
<div align="center">1.0.5</div></td>
<td width="248" height="20">showmount --version</td></tr></tbody></table>
<p>  另外,少数实用程序当你用到它时才需要升级的有:</p>
<table width="500" cellspacing="1" cellpadding="0" border="0" bgcolor="#000000" align="center">
<tbody>
<tr bgcolor="#ffffff">
<td width="102" height="25">
<div align="center"><b>Name:</b></div></td>
<td width="156" height="25">
<div align="center"><b>Minimum version:</b></div></td>
<td width="238" height="25">
<div align="center"><b>How to find version:</b></div></td></tr>
<tr bgcolor="#ffffff">
<td width="102" height="20">pcmcia-cs</td>
<td width="156" height="20">
<div align="center">3.1.21</div></td>
<td width="238" height="20">Cardmgr -V</td></tr>
<tr bgcolor="#ffffff">
<td width="102" height="20">quota-tools</td>
<td width="156" height="20">
<div align="center">3.09</div></td>
<td width="238" height="20">Quota -V</td></tr>
<tr bgcolor="#ffffff">
<td width="102" height="20">PPP</td>
<td width="156" height="20">
<div align="center">2.4.0</div></td>
<td width="238" height="20">ppd--version</td></tr>
<tr bgcolor="#ffffff">
<td width="102" height="20">isdn4k-utils</td>
<td width="156" height="20">
<div align="center">3.1pre1</div></td>
<td width="238" height="20">Isdnctrl 2>&1 | grep version</td></tr>
<tr bgcolor="#ffffff">
<td width="102" height="20">oprofile</td>
<td width="156" height="20">
<div align="center">0.5.3</div></td>
<td width="238" height="20">oprofiled--version</td></tr></tbody></table>
<p>  如果首次运行ALSA,请访问[url]http://www.alsa-project.org/[/url]获取最新的alsa-lib 和 alsa-utils。</p><br /></span><span class="f14"> <b>第四步:配置新内核</b>
<p>  这里,你所注意到的首要变化之一就是新的结构体系的形成。旧的TK/Tcl“xconfig”结构由新的QT“xconfig”所取代。当然,GTK“gconfig”也行。</p>
<p>  2.6内核配置包括:</p>
<p>  Make config </p>
<p>  与2.4内核配置“config”相似,做为简单的配置方法,它仅仅要求你选择每个配置选项。需要“bash”。</p>
<p>  Make menuconfig</p>
<p>  与2.4内核配置的“menuconfig”相似。</p>
<p>  Make xconfig</p>
<p>  新的默认的图形化的配置系统,利用了QT库。它非常方便易用。</p>
<p>  Make gconfig</p>
<p>  该选项是xconfig的新的克隆,用GTK库代替了QT库。不幸的是,在测试中发现其中有bug。运行时会不停的重复提示同样的错误信息。</p>
<p>  Make oldconfig</p>
<p>  在内核升级中,该选项非常有用。乍一看它有点象简单的“make
config”,实际上,oldconfig是读取和自动响应设置当前的.config设置。它向你提示新的配置选项的功能。如要用,只需简单地复制入你
的old.config文件,再运行“make oldconfig”即可。</p>
<p>  (注:首次配置2.6内核时,查看Linux代码顶级README文件时请注意以下技巧: ①多余的驱动将增大内核,在一定条件下会导致问题的出现</p>
<p>  ②内核hacking配置信息的选择常常导致内核更庞大更缓慢,甚至导致内核的不稳定。因此在回答“development”、“experimental”或“debugging”特征时多数选择“N”。)</p>
<p>  <b>ALSA:</b></p>
<p>  从2.4版本到2.6版本的升级,这就要使用到ALSA(Advanced Linux Sound Architecture即:新的
Linux 音频体系结构)。它取代了OSS(Open Sound System)。配置内核时,选定ALSA的OSS
API效法选项(SND_OSSEMUL、SND_MIXER_OSS和SND_PCM_OSS)和适当的声音驱动(PCI
驱动)。最后,下载和安装最新的alsa-lib和alsa-utils。</p><br /></span><span class="f14"><b>第五步:创建新内核</b>
<p>  创建2.6内核比2.4的更容易些,不必进行“make dep”这一步。创建新的内核,进行“make
bzlmage”。如果选择了编译模块,那么还需要运行“make modules”和“make
modules_install”。可以一起进行:“make bzlmage && make modules
&& make modules_install”。</p>
<p>  <b>第六步:安装新内核</b></p>
<p>  创建了内核,需要将之复制到一个位置,若x86的机子,其位置路径就是“arch/i386/boot”。拷贝该文件和新的体系.map到根目录/boot下。例如:</p>
<p>  # pwd<br />  /usr/src/linux-2.6.0-test4<br />  # mv arch/i386/boot/bzImage /boot/bzImage-2.6.0-test4<br />  # mv System.map /boot/System.map-2.6.0-test4<br />  # cd /boot<br />  # rm System.map<br />  # ln –s System.map-2.6.0-test4 System.map</p>
<p>  拷贝了新内核后,然后是使用grub和lilo配置根loader。有个发现就是新的2.6内核比用同样版本的gcc编译的2.4内核更大,或许是在编译时选了更多选项的缘故吧。</p>
<p>  -rw-r--r-- 1 root  root  1094390 Aug 12 20:30 bzImage-2.4.21-ck3<br />  -rw-r--r-- 1 root  root  1639129 Aug 27 22:06 bzImage-2.6.0-test4</p>
<p>  <b>第七步:确认数据的备份</b></p>
<p>  这一步,你不用做任何或许会破坏到硬盘数据的事,但下一步即是启动新内核,最后一次请确认硬盘重要数据已备份。 第八步:试用新内核</p>
<p>  现在,重启计算机,测试新编译的2.6内核。如果所有步骤正确,将会出现内核启动信息:initstate=3,新的内核很快就出现。如果安装了ALSA,可以检验声音驱动: 'cat /proc/asound/cards'。例如:<br /><br />  $ cat /proc/asound/cards<br />  0 [Live]:EMU10K1 - Sound Blaster Live! <br />  Sound Blaster Live! (rev.5) at 0x18e0, irq 11</p>
<p>  如果出现以上信息,说明声音程序没运行,启动“alsamixer”并确认驱动已经开启。另外发现还需开启“Master”和“PCM” (/dev/dsp),声音程序才能正常运作。</p><p><span class="f14"> <b>附1</b>
<p>  README——Linux 内核2.5.xx(部分数据)</p>
<p>  讲述了内核的安装方法和出错的处理方法。</p>
<p>  <b>内核的安装</b></p>
<p>  安装了所有必须的资源后,将内核解压缩在许可目录下(如主目录):</p>
<p>  gzip -cd linux-2.5.XX.tar.gz | tar xvf -   (XX为新内核的版本号)<br /><br />  注:不得用/usr/src/linux<br /><br />  通过补丁升级2.5.xx版本。<br /><br />  gzip -cd ../patch-2.5.xx.gz | patch -p1或bzip2-dc ../patch-2.5.xx.bz2 | patch -pl或linux/scripts/patch-kernel linux<br />  删除旧的.o文件及其附属文件 <br />  cd linux<br />  make mrproper</p>
<p>  软件需要</p>
<p>  编译和运行2.5.xx内核必须要升级各种软件包的新版本。参见./Documentation/change中需要的最低版本。</p>
<p>  编译内核</p>
<p>  ⑴确定gcc 2.95.3版本以上</p>
<p>  ⑵ make bzImage (如果用磁盘启动则插入A盘再进行make bzdisk)</p>
<p>  ⑶ make modules (若编译部分modules,则在“make modules_install”后执行)</p>
<p>  ⑷ 保留一份内核的备份件</p>
<p>  ⑸ 启动新内核</p>
<p>  新内核的拷贝。编译后的新内核在.../linux/arch/i386/boot/bzImage可找到,将之拷贝到可启动的位置。若是软盘
驱动的,将内核的bzImage文件拷贝到/dev/fd0形成可启动的软驱。若是硬盘启动,则用LILO(/etc/lilo.conf)。内核映象文
件常常是/vmlinuz、/boot/vmlinuz、/bzImage或/boot/bzImage。保存新的内核映象文件覆盖旧的,然后再运行
LILO,就可以启用新内核了。</p>
<p>  重新设置LILO是运行/sbin/lilo的关键。你可通过编辑/etc/lilo.conf来指定旧的内核映象(即是/vmlinux.old)的出口以避免新内核运行出现问题。LILO重设后,所有准备工作就都做好了,然后就是关闭系统,重启计算机。</p>
<p>  注:如果需要改变缺省的root驱动、video 方式、ramdisk大小等等,可在内核映象中用“rdev”程序(或LILO的引导选项)。不必重新编译内核来改变这些参数。</p>
<p>  ⑹重新启动新内核。</p><p><span class="f14"><b>附2</b>
<p>  Documentation/Changes文件(部分数据)</p>
<p>  软件需要的最低版本:</p>
<p>Gnu C      2.95.3         # gcc --version<br />Gnu make     3.78          # make --version<br />binutils      2.12         # ld -v<br />util-linux      2.10o         # fdformat --version<br />module-init-tools   0.9.9         # depmod -V<br />e2fsprogs     1.29         # tune2fs<br />jfsutils       1.0.14        # fsck.jfs -V<br />reiserfsprogs    3.6.3         # reiserfsck -V 2>&1|grep reiserfsprogs<br />xfsprogs      2.1.0         # xfs_db -V<br />pcmcia-cs     3.1.21        # cardmgr -V<br />quota-tools     3.09         # quota -V<br />PPP        2.4.0        # pppd --version<br />isdn4k-utils     3.1pre1        # isdnctrl 2>&1|grep version<br />nfs-utils      1.0.5         # showmount --version<br />procps       2.0.9        # ps --version<br />oprofile       0.5.3        # oprofiled --version</p>
<p>  内核编译<br /><br />  GCC:2.95.x (x >= 3)<br />  Gnu make:3.78</p>
<p>  其他<br /><br />  ppp:2.4.0<br />  ……</p>
<p>  <b>附3</b></p>
<p>  其他技巧:对于运行的内核2.6.x升级到它的下一个版本的方法<br /><br />  如做2.6.0-test5的升级,其大致步骤为:备份数
据——获取2.6.0-test5补丁——应用2.6.0-test5补丁,修补内核——删除old.o文件及其从属文件(利用“#make
mrproper”)——新内核配置——创建新内核——内核的导入和试用。</p></span></p></span></p></span><br />

页: [1]
© 1999-2008 EvilOctal Security Team