全部博文(534)
分类: LINUX
2007-09-28 17:14:47
4、单个模块的编译
下面以 ntfs 为例进行说明
a)直接生成模块文件
CODE:
[root@mail linux-
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/
[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
-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-
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:
# 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:
root 19761 19536 0 23:
root 20478 19761 0 23:
root 20503 20478 0 23:
root 32099 27815 0 23:
[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-
+ 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 '
-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-
/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 来安装或者升级内核,不需要重新编译和安装模块了。