﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-YGB.Grushy-文章分类-Linux内核管理</title><link>http://www.cnitblog.com/ygb/category/1645.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 14:22:19 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 14:22:19 GMT</pubDate><ttl>60</ttl><item><title>编译内核</title><link>http://www.cnitblog.com/ygb/articles/5539.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sun, 18 Dec 2005 09:50:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/5539.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/5539.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/5539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/5539.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/5539.html</trackback:ping><description><![CDATA[作者：北南南北<BR>来自：LinuxSir.Org<BR>提要： 编译内核主要是通过内核实现某些功能，比如iptables 需要内支持；所有的硬件的支持也是通过内核实现的；本文只是简单的给初学者讲一下编译内核的流程；<BR><BR><BR>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>正文<BR>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR><BR><BR><BR>一、为什么要编译内核；<BR><BR><BR>有时我们为了实现某些功能，比如对iptables的防火墙有些需要内核支持；还有实现一些硬件的支持等，这时我们需要重编内核；<BR><BR><BR><BR>二、内核源码版本的选择；<BR><BR><BR>如果发行版本提供内核源码，最好还是用发行版本提供的；比如Fedora 4.0 提供了很多版本的内核源码；我们安装好后，他自带的配置文件大多能满足我们的需要，对于新手来说，根据自带的内核的配置文件.config ，我们也能学到一点如何配置内核。也没有什么难的，熟能生巧罢了；<BR><BR>如果从 kernel.org 下载最新稳定版本的内核也是可以的；<BR><BR><BR><BR>三、内核源码安装或解压；<BR><BR><BR>对于Fedora Core 4.0 来说，内核源码是放在 /usr/src/kernels 目录中；如果通过在线升级内核，也是放在这个目录中；如果您的系统中的 /usr/src/kernels/ 中没有内容，说明您没有安装内核的源码包 kernel-devel 软件包；<BR><BR>您可以通过软件包管理器来补装 ，请参考 《Fedora / Redhat 软件包管理指南》<BR><BR>如果您用Fedora Core 4.0 ，我建议您在保留老内核的基础上，在线下载最新版本的内核 kerenl-devel 和对应版本的&nbsp; kernel 或者从 kernel.org 下载，有时可能新的kerenl 已经解决了您所面对的问题，这时就没有必要编译内核了；<BR><BR>如果您是通过在线安装的内核源码包 ，比如通过 apt+synaptic 或者yum 安装的，内核源码会被放到/usr/src/kernel 下的目录中，您要进入相对应的目录进行编译；<BR><BR>在线更新软件包，请参考 《Fedora / Redhat 软件包管理指南》，推荐 apt+synaptic 工具；<BR><BR>如果您是是下载kernel 和kernel-devel 的rpm 包，可以通过来安装；<BR>代码:<BR><BR>[root@localhost beinan]# rpm -ivh kernel*.rpm<BR><BR><BR><BR>如果您是从kernel.org 下载的类似 linux-2.6.13.tar.bz2 或者 linux-2.6.13.tar.gz的，您要把下载下来的文件移到 /usr/src 目录中解压； 然后进入解压的目录中进行配置和编译；<BR>代码:<BR><BR>[root@localhost beinan]# mv linux-2.6.13.tar.bz2 <BR>[root@localhost beinan]# cd /usr/src/<BR>[root@localhost src]# tar jxvf linux-2.6.12.3.tar.bz2<BR><BR><BR><BR>提示：本文以linux-2.6.12.3为例，其实通过发行版的升级版的 kernel-devel 和从kernel.org 下载下来的差不多，大同小异；不同的是通过在线升级的rpm格式的内核源码包，有配置文件.config 可以参考；安装到的目的地是/usr/src/kernel 对 FC 4.0来说；如果您要高编译和配置内核，<BR><BR><BR>四、内核的配置；<BR><BR><BR><BR>1、进入目录执行 make mrproper ，对于从 kernel.org 下载而来的tar.bz格式的源码包；<BR><BR>代码:<BR><BR>[root@localhost src]# cd linux-2.6.12.3/<BR>[root@localhost linux-2.6.12.3]#<BR>[root@localhost src]# cd linux-2.6.12.3/<BR>[root@localhost linux-2.6.12.3]# make mrproper<BR>[root@localhost linux-2.6.12.3]# make menuconfig <BR><BR><BR><BR>对于Fedora Core 4.0 ，如果您是通过在线安装的 kernel和kernel-devel 新版本的包，比如是2.6.12- 1.1398_FC4-i686，你可以直进入 /usr/src/kernel/相应的目录中直接执行 make menuconfig ；利用发行版本提供的 .config 来配置，这样方便点。不要make mrproper ，否则.config 就没有了；这也是为什么要用发行版本提供的内核源码升级包的原因；<BR><BR><BR>其它配置和安装大同小异；模仿总可以吧；<BR><BR><BR>2.简要的配置内核；<BR><BR><BR>进入配置内核的配置模式后，我们可能一无所知，看下面；<BR><BR>内核配置有两种方法，一种是直接置入内核 * ；另一种是编成模块 M ；两种方法各有优点；直接编入内核的，比如设备的启动，不再需要加载模块的这一过程了；而编译成模块，则需要加载设备的内核支持的模块；但直接把所有的东西都编入内核也不是可行的，内核体积会变大，系统负载也会过重。我们编内核时最好把极为重要的编入内核；其它的如果您不明白的，最好用默认。<BR><BR><BR>1）移动键盘上下左右键，按Enter 进入一个目录。把指针移动到Exit就退出当前目录到上级目录；<BR><BR>2）针对自己机器存在的问题进行修改，比如大内存的支持；<BR><BR>选择自己机器的CPU；<BR><BR>移动键盘到 Processor type and features ---&gt; ，然后按ENTER进入；<BR>找到 Processor family (Pentium-Pro) ---&gt; 按ENTER进入；<BR><BR>进入后我们发现有好多CPU的型号可选；一般的情况下要根据<BR>bash-3.00# cat /proc/cpuinfo 输出的信息来选，比如我们的是Celeron （P4）一代的，应该选如下的，当然默认的 486也是可以正常运行的，既然我们重编一次内核，就得选中对应型号的，也许性能有所提高呢；<BR>代码:<BR><BR>Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)<BR><BR><BR>对大内存支持；如果内存是1G或者1G以上，但小于4G的，就要选4G支持；如果超过4G的，要选64G的支持；<BR><BR>代码:<BR><BR>High Memory Support (4GB) ---&gt;<BR><BR>(X) 4GB<BR>( ) 64GB<BR><BR><BR><BR>还有比如声卡等硬件，需要我们一步一步的查看；如果有不明之处，就要按 [shift]+？的组合键来查看说明。一般的情况下，2.6.x的内核会根据机器的情况自动配出一个文件，只需要我们来查看一下，把重要的地方改改就行了；<BR><BR>再举个例子：比如我现在所用的声卡是intel ac97的，我应该怎么配置呢？<BR><BR>首先要知道自己的声卡的芯片组，我们要通过lspci -v 来查看；<BR>代码:<BR><BR>[root@localhost beinan]#lspci -v<BR><BR><BR>只查看声卡的，应该用如下的方法：<BR>代码:<BR><BR>[root@localhost beinan]# lspci -v |grep audio<BR>00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4) AC'97 Audio Controller (rev 03)<BR><BR><BR><BR>通过上面的输出，我们知道这台机器用的是intel AC97声卡；所以我们要特别注意AC97的配置；<BR><BR>代码:<BR><BR>找到 Device Drivers ---&gt; Sound ---&gt;<BR>&lt;M&gt; Sound card support 声卡的支持，这个是一定要选中的吧；<BR>&lt;M&gt; Advanced Linux Sound Architecture 对声卡支持的ALSA驱动的支持；<BR>下面有OSS驱动，只是一部份。如果想用OSS的驱动更全的，可以去买；其它的就看如下的选吧；<BR>&lt;M&gt; Sequencer support<BR>&lt;M&gt; Sequencer dummy client<BR>&lt;M&gt; OSS Mixer API<BR>&lt;M&gt; OSS PCM (digital audio) API[*] OSS Sequencer API<BR>&lt;M&gt; RTC Timer support[*] Verbose printk<BR>[ ] Debug<BR><BR><BR><BR>大多是默认的就好，如果您不知道是做什么用的，或者怎么用；<BR><BR>然后我们再向下看有<BR>代码:&nbsp;&nbsp;<BR><BR><BR><BR>代码:<BR><BR>Generic devices ---&gt; 进入里面<BR>&lt;M&gt; Dummy (/dev/null) soundcard<BR>&lt;M&gt; Virtual MIDI soundcard<BR>&lt;M&gt; MOTU MidiTimePiece AV multiport MIDI<BR>&lt;M&gt; UART16550 serial MIDI driver<BR>&lt;M&gt; Generic MPU-401 UART driver<BR>ISA devices ---&gt; 如果您用ISA声卡就在这里面选；<BR>PCI devices ---&gt; 如果您用PCI声卡，就在这里面选，集成声卡也在这里；<BR>USB devices ---&gt; 这是USB声卡内核支持选项；我有一个这样的声卡，但没有试过；<BR>PCMCIA devices ---&gt; 这是PCMCIA声卡的选项，我还没有看过这样的声卡呢；如果您有，就在这里面动动手吧。<BR><BR><BR>因为我用的是Intel 集成的声卡，所以要在PCI中选择，我们在 中可以看到有两个与INTEL有关的；<BR>代码:<BR><BR>&lt;M&gt; Intel/SiS/nVidia/AMD/ALi AC97 Controller 这个才是Intel AC97声卡的；<BR>&lt; &gt; Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL) 这个是机器集成的INTEL猫的蜂鸣器的；<BR><BR><BR>因为我发现如果把猫的蜂鸣器的驱动也选上，可能造成两个冲突。所以只能选上面的那个；<BR><BR><BR>我们再回到 Open Sound System ---&gt; 中看看，与我用的声卡是不是有关的？<BR>代码:<BR><BR>&lt;M&gt; Open Sound System (DEPRECATED)<BR>&lt;M&gt; Intel ICH (i8xx) audio support<BR>&lt;M&gt; OSS sound modules<BR>&lt;M&gt; Loopback MIDI device support<BR>&lt;M&gt; Microsoft Sound System support<BR><BR><BR>我们也可以看到Open Sound System中也有好多的声卡驱动，大家根据前面的lspci -v 来选择吧。<BR><BR><BR>3）对于操作系统所采用的文件系统的支持要编入内核，最好不要编成模块；（重要）<BR><BR><BR><BR>比如我的Fedora core 4.0 所采用的文件系统用的是ext3 ，所以我要把它直接编入内核；好处是不受模块丢失或者损坏而不能启动系统；而有时您把系统所采用的文件系统编译成模块，出现VFS错误，也有这方面的事，可能是您没有把ext3加入到相应的加载模块的配置文件中，所以我们为了减少麻烦，把风险降到最低，还是要直接置入内模的好；<BR>代码:<BR><BR>File systems ---&gt;<BR>&lt;*&gt; Ext3 journalling file system support[*] Ext3 extended attributes[*] Ext3 POSIX Access Control Lists[*] Ext3 Security Labels<BR><BR><BR>如果您还有其它的硬盘分区要读取，比如是reiserfs、ext2、fat、fat32、ntfs等，这样的可以编成模块来支持；<BR><BR><BR>再举一例：如果您的的操作系统用的是reiserfs的文件系统，当然就要把reiserfs的直接编入内核，其它的可以编成模块来支持了；<BR><BR><BR>4）对于硬盘及RAID的支持，要直接编入内核；<BR><BR>比如ATA、SATA、SCSI及RAID的支持直接内核支持；有时编完内核后，启动时不能识别硬盘和RAID，大多事情出在这里；Slackware中在这方面有的是模块支持，我们可以把它由模块M改成内核*来支持；如果您不明白，就按默认进行；SATA的硬盘的支持除了选中SATA的支持、IDE设备的支持以外，还要选中SCSI的支持；<BR><BR>5）对于咱们所没有的设备，可以在内核中不选，熟能生巧罢了；<BR><BR>比如我没有ISDN设备 ，所以就把ISDN去掉；<BR>代码:<BR><BR>ISDN subsystem ---&gt;<BR>&lt; &gt; Linux telephony support<BR><BR><BR><BR><BR>如果您没有1394的设备 ，当然可以把1394的支持也去掉；等等。。。。。。。<BR><BR>如果您有USB的设备，要把USB方面好好看看；比如大家常用的移动硬盘；USB猫等，还有扫描仪等；<BR><BR>内核配置就说这么多吧，太多了，我也说不清楚，水平有限啊；<BR><BR>配置好后先要保存<BR><BR>Save Configuration to an Alternate File<BR><BR>出来一个<BR><BR>Enter a filename to which this configuration ，should be saved as an alternate. Leave blank to abort.<BR>.config<BR><BR>按回车就行了，这样就保存住了；<BR><BR><BR>然后退出 Exit ，这时也会出现保存 ；<BR><BR><BR>如果你想把.config保存起来，可以再复制一份到安全一点的目录，以备后用；<BR><BR>五、编译内核；<BR><BR><BR>代码:<BR><BR>[root@localhost linux-2.6.12.3]# make<BR>[root@localhost linux-2.6.12.3]# make modules_install<BR><BR><BR><BR>这样就编译好了，并把模块也安装在了 /lib/modules目录中了，请看：<BR>代码:<BR><BR>[root@localhost linux-2.6.12.3]# ls /lib/modules/<BR><BR>2.6.11-1.1369_FC4&nbsp;&nbsp; 2.6.12.3<BR><BR><BR><BR><BR>六、安装内核及配置grub或lilo ；<BR><BR><BR>1、复制bzImage等相关文件，并创建initrd文件；<BR><BR>代码:<BR><BR>[root@localhost linux-2.6.12.3]# cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.12.3<BR>[root@localhost linux-2.6.12.3]# cp System.map /boot/System.map-2.6.12.3<BR>[root@localhost linux-2.6.12.3]# cd /boot<BR>[root@localhost linux-2.6.12.3]# /sbin/mkinitrd initrd-2.6.12.3.img&nbsp;&nbsp; 2.6.12.3 <BR><BR><BR><BR>我们把 编译出来的bzImage，拷入到/boot目录，拷贝成 vmlinuz-2.6.12.3；<BR>并且用 mkinitrd 来创建imitrd-xxx.img 文件，其中xxx为内核的版本号，是通过 查看 /lib/modules来版本来对应的，我们是编译出来的是 2.6.12.3，所以就运行上面的命令创建，创建的出来的是initrd-2.6.12.3.img ；不创建这个文件，有时是启动不起来的，比如提示VFS错误等；<BR><BR><BR>2、查看系统引导管理器grub或者lilo的配置文件。<BR><BR><BR>如果想要让新内核能让系统引导管理器grub和lilo的菜单上能看得到，必须改 grub.conf或者lilo.conf，但我们必须保留老内核的在grub和lilo的启动菜单，毕竟我们编内核不能百分百的成功，对不对？？安全第一吧；<BR><BR>我只说grub的，我没有lilo，也不会用。所以咱们还是GRUB吧，FC 4 系统引导管理器是 GRUB，所以我们谈谈GRUB的设置；<BR><BR><BR>查看 /etc/grub.conf；<BR><BR>比如我的grub.conf的内容是这样的；<BR><BR>代码:<BR><BR># grub.conf generated by anaconda<BR>#<BR># Note that you do not have to rerun grub after making changes to this file<BR># NOTICE:&nbsp; You do not have a /boot partition.&nbsp; This means that<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all kernel and initrd paths are relative to /, eg.<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root (hd0,7)<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kernel /boot/vmlinuz-version ro root=/dev/hda8<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initrd /boot/initrd-version.img<BR>#boot=/dev/hda<BR>default=0<BR>timeout=5<BR>#splashimage=(hd0,7)/boot/grub/splash.xpm.gz<BR>#hiddenmenu<BR>title Fedora Core (2.6.11-1.1369_FC4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root (hd0,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initrd /boot/initrd-2.6.11-1.1369_FC4.img<BR>title WinXP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootnoverify (hd0,0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chainloader +1<BR><BR><BR><BR><BR>我们要把老内核的启动保留下来，以防不测，我们只加入新的内核的启动；所以我加上这样一段；<BR><BR>代码:<BR><BR>title Fedora Core (2.6.12.3)<BR>root (hd0,7)<BR>kernel /boot/vmlinuz-2.6.12.3 ro root=LABEL=/ rhgb quiet<BR>initrd /boot/initrd-2.6.12.3.img<BR><BR><BR><BR>咱们再来看一下改过后的配置文件；<BR><BR>代码:<BR><BR># grub.conf generated by anaconda<BR>#<BR># Note that you do not have to rerun grub after making changes to this file<BR># NOTICE:&nbsp; You do not have a /boot partition.&nbsp; This means that<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; all kernel and initrd paths are relative to /, eg.<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root (hd0,7)<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kernel /boot/vmlinuz-version ro root=/dev/hda8<BR>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initrd /boot/initrd-version.img<BR>#boot=/dev/hda<BR>default=0<BR>timeout=5<BR>#splashimage=(hd0,7)/boot/grub/splash.xpm.gz<BR>#hiddenmenu<BR><BR>title Fedora Core (2.6.12.3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root (hd0,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kernel /boot/vmlinuz-2.6.12.3 ro root=LABEL=/ rhgb quiet<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initrd /boot/initrd-2.6.12.3.img <BR><BR><BR>title Fedora Core (2.6.11-1.1369_FC4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root (hd0,7)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initrd /boot/initrd-2.6.11-1.1369_FC4.img<BR>title WinXP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootnoverify (hd0,0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chainloader +1<BR><BR><BR><BR><BR><BR><BR>然后重新启动机器，如果出现VFS错误，可能就是我写重要的那个地方出了错误；<BR><BR>注意：如果重新启用内核后，原来安装的显示卡驱动，比如 NVIDIA和ATI的驱动还要重新安装；<BR><BR>后记：<BR><BR>为写声卡及其其它硬件设备的安装教程做准备，重写此文档；并更正一些错误&nbsp; &nbsp;<BR><BR><img src ="http://www.cnitblog.com/ygb/aggbug/5539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2005-12-18 17:50 <a href="http://www.cnitblog.com/ygb/articles/5539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内核管理概述</title><link>http://www.cnitblog.com/ygb/articles/5538.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sun, 18 Dec 2005 09:49:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/5538.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/5538.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/5538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/5538.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/5538.html</trackback:ping><description><![CDATA[作者：北南南北<BR>来自：LinuxSir.Org<BR>摘要：本文讲述与内核操作有关的基础知识；比如编译内核，装载、移除内核模块，查看模块信息等；本文涉及相关的命令有modprobe、insmod、depmod、rmmod、modinfo等；<BR><BR><BR><BR>++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR>正文<BR>++++++++++++++++++++++++++++++++++++++++++++++++++++++<BR><BR><BR><BR>一、什么是内核；<BR><BR>http://svn.clkao.org/svnweb/linux/<BR>内核官方http://www.kernel.org<BR>内核洋文用 kernel，我刚才翻了一下词典，kernel 中文意思是内核、核心、中心、精髓的意思；也是果仁、果核的意思。从字面理解，kernel 是一事物的中心，植物的果实最重要的也是果仁和果核； 由此我们可以推断内核是操作系统的中心。<BR><BR>我们知道Linus Torvalds 开发了Linux ，其实他开发的就是内核，按内核官方主页的理解，这个内核就是Linux ；其它的扩展和应用都是围绕内核而展开的。所有Linux应用程序都会和内核发生直接或者间接的接触；比如硬件需要内核支持，网络的通信也需要内核支持；文件系统更需要内核支持... ...<BR><BR><BR>直言我的能力的不行，如果您想了解和学习解操作系统，我写的教程只是初级应用，理论性的东西不是一言两语能说的清楚的，更不是应用者能说的清楚的。<BR><BR><BR>二、为什么需要编译内核和管理内核<BR><BR><BR>硬件是需要内核支持才行，有些硬件的支持没有被编入内核，这也需要我们重编内核；内核的包含的不仅仅是设备的驱动，还有其它的内容，比如网络协议的支持，防火墙的支持... ... 比如iptables的实现，有些功能是需要内核支持的，如果内核与iptables相关的内容没有被编入， iptables 相关的功能就无法实现；<BR><BR><BR>三、内核编译方法<BR><BR><BR>请参考： <A class=singleposttitle id=viewpost1_TitleUrl HREF="/ygb/articles/5539.html"><FONT color=#223355>编译内核</FONT></A>；<BR><BR><BR><BR>四、管理内核模块的相关命令<BR><BR><BR><BR><BR>1、lsmod 列加以挂载的内核模块；<BR><BR><BR>lsmod 是列出目前系统中已加载的模块的名称及大小等；另外我们还可以查看 /proc/modules ，我们一样可以知道系统已经加载的模块；<BR>代码:<BR><BR>[root@localhost beinan]# lsmod<BR><BR><BR><BR>2、modinfo 查看模块信息；<BR><BR><BR>modinfo 可以查看模块的信息，通过查看模块信息来判定这个模块的用途；<BR><BR>代码:<BR><BR>[root@localhost beinan]# moinfo&nbsp; 模块名&nbsp; &nbsp;<BR><BR><BR><BR>举例：<BR><BR>代码:<BR><BR>[root@localhost beinan]# modinfo ne2k-pci<BR><BR>filename:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/ne2k-pci.ko<BR>author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Donald Becker / Paul Gortmaker<BR>description:&nbsp;&nbsp;&nbsp; PCI NE2000 clone driver<BR>license:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPL<BR>parmtype:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug:int<BR>parmtype:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options:array of int<BR>parmtype:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; full_duplex:array of int<BR>parm:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug:debug level (1-2)<BR>parm:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; options:Bit 5: full duplex<BR>parm:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; full_duplex:full duplex setting(s) (1)<BR>vermagic:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.6.11-1.1369_FC4 686 REGPARM 4KSTACKS gcc-4.0<BR>depends:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8390<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v000010ECd00008029sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00001050d00000940sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v000011F6d00001401sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00008E2Ed00003000sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00004A14d00005000sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00001106d00000926sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v000010BDd00000E34sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00001050d00005A5Asv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v000012C3d00000058sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v000012C3d00005598sv*sd*bc*sc*i*<BR>alias:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci:v00008C4Ad00001980sv*sd*bc*sc*i*<BR>srcversion:&nbsp;&nbsp;&nbsp;&nbsp; 6ACE95F441CD26DF9DC31C2<BR><BR><BR>上面的例子是我们查看 ne2k-pci 这个模块的信息，通过查看，我们知道ne2k-pci 模块是8029网卡（PCI NE2000 clone driver）的驱动；模块是位于 /lib/modules/2.6.11- 1.1369_FC4/kernel/drivers/net/ 中ne2k-pci.ko<BR><BR><BR>我们现在常用的网卡也有8139的，8139网卡所用的驱动是 8139too ；查查看？<BR><BR>代码:<BR><BR>[root@localhost beinan]# modinfo 8139too <BR><BR><BR><BR>我们再查查vfat 和ntfs 的模块信息；<BR><BR>代码:<BR><BR>[root@localhost beinan]# modinfo vfat<BR>[root@localhost beinan]# modinfo ntfs <BR><BR><BR><BR>自己尝试一下；<BR><BR>注意： 模块名是不能带有后缀的，我们通过modprobe -l 所看到的模块，都是带有.ko 或.o后缀；<BR><BR><BR>3、modprobe 挂载新模块以及新模块相依赖的模块<BR><BR><BR>modprobe 我们常用的功能就是挂载模块，在挂载某个内核模块的同时，这个模块所依赖的模块也被同时挂载；当然modprobe 也有列出内核所有模块，还有移除模块的功能；下在我们举个例子说一说咱们常用的功能和参数；<BR><BR>代码:<BR><BR>modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o &lt;modname&gt;] &lt;modname&gt; [parameters...]<BR>modprobe -r [-n] [-i] [-v] &lt;modulename&gt; ...<BR>modprobe -l -t &lt;dirname&gt; [ -a &lt;modulename&gt; ...]<BR><BR><BR><BR>上面是modprobe 的用法，具体更为详细的帮助，我们可以查看 man modprobe ；<BR><BR>代码:<BR><BR>[root@localhost beinan]# modprobe -c<BR><BR><BR><BR>modprobe -c 可以查看modules 的配置文件，比如模块的别名是什么等；<BR><BR>代码:<BR><BR>[root@localhost beinan]# modprobe -l<BR><BR><BR><BR>modprobe -l 是列出内核中所有的模块，包括已挂载和未挂载的；通过modprobe -l ，我们能查看到我们所需要的模块，然后根据我们的需要来挂载；其实modprobe -l 读取的模块列表就位于 /lib/modules/'uname -r' 目录中；其中uname -r 是内核的版本；<BR>代码:<BR><BR>[root@localhost beinan]# uname -r<BR>2.6.11-1.1369_FC4<BR>[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/<BR><BR><BR><BR>通过上面的命令，自己试试看？<BR><BR>代码:<BR><BR>[root@localhost beinan]# modprobe&nbsp;&nbsp; 模块名&nbsp;&nbsp; 注：挂载一个模块；<BR><BR><BR><BR>举例：<BR>代码:<BR><BR>[root@localhost beinan]# modprobe ne2k-pci&nbsp; 注：挂载 ne2k-pci 模块；<BR>[root@localhost beinan]# modprobe vfat&nbsp; 注：挂载vfat 模块<BR>[root@localhost beinan]# modprobe ntfs&nbsp;&nbsp; 注：挂载ntfs 模块<BR>[root@localhost beinan]# lsmod&nbsp;&nbsp;&nbsp; 注：列出已挂载模块， 我们会看到ne2k-pci ，vfat ，ntfs的模块 ；<BR><BR><BR><BR>注意： 模块名是不能带有后缀的，我们通过modprobe -l 所看到的模块，都是带有.ko 或.o后缀；<BR><BR><BR>代码:<BR><BR>[root@localhost beinan]# modprobe -r&nbsp; 模块名&nbsp;&nbsp; 注：移除已加载的模块，和rmmod 功能相同；<BR><BR><BR><BR>注意：模块名是不能带有后缀的，我们通过modprobe -l 所看到的模块，都是带有.ko 或.o后缀；<BR><BR>代码:<BR><BR>[root@localhost beinan]# modprobe -r&nbsp; 模块名 <BR><BR><BR><BR>举例：<BR>代码:<BR><BR>[root@localhost beinan]# modprobe&nbsp; -r ne2k-pci<BR><BR><BR><BR>就说这么多吧，更为详细的还是用 man modprobe 来查看和尝试；<BR><BR><BR>4、rmmod 移除已挂载模块；<BR><BR><BR>命令格式：<BR>代码:<BR><BR>rmmod&nbsp; 模块名<BR><BR><BR><BR>注意： 模块名是不能带有后缀的，我们通过modprobe -l 所看到的模块，都是带有.ko 或.o后缀；<BR><BR>举例：<BR><BR>代码:<BR><BR>[root@localhost beinan]# rmmod&nbsp; vfat&nbsp; 注：移除已挂载的模块vfat <BR><BR><BR><BR><BR><BR>5、depmod 创建模块依赖关系的列表<BR><BR><BR>这个模块管理工具是创建模块依赖关系的列表，有几个参数我们注意一下就行了，目前的的Linux 发行版所用的内核是2.6x版本，是自动解决依赖关系，所以这个命令知道就行了；模块之前也有依赖关系，比如我们想驱动USB 移动硬盘，目前有两种驱动，一种是udev ，在内核中有，但目前不太稳定；另一种办法是用usb-storage驱动，而usb-storage 依赖的模块是scsi 模块，所以我们要用usb-storage 的模块，也得把 scsi 编译安装；<BR><BR>再举个例子：sata的硬盘，在Linux中的设备表示的是/dev/sd* ，比如 /dev/sda，/dev/sdb 等... 系统要驱动&nbsp; sata硬盘，则需要把sata在内核中选中，或编译成模块，或内置于内核之中，在此同时，还需要在内核中选中ide ，scsi 的支持等；<BR>depmod 工具的洋文原意：depmod — program to generate modules.dep and map files.（我译的：为modules.dep 文件或映射文件创建依赖关系）<BR><BR>代码:<BR><BR>[root@localhost beinan]# depmod&nbsp; -a&nbsp;&nbsp;&nbsp; 注：为所有列在/etc/modprobe.conf 或/etc/modules.conf&nbsp; 中的所有模块创建依赖关系，并且写入到modules.dep文件；<BR>[root@localhost beinan]# depmod -e&nbsp;&nbsp;&nbsp;&nbsp; 注：列出已挂载但不可用的模块；<BR>[root@localhost beinan]# depmod&nbsp; -n&nbsp;&nbsp;&nbsp; 注：列出所有模块的依赖关系，但仅仅是输出出来 （Write the dependency file on stdout only）<BR><BR><BR><BR>注：modules.dep 位于 /lib/modules/内核版本 目录<BR><BR>比如 Fedora Core 4.0 中，系统默认的内核：<BR>代码:<BR><BR>[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/modules.dep<BR>/lib/modules/2.6.11-1.1369_FC4/modules.dep<BR><BR><BR><BR><BR>6、insmod 挂载模块；<BR><BR><BR>insmod 这个工具，和modprobe 有点类似，但功能上没有modprobe 强，modprobe 在挂载模块是不用指定模块文件的路径，也不用带文件的后缀.o 或.ko ；而insmod 需要的是模块的所在目录的绝对路径，并且一定要带有模块文件名后缀的(modulefile.o 或 modulesfile.ko ）；<BR><BR>对于这个工具，我们只是介绍一下， 并不推荐使用。因为模块有依赖关系，对于新手来说，可能不知道这个模块依赖和哪个模块依赖；<BR><BR>举例：<BR><BR>代码:<BR><BR>[root@localhost beinan]# insmod /lib/modules/2.6.11-1.1369_FC4/kernel/drivers/net/tg3.ko<BR><BR><BR><BR>我们要到 /lib/modules/内核版本 uname -r 的命令输出/kernel/drivers 中找相对应的模块才行，要有绝对路径，而且必须要用到文件名的全称，不能把文件名的后缀省略；<BR><BR><BR><BR>五、与内核模块加载相关的配置文件；<BR><BR><BR><BR>1、模块的配置文件 modules.conf 或 modprobe.conf<BR><BR><BR>内核模块的开机自动挂载模块一般是位于一个配置文件，一般的Linux发行版本都有 /etc/modules.conf 或&nbsp; /etc/modprobe.conf 。比如Fedora Core 4.0 内核模块开机自动加载文件是&nbsp; /etc/modprobe.conf ；在这个文件中，一般是写入模块的加载命令或模块的别名的定义等；比如我们在modules.conf 中可能会发行类似的一行 ；<BR>代码:<BR><BR>alias eth0 8139too <BR><BR><BR>而8029的网卡应该是<BR>代码:<BR><BR>alias eth0 ne2k-pci <BR><BR><BR><BR>这样系统启动的时候，首先会modprobe 8139too ，然后再为8139too 指定别名为 eth0，然后我们在登录的时候，用 ifconfig 就会查看到网卡的IP 等情况，当然您得为网卡设置IP 才行；<BR><BR>一般的情况下，modproe.conf 或modules.conf的内容是我们用相应的硬件配置工具而生成的；如果您的硬件驱动是没有被内核支持，您自己到硬件的厂商下载而来的驱动。一般的情况下都有安装和帮助文件。他们的驱动在配置时，他会写入硬件的支持到modules.conf 或 modprobe.conf 文件中。<BR><BR>再比如我们的声卡在modules.conf 或modprobe.conf 中也有相应的内容，这是由alsaconf 配置工具生成的，明白了吧；同理网卡在modprobe.conf 或modules.conf中的内容也是由网卡的配置工具而来的。<BR><BR>有些硬件是以内核模块的方式驱动的，模块一旦加载上就能用，也没有什么配置工具，比如vfat 和ntfs 的支持；如果是硬件驱动不以模块的方式支持，而是直接编入内核，也不会用在modprobe.conf 或 modules.conf 中加入什么内容；<BR><BR>如果您有些模块不能开机加载，您想让一些模块加机自动加载，就可以把modprobe 模块 直接写入配置文件；<BR><BR><BR>2、内核模块其它配置文件<BR><BR><BR>内核模块的其它配置文件还是需要了解的，比如 /lib/modules/内核版本目录下的几个文件；了解一下就行；比如：<BR><BR>代码:<BR><BR>[root@localhost beinan]# uname -r<BR>2.6.11-1.1369_FC4<BR>[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/<BR>build&nbsp;&nbsp; misc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modules.ccwmap&nbsp; modules.ieee1394map&nbsp; modules.isapnpmap&nbsp; modules.symbols&nbsp; source<BR>kernel&nbsp; modules.alias&nbsp; modules.dep&nbsp;&nbsp;&nbsp;&nbsp; modules.inputmap&nbsp;&nbsp;&nbsp;&nbsp; modules.pcimap&nbsp;&nbsp;&nbsp;&nbsp; modules.usbmap<BR><BR><BR><BR><BR><BR><BR>六、硬件驱动在系统中的目录；<BR><BR><BR><BR>硬件驱动在内核中以模块支持的目录；<BR><BR><BR>硬件驱动是必须由内核支持的，无论是我们自己安装驱动，还是内核自带的驱动都是如此。硬件驱动如果是以内核模块支持的，驱动目录位于：&nbsp; /lib/modules/内核版本/kernel/目录 或 /lib/modules/内核版本/kernel/drivers 目录中；<BR><BR>代码:<BR><BR>[root@localhost beinan]# uname -r<BR>2.6.11-1.1369_FC4<BR>[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/kernel<BR>arch&nbsp; crypto&nbsp; drivers&nbsp; fs&nbsp; lib&nbsp; net&nbsp; sound<BR><BR><BR><BR>注：只有驱动在内核中以模块的方法支持，驱动才位于 /lib/modules/相应的目录；如果是直接置入内核的，不会出现在/lib/modules驱动相关的目录；<BR><BR><BR><BR>七、自己编译驱动的办法；<BR><BR>通过源码编译驱动一般是./configure ;make;make install ，有时程序不提供./configure ，我们可以make或 make install ，或者执行make;make install ；如果不能make install ，则需要我们自己复制.o或者.ko文件到 /lib/modules/内核版本/kernel/目录 或 /lib/modules/内核版本/kernel/drivers 目录中相应的驱动目录；<BR><BR>这个还是自己尝试吧，说也说不清楚，遇到问题后就知道怎么弄了；具体的还是驱动的REAME和INSTALL为准；<BR><BR><BR>现在大多驱动都是在编译安装时，都自动复制.o或.ko 文件到内核模块目录，大多不用我们自己动手复制过去。如果您尝试编译安装声卡驱动 alsa-drivers 就会明白我所说的意思；<BR><BR><BR><BR>后记：<BR><BR><BR>内核编译对新手来说是有点困难，我写过类似的文档也有好多篇，但是不是新手弟兄从中能学到点什么，我不太知道；毕竟我写的文档在内核文件告诉一些基本的流程和注意的事项；内核的配置只有多实践才能学会，在配置内核时，要多看看帮助；<BR><BR>内核模块管理方面我在本文中已经写了一些，大体上就这些，如果想要知道更为详细的，只能是自己看man 和--help了，我写文档也无非是查看这些东西，然后实践再写给大家；我能写出来，我想您的能力并不一定比我差，应该超出我才对；<img src ="http://www.cnitblog.com/ygb/aggbug/5538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2005-12-18 17:49 <a href="http://www.cnitblog.com/ygb/articles/5538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>