Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3519588
  • 博文数量: 534
  • 博客积分: 11595
  • 博客等级: 上将
  • 技术积分: 5785
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-22 17:00
文章分类

全部博文(534)

文章存档

2015年(4)

2014年(27)

2013年(15)

2012年(38)

2011年(36)

2010年(85)

2009年(63)

2008年(142)

2007年(124)

分类: LINUX

2007-09-28 17:14:47

4、单个模块的编译

下面以 ntfs 为例进行说明

        a
直接生成模块文件

CODE:

[root@mail linux-2.6.20.1]# make M='fs/ntfs'
  LD      fs/ntfs/built-in.o
  CC [M]  fs/ntfs/aops.o
  CC [M]  fs/ntfs/attrib.o
  CC [M]  fs/ntfs/collate.o
  CC [M]  fs/ntfs/compress.o
  CC [M]  fs/ntfs/debug.o
  CC [M]  fs/ntfs/dir.o
  CC [M]  fs/ntfs/file.o
  CC [M]  fs/ntfs/index.o
  CC [M]  fs/ntfs/inode.o
  CC [M]  fs/ntfs/mft.o
  CC [M]  fs/ntfs/mst.o
  CC [M]  fs/ntfs/namei.o
  CC [M]  fs/ntfs/runlist.o
  CC [M]  fs/ntfs/super.o
  CC [M]  fs/ntfs/sysctl.o
  CC [M]  fs/ntfs/unistr.o
  CC [M]  fs/ntfs/upcase.o
  CC [M]  fs/ntfs/bitmap.o
  CC [M]  fs/ntfs/lcnalloc.o
  CC [M]  fs/ntfs/logfile.o
  CC [M]  fs/ntfs/quota.o
  CC [M]  fs/ntfs/usnjrnl.o
  LD [M]  fs/ntfs/ntfs.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      fs/ntfs/ntfs.mod.o
  LD [M]  fs/ntfs/ntfs.ko               
[root@mail linux-2.6.20.1]#


上面最后显示的 fs/ntfs/ntfs.ko 就是我们想要的。

        b
手工拷贝带模块文件到

CODE:

[root@mail fs]# pwd
/lib/modules/2.6.20.1/kernel/fs
[root@mail fs]# mkdir ntfs
[root@mail fs]#
[root@mail fs]# cd ntfs
[root@mail ntfs]# ll
total 0
[root@mail ntfs]# cp -a /usr/src/linux-2.6.20.1/fs/ntfs/ntfs.ko .
[root@mail ntfs]#                        


c
执行 depmod -a 生成新的 modules.dep 文件

CODE:

[root@mail ntfs]# depmod -a
[root@mail ntfs]#
[root@mail 2.6.20.1]# ll modules.dep
-rw-r--r--  1 root root 92323 Sep 27 01:00 modules.dep               
[root@mail 2.6.20.1]#


d
尝试手工加载

CODE:

手工尝试加载
[root@mail ntfs]# modprobe ntfs
[root@mail ntfs]#
[root@mail ntfs]# lsmod |grep ntfs
ntfs                  206740  0
[root@mail ntfs]#


可以看到 ntfs 模块已经加载成功了 !!!


5 如何获取当前内核的配置(.config 文件)

2.4 的时候,我经常碰到一个问题就是不小心把 .config 文件弄丢了,除非事先有备份,否则只能 make menuconfig 一个个重新选。

但在 2.6 就不同了,在 Gerneal Setup 部分有一个功能叫做 "Kernel .config support" ,意思如下





一旦你选中它,还有另外一个功能出现,就是 "Enabel access to .config through /proc/config.gz“



建议把这个选上。有了这个,上面的问题就迎刃而解了,方法有二

        a
通过 scripts/extract_ikconfig 脚本从一个 bzImage 文件中提出出来。不过目前试了很多次,总是报下面的错误

CODE:

        [root@mail scripts]# ./extract-ikconfig  /boot/vmlinuz-2.6.20.1  
        cc: ./scripts/binoffset.c: No such file or directory
        cc: no input files
        [root@mail scripts]#
       


b
通过 /proc/config.gz 文件获取,这是最方便的方法之一。步骤如下

CODE:

        [root@mail proc]# ll /proc/config.gz
        -r--r--r--  1 root root 15192 Sep 27 01:12 /proc/config.gz
        [root@mail proc]# file /proc/config.gz
        /proc/config.gz: gzip compressed data, from Unix, max compression
        [root@mail proc]#
        [root@mail proc]# cat /proc/config.gz |gzip -d > /tmp/config
        [root@mail proc]# ll /tmp/config
        -rw-r--r--  1 root root 58949 Sep 27 01:13 /tmp/config
        [root@mail proc]#
        [root@mail proc]# cd /tmp
        [root@mail tmp]# more config
        #
        # Automatically generated make config: don't edit
        # Linux kernel version: 2.6.20.1
        # Thu Sep 27 00:07:58 2007
        #
        CONFIG_X86_32=y
        CONFIG_GENERIC_TIME=y
        CONFIG_LOCKDEP_SUPPORT=y
        CONFIG_STACKTRACE_SUPPORT=y
        CONFIG_SEMAPHORE_SLEEPERS=y
        CONFIG_X86=y
        CONFIG_MMU=y
        CONFIG_GENERIC_ISA_DMA=y
        CONFIG_GENERIC_IOMAP=y
(省略)
       


这样是不是很方便呢 ^_^ !

6、生成 rpm


首先它会调用 make spec /usr/src/redhat/SPECS/ 下生成一个 kernel.spec 文件

然后在 rpmbuild -ba spec 文件

CODE:

[root@mail SPECS]# ps -ef |grep rpm
root     19536 19501  0 23:06 pts/0    00:00:00 make rpm
root     19761 19536  0 23:06 pts/0    00:00:00 make -f scripts/Makefile.build obj=/usr/src/kernels/linux-2.6.20.16/scripts/package rpm
root     20478 19761  0 23:08 pts/0    00:00:00 rpmbuild --target i386 -ta ../kernel-2.6.20.16.tar.gz
root     20503 20478  0 23:08 pts/0    00:00:00 /bin/sh -e /var/tmp/rpm-tmp.64176
root     32099 27815  0 23:16 pts/1    00:00:00 grep rpm
[root@mail SPECS]#


这个过程很久,和整个编译流程差不多久

当你看到类似下面的输出

QUOTE:

  INSTALL sound/synth/snd-util-mem.ko
  INSTALL sound/usb/snd-usb-audio.ko
  INSTALL sound/usb/snd-usb-lib.ko
  INSTALL sound/usb/usx2y/snd-usb-usx2y.ko
if [ -r System.map -a -x /sbin/depmod ]; then /sbin/depmod -ae -F System.map -b /var/tmp/kernel-2.6.20.16-root -r 2.6.20.16; fi
+ cp arch/i386/boot/bzImage /var/tmp/kernel-2.6.20.16-root/boot/vmlinuz-2.6.20.16
+ cp System.map /var/tmp/kernel-2.6.20.16-root/boot/System.map-2.6.20.16
+ cp .config /var/tmp/kernel-2.6.20.16-root/boot/config-2.6.20.16
+ /usr/lib/rpm/brp-compress
Processing files: kernel-2.6.20.16-4
Provides: kernel-2.6.20.16 kernel-drm
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/kernel-2.6.20.16-root

Wrote: /usr/src/redhat/SRPMS/kernel-2.6.20.16-4.src.rpm               
Wrote: /usr/src/redhat/RPMS/i386/kernel-2.6.20.16-4.i386.rpm        
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.30844
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd kernel-2.6.20.16
+ exit 0
rm ../kernel-2.6.20.16.tar.gz
[root@mail linux-2.6.20.16]#


下面查看生成的 rpm

CODE:

[root@mail SRPMS]# ll |grep '2.6.20' --color
-rw-r--r--  1 root root 57218857 Sep 27 23:39 kernel-2.6.20.16-4.src.rpm
[root@mail SRPMS]#
[root@mail redhat]# cd RPMS
[root@mail RPMS]# cd i386/
[root@mail i386]# ll
total 72160
-rw-r--r--  1 root root 73808854 Sep 27 23:43 kernel-2.6.20.16-4.i386.rpm
[root@mail i386]#


下面是 binary rpm 包的内容

CODE:

[root@mail i386]# rpm -qlp kernel-2.6.20.16-4.i386.rpm |more
/boot/System.map-2.6.20.16
/boot/config-2.6.20.16
/boot/vmlinuz-2.6.20.16
/lib/modules
/lib/modules/2.6.20.16
/lib/modules/2.6.20.16/build
/lib/modules/2.6.20.16/kernel
/lib/modules/2.6.20.16/kernel/arch
/lib/modules/2.6.20.16/kernel/arch/i386
/lib/modules/2.6.20.16/kernel/arch/i386/crypto
/lib/modules/2.6.20.16/kernel/arch/i386/crypto/aes-i586.ko
(省略)


日后你可以使用该 rpm 来安装或者升级内核,不需要重新编译和安装模块了。

阅读(2403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~