LinuxSir.cn,穿越时空的Linuxsir!

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

如何使insmod起作用?

[复制链接]
发表于 2002-8-28 11:19:35 | 显示全部楼层 |阅读模式
有关我的USB硬盘问题,我使用lsmod,sd_mod 的状态是处于unused中,这可能就是我的硬盘一直没有找到的原因吧。
如何使sd_mod回复到used状态中?
发表于 2002-8-29 11:13:00 | 显示全部楼层

Modules的概念及使用

本文中主要讨论是内核的模块安装与卸载
--------------------------------------------------------------------------------
By Wing, 出处:Linuxaid


一、什么是 modules?

  modules 的字面意思就是模块,在此指的是 kernel modules;简单来说,一个模块提供了一个功能,如 isofs、minix、nfs、lp 等等。传统来讲,模块化有两个方法解决:设计者可以把各项功能分离到单独的叫做线程的处理中去,或者是将内核以包含/排除一些功能的方式重新编译。如果把功能分离到线程中去,那么内核就叫做“微内核”(micro-kernel),这种解决方法增加了线程间协调工作的通信开销。就象名字暗示的那样,这种解决方案的优点在于内核的大小。

  Linux的解决方案是包含内核模块,这些模块是可以按需要随时装入和卸下的。这样做可以使得内核的大小和通信量都达到最小。将模块从内核中独立出来,不必预先『绑』在 kernel codes 中。这样做有三种优点: 第一, 将来修改 kernel 时,不必全部重新compile,可节省不少时间;第二, 若需要安装新的 modules ,不必重新 compile kernel,只要插入 (通过insmode指令) 对应的 modules 即可;第三,减少内核对系统资源的占用,内核可以集中精力做最基本的事情,把一些扩展功能都交由modules实现。

  模块也可以用来尝试新的内核代码而不需要每次都创建和重激活内核。但是,这样做带来的问题是:使用内核模块通常会轻微的增加性能和内存开支。一个可加载模块肯定会产生更多的代码,这种代码和额外的数据结构会占用更多一点的内存。另外因为间接访问内核资源也让模块的效率轻微降低。

  模块化的思想已经被广泛接受,主要的原因在于它可以扩展系统的功能,用户可以灵活的配置系统。Apache也采取了这种功能扩展方式,在本文中主要讨论是内核的模块安装与卸载,Apache模块的安装请参照Apapce的相关文档。

二、如何加载模块?

  加载内核模块的方法有两种。第一种使用insmod命令手工把它插入到内核。另一个更智能的方法是在需要的时候加载这个模块︰这叫做按需加载(demand loading)。当内核发现需要一个模块的时候,例如当用户安装一个不在内核的文件系统的时候,内核会请求内核守护进程(kerneld)试图加载合适的模块。说到这里就不能不提到内核守护进程kerneld了,它非常的聪明,能够主动的把您需要的modules 自动插入 kernel,将没用到的 module 从kernel中清退。Kerneld由两个独立的部分构成:一部分工作于Linux的内核,负责向daemon发送请求;另一部分工作于系统的用户数据区,负责调入由内核请求指定的modules。若少了这个kerneld,就只能通过手工的方式,用insmode或modeprobe命令进行加载。

三、modules的相关命令介绍

  与modules有关的命令有:


  lsmode :列出已经被内核调入的模块
  insmode:将某个module插入到内核中
  rmmod:将某个module从内核中卸载
  depmod: 生成依赖文件,告诉将来的 insmod 要从哪儿调入 modules。这个依赖文件就在/lib/modules/[您的kernel版本]/modules.dep。
  Kerneld:负责自动的将模块调入内核和把模块从内核中卸载。



四、编译一个最小的Linux内核

  模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。

  当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或web服务器,那么网络功能是时刻都需要的,你就应该考虑把网络功能编译到内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。

  按照以上的原则,我们首先列出一张清单,看看 kernel 中哪些选项是非有不可的,也就是说,这些东西是必须被编译到内核中的。将那些非必需的模块剔除到内核以外。

  第一个是root所在的硬盘配置。哪果您的硬盘是IDE接口,就把 ide 的选项标记下来。如果是SCSI接口,请把您的接口参数及 SCSI id 记标下来。

  第二个是选择使用哪一个文件系统。Linux的默认文件系统是是 ext2 ,那么就一定要把它标记下来。如果机器中还其它的操作系统,如win98或windows NT,您还会可能选择FAT32或NTFS的支持,不过后面你可以通过手工加载的方式来加入新的模块支持。

  第三个是选择Linux所支持的可执行文件格式。这里有两种格式可供选择:

  elf:这是当前Linux普遍支持的可执行文件格式,必须编译到内核中 。

  a.out: 这是旧版的Linux的可执行文件各函数库的格式,如果你确认肯定用不到这种格式的可执行文件,那么就可以不把它编译到内核当中。

  以上这些内容,是必须要编译到内核中的。其它的内容凡是所有选项中m提示的,都选择m,这样可以通过手工的方式添加该模块。


** Loadable module support*Enable loadable module support (CONFIG_MODULES) [Y/n/?]Set version
information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?]Kernel daemon support (e.g.
autoload of modules) (CONFIG_KERNELD) [Y/n/?]



  分别回答 Y,N,Y 。其中 CONFIG_KERNELD 的 default 值是 N, 所以要注意选择Y。
发表于 2002-8-29 11:20:23 | 显示全部楼层
什么是 modules﹖ 什么又是 kerneld﹖
发件人: Hanky@FruitTea1

什么是 modules﹖

    这是一个很重要的功能了, modules 意思就是模块嘛,在此指的是
kernel modules;简单来说,一个 kernel module 就提供了一个功能,
如 isofs、minix、nfs、lp 等等,如此一来就可以把它们独立出来,不
必预先『绑』在 kernel codes 中。这样子的话我们可以有两大享受!

第一: 将来修改 kernel 时,不必全部重新 compile,可节省不少时间。
第二: 若有新的 modules 需要用到,不必重新 compile kernel,只要
      插入 (这是一个指令,我们等一下再介绍) 对应的 modules 即可。


什么是 kerneld﹖

    kerneld 是一个 daemon,很聪明的 daemon,它主动把您需要的
modules 自动插入 kernel,没用到的 module 拔出 kernel,省去您的麻
烦。若少了这个 kerneld,您只好在 /etc/rc.d/ 下加一个 rc.modules
了 (把开机后要用的 modules 加入这个 shell script 中也算是自动加
入,但比较麻烦不是吗﹖)。


如何使用 Modules ﹖

   Step 1: 准备工作

      去抓 modules-1.3.57.tar.gz, 这是 modules 一定要用到的系统程序。
      另有 beta 版的 modules-1.3.69f.tar.gz。

      注意您的 kernel 版本,千万不要低于您抓回来的 module-util 版本。
      但反过来则否 (不要差太多就好了)。

      把抓回来的 modules-x.x.xx.tar.gz 解至您呷意的位置去,然后把它
      们 make 出来。在此呼吁大家在这个步骤若遇到问题请自己解决,也可
      借机增加功力。

      make 完后,应该有一堆系统程序: modprobe、depmod (这是一个
      symbolic link 至 modprobe)、genksyms、makecrc32、insmod、
      rmmod(symbolic link to insmod)、lsmod(a shell script in 1.3.69f)
      、ksyms(symbolic link to insmod)、以及 kerneld。

      其中以 insmod、rmmod(=insmod)、lsmod、 depmod(=modprobe)、
      kerneld 最重要:

       lsmod
              把现在 kernel 中插入的 modules 列出来
       insmod
              把某个 module 插入 kernel 中
       rmmod
              把某个没在用的 module 拔出 kernel
       depmod
              制造 module dependency file,以告诉将来的 insmod 要去
              哪儿抓 modules 来插。  这个 dependency file 就在

                    /lib/modules/[您的kernel版本]/modules.dep

       kerneld
              一个 daemon,可负责自动呼叫 insmod 插入 module,是一个
              很方便的 daemon。它也同时查看,若某 module 插入后但很久
              没人在用了,就会把它 拔出来,以省内存。

      如果 make 没什么问题了,请 make install。 如此一来就完成第一个
      准备工作了。

      把 depmod、kerneld 加入您的 /etc/rc.d/rc.S (SysVinit2.6 是
      在 /etc/init.d/boot 里)

            kerneld: 请加在很开头的位置:

                (请回头看我在 SysV init 2.6 中的 init.d/boot 范例)

            depmod 及 modprobe: 请加在 "remount /" 之后,很开头的位置,
                 或是独立一个 modules scripts 出来:


===========[/etc/init.d/modules 例]===================================
# Create a generic link to the modules for the current kernel
#
# You can have generic symbolic links in /lib/modules/boot
# if you create links to: "../current/subsystem/module.o"
#
rm -f /lib/modules/current
ln -s /lib/modules/`uname -r` /lib/modules/current
if [ -r /lib/modules/current/modules.dep ]
then
  echo "Module dependencies file exists, refresh it."
else
  echo "No current module dependencies? creating it."
fi
/sbin/depmod -a
/sbin/modprobe -a -t boot \*

==========[# end of /etc/init.d/modules]==============================


      有一件很重要的事是,如果您的 /usr 是在另一个 file system 上,
      之后才 mount 进来的话,请先在 depmod 之前 mount 进来,因为
      modules-1.3.57 要用到 /usr/bin/nm 这个系统程序。 但
      modules-1.3.69f 因为它内建了 nm 的功能,所以可以不用管我刚才
      说的......。


   Step 2: 计画

      首先,请先列出一张清单,看看您的 kernel 有哪些选项是非有不可的;
      也就是说,这些东西是不可以 compile 成为 module 的。

    * root system 所在:

          * 使用哪一种硬盘界面﹖
                * IDE 的话,就把 ide 的选项记下来。
                * SCSI 的话,请把您的界面 low level driver 及 SCSI Disk
                  记下来。

          * 使用哪一种 file system﹖
                * 我看多半都是 ext2 吧﹖那么把它记下来。

    * 您的 kernel binary 格式﹖
          * elf﹖那么 ELF support 不可以 compile 成 module 。
          * a.out﹖那么 AOUT support 不可以 compile 成 module。

      大概就这些吧,是不可以 compile 成 module 的。而原本没有提供 M 的
      kernel config 选项者,要用到的话当然只能乖乖地回答 Y 啰!


   Step 3: 新的 kernel 及 modules 来了

      好了,那就开始重新 make config 啰,请您在前三个选项:

=======[make config 例]==================================================
*
* Loadable module support
*
Enable loadable module support (CONFIG_MODULES) [Y/n/?]
Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?]
Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [N/y/?]
=======[例毕]============================================================

      分别回答 Y,N,Y 的值就对了。其中 CONFIG_KERNELD 的 default 值是 N,
      所以要注意一下。

      其它的 kernel config 如果遇到现在不能 compile 成 Module 的 (依您
      自己上面所记录的,这是因人而异),请 (也只能) 回答 Y;其它的请回答:

            M: 若有提供这个选项。
            Y: 没有提供 M 选项,但又必须使用的话。
            N: 根本就用不到这个功能的话。

      make config 完后,仍旧是 make dep; make clean

      再来就有点不太一样;在 make zlilo 或 make zImage 之后,是产生出
      没有 module 的 kernel image,所以之后要再 make modules ;
      make modules_install 才对。

      最后一道手续是 depmod -a [您 compile 出来的 kernel 版本]
      例如:
            depmod -a 1.99.7

      reboot,如果没什么问题的话,就应该是 OK 了。

      使用了 modules 后可能会不太习惯一些事情,久了就熟悉这个东西了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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