最近玩起skype了. 说到skype, 我就被折腾得.... 呃!!!
搞alsa就扯到一堆与声音, 音乐相关的术语. 现在还没有搞清楚
不过最后使用了一个旧版本的skype才完成了语音通话
在保持通话连接的情况下有时需要来一段music, 想到了软件关掉microphone:
#!/bin/bash
# shutdown microphone, otherwise no un-pause music
amixer -c 0 set Capture nocap && mocp -U
当对方有话来时, 停掉music, 打开microphone:
#!/bin/bash
# an error will raise if mocp server no running, but this is no-importance
# example: You can stop microphone but no play music if mocp server no running
mocp -P
amixer -c 0 set Capture cap
把上面的两段代码绑定到两个hotkey上, 结果.... 就像DJ 一样, 想说话就说话, 想来music也行. 哈
Wednesday, October 7, 2009
Monday, October 5, 2009
动态链接库
多人使用的发行版本就是方便. 下个bin就可以使用. 比如chromium有deb包的.
今天懒了, 想下载个bin版本的mysql-gui-tools用. 结果给我报了个Error:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ./mysql-administrator-bin
./mysql-administrator-bin: error while loading shared libraries: libpcre.so.3: cannot open shared object file: No such file or directory
这其实就是dynamic share library的问题. 因为下载的binary文件中包括了需要使用的动态链接库的绝对路径. 三个问题:
1. 我的gentoo的动态链接库放在哪里呢?
2. 我的gentoo有没有安装这个library呢?
3. 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?
还有一个是不希望出现的问题: 动态链接库的版本问题. 出这个问题还不如干脆自己emerge一个.
对于第一个问题: 哪里放library文件的呢?
linux下没有强制, 只有约定! 一般放在下面的文件夹中:
1. /lib
2. /usr/lib
3. /usr/local/lib
随便看到两个比较有意思的文夹:
1. /usr/local/libexec
2. /usr/libexec
* 文档是这样描述这两个文件夹的用法的: Note that if your library calls programs that can only be called via
libraries, you should place those programs in /usr/local/libexec
这两个文件夹下的文件说白了就是可运行的程序! 只不是我们说常用的CLI. 而是只为了给API调用的程序
第二个问题: 我的gentoo有没有安装这个library呢?
在上面的基础上:
jessinio@niolaptop ~$ find /lib/ /usr/lib /usr/local/lib -name "*pcre*"
可以轻松出来:
/lib/libpcre.so.0
/lib/libpcre.so.0.0.1
可知道没有名叫: libpcre.so.3 的文件, 应该为找到的/lib/libpcre.so.0创建一个link文件(这其实是so文件的命名方式). 问题是这个link文件应该放在哪里才会被运行的程序使用呢? 这就来了第三个问题: 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ldd mysql-administrator-bin |grep pcre
libpcre.so.3 => /lib/libpcre.so.3 (0xb7261000)
这就被强大的ldd命令挖出来了, 创建一个link文件:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ sudo ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.3
这就解决了下载的binrary文件在gentoo下的运行问题. 当然, 不是万能的! 要根据实际问题找解决方法. gentoo下有时间还是emerge(至少make)一个binrary!
于关dynamic share library的文档: http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html
今天懒了, 想下载个bin版本的mysql-gui-tools用. 结果给我报了个Error:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ./mysql-administrator-bin
./mysql-administrator-bin: error while loading shared libraries: libpcre.so.3: cannot open shared object file: No such file or directory
这其实就是dynamic share library的问题. 因为下载的binary文件中包括了需要使用的动态链接库的绝对路径. 三个问题:
1. 我的gentoo的动态链接库放在哪里呢?
2. 我的gentoo有没有安装这个library呢?
3. 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?
还有一个是不希望出现的问题: 动态链接库的版本问题. 出这个问题还不如干脆自己emerge一个.
对于第一个问题: 哪里放library文件的呢?
linux下没有强制, 只有约定! 一般放在下面的文件夹中:
1. /lib
2. /usr/lib
3. /usr/local/lib
随便看到两个比较有意思的文夹:
1. /usr/local/libexec
2. /usr/libexec
* 文档是这样描述这两个文件夹的用法的: Note that if your library calls programs that can only be called via
libraries, you should place those programs in /usr/local/libexec
这两个文件夹下的文件说白了就是可运行的程序! 只不是我们说常用的CLI. 而是只为了给API调用的程序
第二个问题: 我的gentoo有没有安装这个library呢?
在上面的基础上:
jessinio@niolaptop ~$ find /lib/ /usr/lib /usr/local/lib -name "*pcre*"
可以轻松出来:
/lib/libpcre.so.0
/lib/libpcre.so.0.0.1
可知道没有名叫: libpcre.so.3 的文件, 应该为找到的/lib/libpcre.so.0创建一个link文件(这其实是so文件的命名方式). 问题是这个link文件应该放在哪里才会被运行的程序使用呢? 这就来了第三个问题: 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ldd mysql-administrator-bin |grep pcre
libpcre.so.3 => /lib/libpcre.so.3 (0xb7261000)
这就被强大的ldd命令挖出来了, 创建一个link文件:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ sudo ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.3
这就解决了下载的binrary文件在gentoo下的运行问题. 当然, 不是万能的! 要根据实际问题找解决方法. gentoo下有时间还是emerge(至少make)一个binrary!
于关dynamic share library的文档: http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html
Saturday, September 26, 2009
What Should Be Compiled as a Module?
前几天了解了一点关于module被kernel使用的两种方法:
1. built-in module
2. modular module
被编译入内核其实在速度上没有占有多大的优势, 相反, 列出了一堆使用模块module的好处. 那实际解决了一个极端的想法:
* 一切都被编译入kernel. ( 90%的人应该会想到速度上升的感觉. 其实这是幻觉 )
但是, 又会出现另一极端的想法:
* 一切都是modular module
又会是基于什么幻觉呢?
1. 基于方便使用?
这是不可能的. modular module还要被担心是不是被load到kernel中. 这增加了管理的需求.
built-in module在这方面更方便! 一切都在内核中了. 连modprobe和脚本都不用理会.
2. 基于省内存?
这篇文章: http://www.linuxjournal.com/article/1279 中的一节: What Should Be Compiled as a Module? 指出了多一个module会多浪费一点内存的. 这种浪费与多一个文件多一点浪费是一样道理的.
其实, 这种浪费会给人斤斤计较的感觉. 这个kernel会有成千上万个module? .和built-in module在速度上的上升一样是斤斤计较
所以, 两个极端的想都是不行的. 应该: 常用的被编译入kernel, 这样可以省去管理. 其它的都是modular module, 可以重编译module和省内存
这就存在一个如何区分哪些module是常用与不常的问题?
呃.... 我还不会. 我也不想斤斤计较.
上面引用的文章其实很旧了. 因为kerneld这种加载module的功能早已经被写到kernel中.
kernel中加载内核的实现:
内核代码树中的kernel/kmod.c中的:
int __request_module(bool wait, const char *fmt, ...)
在include/linux/kmod.h中定义一个重命名的宏:
#define request_module(mod...) __request_module(true, mod)
__request_module其实也是大家说的system call:
jessinio@niolaptop /usr/src/linux $ cat /proc/kallsyms |grep __request_module
c02389fa T __request_module
* 说白了, 这只是一个kernel空间被定义的, 很普通的function
* 这种system call在用户空间中没有什么特别能力! 因为它是使用了modprobe命令(在/proc/sys/kernel/modprobe中指定)
* 这种system call不会是人们关注的system call的
* "__"开始的函数与python推介的使用习惯是相同意义的
关于kmod: http://pficheux.free.fr/eyrolles/linux_embarque/docs_externes/kmod.txt.html
上面的文章中, 给出了一个issue, 和一个很有意义的建议:
1. built-in module
2. modular module
被编译入内核其实在速度上没有占有多大的优势, 相反, 列出了一堆使用模块module的好处. 那实际解决了一个极端的想法:
* 一切都被编译入kernel. ( 90%的人应该会想到速度上升的感觉. 其实这是幻觉 )
但是, 又会出现另一极端的想法:
* 一切都是modular module
又会是基于什么幻觉呢?
1. 基于方便使用?
这是不可能的. modular module还要被担心是不是被load到kernel中. 这增加了管理的需求.
built-in module在这方面更方便! 一切都在内核中了. 连modprobe和脚本都不用理会.
2. 基于省内存?
这篇文章: http://www.linuxjournal.com/article/1279 中的一节: What Should Be Compiled as a Module? 指出了多一个module会多浪费一点内存的. 这种浪费与多一个文件多一点浪费是一样道理的.
其实, 这种浪费会给人斤斤计较的感觉. 这个kernel会有成千上万个module? .和built-in module在速度上的上升一样是斤斤计较
所以, 两个极端的想都是不行的. 应该: 常用的被编译入kernel, 这样可以省去管理. 其它的都是modular module, 可以重编译module和省内存
这就存在一个如何区分哪些module是常用与不常的问题?
呃.... 我还不会. 我也不想斤斤计较.
上面引用的文章其实很旧了. 因为kerneld这种加载module的功能早已经被写到kernel中.
kernel中加载内核的实现:
内核代码树中的kernel/kmod.c中的:
int __request_module(bool wait, const char *fmt, ...)
在include/linux/kmod.h中定义一个重命名的宏:
#define request_module(mod...) __request_module(true, mod)
__request_module其实也是大家说的system call:
jessinio@niolaptop /usr/src/linux $ cat /proc/kallsyms |grep __request_module
c02389fa T __request_module
* 说白了, 这只是一个kernel空间被定义的, 很普通的function
* 这种system call在用户空间中没有什么特别能力! 因为它是使用了modprobe命令(在/proc/sys/kernel/modprobe中指定)
* 这种system call不会是人们关注的system call的
* "__"开始的函数与python推介的使用习惯是相同意义的
关于kmod: http://pficheux.free.fr/eyrolles/linux_embarque/docs_externes/kmod.txt.html
上面的文章中, 给出了一个issue, 和一个很有意义的建议:
Note for users building a heavily modularised system. It is a good idea to
create modules.dep after installing the modules and before booting a kernel for
the first time. "depmod -ae m.n.p" where m.n.p is the new kernel version.
不过. 这篇文章也是有点老了, 1999年的. 不知道在2.6内核中是否对这个issue上有了改进create modules.dep after installing the modules and before booting a kernel for
the first time. "depmod -ae m.n.p" where m.n.p is the new kernel version.
Wednesday, September 23, 2009
built-in 与 modular两种module
本人不是一专追求机器性能的人. 本人世界观觉得是没有必要这样做的.
本文主要是为了弄明白一件事: 编译入内核的module与动态加载的module是否在效率上有较大的差距.
linux kernel是单核结构, 称为monolithic kernel. 因为单核的一些缺点, linux kernel加入了modular结构.
因此linux对待module的方法有两种:
1. module被编译入内核, 成为monolithic kernel内部代码
2. module被编译成模块, 需要时才加载. 称为modular kernel.
被加载入内核的module, 其实也是执行于kernel的code space的. 这个的module与built-in module在效率上什么区别吗?
如果一定要说效率的话, 差别就在于静态链接与动态链接的差别了!
相反, modular kernel可以让kernel得到功能裁减, 效率上有提升!
modular module
优势:
1. 方便增加功能.
2. module参数传递
3. 减少memory footprint, 增加效率. 不使用时可以rmmod, 减少内存开支
缺点:
1. 在加载module上浪费时间( 这点其实是可以无视的! )
2. 容易被利用rootkit( 如果Module support = N 的话就永远不会出现 )
这里也没有提到built-in的module是否比load入的module效率高.
http://www.redhatlinuxsysadmin.com/configure-key-linux-components/module2/modular-monolithic-kernels.php
module需要被注册才可以被使用的. 所以/proc/devices中有系统中的所有驱动module
jessinio@niolaptop ~ $ cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
...
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
11 sr
...
例子中, major number是1的就是内存的module
jessinio@niolaptop ~ $ cat /proc/devices |grep alsa
116 alsa
jessinio@niolaptop ~ $ lsmod |grep alsa
比较一下, 可以知道alsa是一个built-in module
rmmod命令能否拆下built-in module呢? 下面测试一下
jessinio@niolaptop ~ $ sudo rmmod alsa
ERROR: Module alsa does not exist in /proc/modules
* 因为built-in module不在此文件中记录, rmmod是需要此文件的记录, 所以出错
其实rmmod是使用delete_module这个system call的:
jessinio@niolaptop /tmp $ sudo strace rmmod test_n
...
open("/proc/modules", O_RDONLY)
...
delete_module("test_nx", O_RDONLY|O_EXCL|O_NONBLOCK)
...
从delete_module的man手册中看到: delete_module - delete a loadable module entry. 只是针对于loadable的module才起作用的
* 所以rmmod是不能拆下built-in module的
其它参考文档:
http://systhread.net/texts/200510kdiff.php
本文主要是为了弄明白一件事: 编译入内核的module与动态加载的module是否在效率上有较大的差距.
linux kernel是单核结构, 称为monolithic kernel. 因为单核的一些缺点, linux kernel加入了modular结构.
因此linux对待module的方法有两种:
1. module被编译入内核, 成为monolithic kernel内部代码
2. module被编译成模块, 需要时才加载. 称为modular kernel.
被加载入内核的module, 其实也是执行于kernel的code space的. 这个的module与built-in module在效率上什么区别吗?
如果一定要说效率的话, 差别就在于静态链接与动态链接的差别了!
相反, modular kernel可以让kernel得到功能裁减, 效率上有提升!
modular module
优势:
1. 方便增加功能.
2. module参数传递
3. 减少memory footprint, 增加效率. 不使用时可以rmmod, 减少内存开支
缺点:
1. 在加载module上浪费时间( 这点其实是可以无视的! )
2. 容易被利用rootkit( 如果Module support = N 的话就永远不会出现 )
这里也没有提到built-in的module是否比load入的module效率高.
http://www.redhatlinuxsysadmin.com/configure-key-linux-components/module2/modular-monolithic-kernels.php
module需要被注册才可以被使用的. 所以/proc/devices中有系统中的所有驱动module
jessinio@niolaptop ~ $ cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
...
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
11 sr
...
例子中, major number是1的就是内存的module
jessinio@niolaptop ~ $ cat /proc/devices |grep alsa
116 alsa
jessinio@niolaptop ~ $ lsmod |grep alsa
比较一下, 可以知道alsa是一个built-in module
rmmod命令能否拆下built-in module呢? 下面测试一下
jessinio@niolaptop ~ $ sudo rmmod alsa
ERROR: Module alsa does not exist in /proc/modules
* 因为built-in module不在此文件中记录, rmmod是需要此文件的记录, 所以出错
其实rmmod是使用delete_module这个system call的:
jessinio@niolaptop /tmp $ sudo strace rmmod test_n
...
open("/proc/modules", O_RDONLY)
...
delete_module("test_nx", O_RDONLY|O_EXCL|O_NONBLOCK)
...
从delete_module的man手册中看到: delete_module - delete a loadable module entry. 只是针对于loadable的module才起作用的
* 所以rmmod是不能拆下built-in module的
其它参考文档:
http://systhread.net/texts/200510kdiff.php
Tuesday, September 22, 2009
major and minor number
Devices are divided into two types: character devices and block devices. 两者的区别:
1. 块设备有缓存区(有处理缓存区数据的可能性), 字符设备没有缓存区
2. 块设备返回的数据长度是固定的(由块设备决定). 但是字符设备是没有限制的
major number: tells you which driver is used to access the hardware, Each
driver is assigned a unique major number; all device files with the same major number are controlled by the same
driver
minor number: is used by the driver to distinguish between the various hardware it controls
* 其实major number比mino number容易解理. various hardware不是很好理解.
这两种number从应用上这样的:
当用户程序使用一个device file时(如打开一个sda). kernel需要使用major number去找适当的device driver去处理当前行为, 这时kernel对minor需求; 当请求到device driver处时, device driver需要利用minor number去区别对硬件的处理
其实上, minor number就是device driver的一个参数. 参数不同, device driver的行为不同. 至于这个参数的具体行为, 不同的驱动有不同的用法.
最常用的例子就是硬盘与分区:
jessinio@niolaptop /tmp $ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 2009-09-21 07:39 /dev/sda
brw-rw---- 1 root disk 8, 1 2009-09-21 07:39 /dev/sda1
brw-rw---- 1 root disk 8, 2 2009-09-21 07:39 /dev/sda2
brw-rw---- 1 root disk 8, 3 2009-09-21 07:39 /dev/sda3
brw-rw---- 1 root disk 8, 5 2009-09-21 07:39 /dev/sda5
brw-rw---- 1 root disk 8, 6 2009-09-21 07:39 /dev/sda6
* 同一个硬盘使用minor number去区别不同分区.
曾加一个U盘的情况:
jessinio@niolaptop /tmp $ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 2009-09-23 04:46 /dev/sdb
brw-rw---- 1 root disk 8, 17 2009-09-23 04:46 /dev/sdb1
* 同一种硬盘是使用相同的device driver, 但是分区就是不同的minor number.
相同major number不同minor number可以表示相同硬件也可以表示不同硬件, 我们怎么区别呢?
linux下的major号列表: /usr/src/linux/Documentation/devices.txt
这个文件其实就给出了方法, 如下为major number为8的block设备:
8 block SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
...
240 = /dev/sdp Sixteenth SCSI disk whole disk
Partitions are handled in the same way as for IDE
disks (see major number 3) except that the limit on
partitions is 15.
* minor number从16-31都为第二块硬盘使用的
* 本驱动对同一个硬盘最多支持15个分区. 最多也只能支持15个硬盘
从网上找到的第二个例子:
% ls -l /dev/fd0 /dev/fd0u1680
brwxrwxrwx 1 root floppy 2, 0 Jul 5 2000 /dev/fd0
brw-rw---- 1 root floppy 2, 44 Jul 5 2000 /dev/fd0u1680
其实上面是同一个硬件! 因为floppy有两种功能: 除了使用1.44M盘外, 还有一种高密度盘, 这种是需要相对硬件才能交换数据的
* 具体可以查看/usr/src/linux/Documentation/devices.txt
你自己的major号呢? 请申请吧
mknod命令
module怎么与major number关联呢?
通过如下API( 准确来说是system call )
include "linux/fs.h"
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
1. 块设备有缓存区(有处理缓存区数据的可能性), 字符设备没有缓存区
2. 块设备返回的数据长度是固定的(由块设备决定). 但是字符设备是没有限制的
major number: tells you which driver is used to access the hardware, Each
driver is assigned a unique major number; all device files with the same major number are controlled by the same
driver
minor number: is used by the driver to distinguish between the various hardware it controls
* 其实major number比mino number容易解理. various hardware不是很好理解.
这两种number从应用上这样的:
当用户程序使用一个device file时(如打开一个sda). kernel需要使用major number去找适当的device driver去处理当前行为, 这时kernel对minor需求; 当请求到device driver处时, device driver需要利用minor number去区别对硬件的处理
其实上, minor number就是device driver的一个参数. 参数不同, device driver的行为不同. 至于这个参数的具体行为, 不同的驱动有不同的用法.
最常用的例子就是硬盘与分区:
jessinio@niolaptop /tmp $ ls -l /dev/sda*
brw-rw---- 1 root disk 8, 0 2009-09-21 07:39 /dev/sda
brw-rw---- 1 root disk 8, 1 2009-09-21 07:39 /dev/sda1
brw-rw---- 1 root disk 8, 2 2009-09-21 07:39 /dev/sda2
brw-rw---- 1 root disk 8, 3 2009-09-21 07:39 /dev/sda3
brw-rw---- 1 root disk 8, 5 2009-09-21 07:39 /dev/sda5
brw-rw---- 1 root disk 8, 6 2009-09-21 07:39 /dev/sda6
* 同一个硬盘使用minor number去区别不同分区.
曾加一个U盘的情况:
jessinio@niolaptop /tmp $ ls -l /dev/sdb*
brw-rw---- 1 root disk 8, 16 2009-09-23 04:46 /dev/sdb
brw-rw---- 1 root disk 8, 17 2009-09-23 04:46 /dev/sdb1
* 同一种硬盘是使用相同的device driver, 但是分区就是不同的minor number.
相同major number不同minor number可以表示相同硬件也可以表示不同硬件, 我们怎么区别呢?
linux下的major号列表: /usr/src/linux/Documentation/devices.txt
这个文件其实就给出了方法, 如下为major number为8的block设备:
8 block SCSI disk devices (0-15)
0 = /dev/sda First SCSI disk whole disk
16 = /dev/sdb Second SCSI disk whole disk
32 = /dev/sdc Third SCSI disk whole disk
...
240 = /dev/sdp Sixteenth SCSI disk whole disk
Partitions are handled in the same way as for IDE
disks (see major number 3) except that the limit on
partitions is 15.
* minor number从16-31都为第二块硬盘使用的
* 本驱动对同一个硬盘最多支持15个分区. 最多也只能支持15个硬盘
从网上找到的第二个例子:
% ls -l /dev/fd0 /dev/fd0u1680
brwxrwxrwx 1 root floppy 2, 0 Jul 5 2000 /dev/fd0
brw-rw---- 1 root floppy 2, 44 Jul 5 2000 /dev/fd0u1680
其实上面是同一个硬件! 因为floppy有两种功能: 除了使用1.44M盘外, 还有一种高密度盘, 这种是需要相对硬件才能交换数据的
* 具体可以查看/usr/src/linux/Documentation/devices.txt
你自己的major号呢? 请申请吧
mknod命令
module怎么与major number关联呢?
通过如下API( 准确来说是system call )
include "linux/fs.h"
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
Linux kernel module(LKM)管理
学习linux下的module机制, 方便管理
* version为kernel的版本, 如# uname -r
module文件名都是以ko结尾的.
* 2.4之前为 .o 结尾
如果安装了bash-completion你就会发现
# modprobe <tab><tab>
列出的module数目与
# find /lib/modules/version -name *.ko
是一样的, 也可以使用
# modprobe -l
* Searching for modprobe ...
sys-apps/module-init-tools-3.5 (/sbin/modprobe)
* 之前的管理工具叫modutils
具体工具名单:
jessinio@niolaptop /etc $ equery files sys-apps/module-init-tools|grep bin
/bin
/bin/lsmod
/sbin
/sbin/depmod
/sbin/generate-modprobe.conf
/sbin/insmod
/sbin/insmod.static
/sbin/lsmod
/sbin/modinfo
/sbin/modprobe
/sbin/rmmod
/sbin/update-modules
1. /etc/modprobe.conf
2. /etc/modprobe.d
linux distro在启动时有一个加载module的脚本: /etc/init.d/modules
调用的配置文件为(man 5modules.autoload) :
1. /etc/modules.autoload
2. /etc/modules.d
* 这些文件属于sys-apps/baselayout包
kernel信息文件:
平时我们都喜欢使用modprobe命令而不是使用insmod, 因为modprobe解决了module之间的依赖. 其实, modprobe需要依赖于depmod命令产生的modules.dep文件
. 此文件默认路径: /lib/modules/version/module.dep
* man module.dep
其实name不一定是module的名字, 可以是alias
用处:
1. 应用层统一. 比如使用eth0去表示第一块网卡, 而不要去理会实际使用的module名的差异.
* ALSA的一个例子: http://alsa.opensrc.org/index.php/Setting_up_modprobe_and_kmod_support
常用的alias: http://svn.exactcode.de/t2/trunk/package/base/module-init-tools/modprobe.conf.data
还有这样的用法:
http://www.ducea.com/2006/06/01/disable-ipv6-module-on-default-kernels/
自己写的一篇alia方面的文章: http://blog.jessinio.info/2009/09/modulealias.html
/etc/init.d/modules
/etc/modules.autoload
2. 在系统需要使用modules功能时, 会调用来自kernel/kmod.c的request_module(bool wait, const char *name, ...)函数.

参考文档:
module与文件的路径
linux module放置的路径为/lib/modules/version* version为kernel的版本, 如# uname -r
module文件名都是以ko结尾的.
* 2.4之前为 .o 结尾
如果安装了bash-completion你就会发现
# modprobe <tab><tab>
列出的module数目与
# find /lib/modules/version -name *.ko
是一样的, 也可以使用
# modprobe -l
module的CLI管理工具
jessinio@niolaptop /etc $ equery belongs modprobe* Searching for modprobe ...
sys-apps/module-init-tools-3.5 (/sbin/modprobe)
* 之前的管理工具叫modutils
具体工具名单:
jessinio@niolaptop /etc $ equery files sys-apps/module-init-tools|grep bin
/bin
/bin/lsmod
/sbin
/sbin/depmod
/sbin/generate-modprobe.conf
/sbin/insmod
/sbin/insmod.static
/sbin/lsmod
/sbin/modinfo
/sbin/modprobe
/sbin/rmmod
/sbin/update-modules
module-init-tools工具配置文件
modprobe的配置文件:1. /etc/modprobe.conf
2. /etc/modprobe.d
2.4前的modutils使用的配置文件(现在还保留):
1. /etc/modules.conf
2. /etc/modules.d
1. /etc/modules.conf
2. /etc/modules.d
linux distro在启动时有一个加载module的脚本: /etc/init.d/modules
调用的配置文件为(man 5modules.autoload) :
1. /etc/modules.autoload
2. /etc/modules.d
* 这些文件属于sys-apps/baselayout包
kernel信息文件:
/proc/kallsyms: kernel space中的symbol, 包括变量到函数. system call就在其中!
/proc/modules: 加载的module列表.
1. 2.2前, 使用的module loader为kerneld, 这一个daemon程序. 这方面的资料地址
2. 2.4后, 被集成kernel中, 内核配置需要CONFIG_KMOD
module loader代码中默认会使用modprobe, 用户也可以动态修改: /proc/sys/kernel/modprobe
kmod.c提供了加载module的处理API, 如: request_module(bool wait, const char *name, ...)
这实现了一个module可以加载另一个module的方法
kernel module loader
中文称之为加载器. 这部分变化几次. 有两个版本:1. 2.2前, 使用的module loader为kerneld, 这一个daemon程序. 这方面的资料地址
2. 2.4后, 被集成kernel中, 内核配置需要CONFIG_KMOD
KMOD在2.6.28后就不需要
http://cateee.net/lkddb/web-lkddb/KMOD.html
module loader的源代码于:linux-source/kernel/kmod.chttp://cateee.net/lkddb/web-lkddb/KMOD.html
module loader代码中默认会使用modprobe, 用户也可以动态修改: /proc/sys/kernel/modprobe
kmod.c提供了加载module的处理API, 如: request_module(bool wait, const char *name, ...)
这实现了一个module可以加载另一个module的方法
加载module
参数:insmod ne.o io=0x300 irq=11
每个module都没有统一的参数, 需要参考module的文档
对于使用modprobe命令去加载的module, 它们的参数可以写到配置文件/etc/modprobe.conf和/etc/modprobe.d/*中
依赖关系:对于使用modprobe命令去加载的module, 它们的参数可以写到配置文件/etc/modprobe.conf和/etc/modprobe.d/*中
平时我们都喜欢使用modprobe命令而不是使用insmod, 因为modprobe解决了module之间的依赖. 其实, modprobe需要依赖于depmod命令产生的modules.dep文件
. 此文件默认路径: /lib/modules/version/module.dep
* man module.dep
Alias
# modprobe name其实name不一定是module的名字, 可以是alias
用处:
1. 应用层统一. 比如使用eth0去表示第一块网卡, 而不要去理会实际使用的module名的差异.
* ALSA的一个例子: http://alsa.opensrc.org/index.php/Setting_up_modprobe_and_kmod_support
常用的alias: http://svn.exactcode.de/t2/trunk/package/base/module-init-tools/modprobe.conf.data
还有这样的用法:
http://www.ducea.com/2006/06/01/disable-ipv6-module-on-default-kernels/
自己写的一篇alia方面的文章: http://blog.jessinio.info/2009/09/modulealias.html
automatic load
1. 在系统启动时自动加载module, 涉及的:/etc/init.d/modules
/etc/modules.autoload
2. 在系统需要使用modules功能时, 会调用来自kernel/kmod.c的request_module(bool wait, const char *name, ...)函数.
module的加载过程
参考文档:
http://tldp.org/HOWTO/Module-HOWTO/
http://tldp.org/LDP/lkmpg/2.6/html/x44.htmlmodule的alias
/etc/modprobe.conf中就定义了module的alias
从modprobe.conf的man手册中描述的是:
但是modprobe.conf中会出现相反的:
alias sound-service-0-1 snd-seq-oss
alias char-major-108 ppp_generic
alias pnp:dPNPb02f analog
其实, 上面的例子中, 我不觉得alia名比module名好记多少
但在实现应用中, 这个alias就有相当重要的作用.
/usr/src/linux/socket.c 文件中的一段代码:
#ifdef CONFIG_MODULES
/* Attempt to load a protocol module if the find failed.
*
* 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
* requested real, full-featured networking support upon configuration.
* Otherwise module support will break!
*/
if (net_families[family] == NULL)
request_module("net-pf-%d", family);
#endif
"net-pf-%d"就是网络协议的alia名. 一个module判断需求的另一个module, 是根据kernel space中是否某一变量:
jessinio@niolaptop /usr/src/linux $ cat /proc/kallsyms |grep net_families
c09270e0 d net_families
* 至少这个变量是否被module的初始化函数去声明. 暂不理会.
可以从上面的使用方式去理解module的alia的作用: 为module定义一个不变的名字
怎么解理呢?
/usr/src/linux/socket.c的代码中, 使用了"net-pf-%d"字符串, 如果ipv4的module名因为需求变化了. 这就会影响到socket.c的使用! 当alia的存在可以很方便解决这种问题
其实就与NSS机制(配置文件为nsswitch.conf)是一样道理的.
从modprobe.conf的man手册中描述的是:
This allows you to give alternate names for a module
这种机制常常会使人想的一种使用方式: 把复杂的, 长的, 不人性化的module名alia到简单的, 短的, 容易记的module名.但是modprobe.conf中会出现相反的:
alias sound-service-0-1 snd-seq-oss
alias char-major-108 ppp_generic
alias pnp:dPNPb02f analog
其实, 上面的例子中, 我不觉得alia名比module名好记多少
但在实现应用中, 这个alias就有相当重要的作用.
/usr/src/linux/socket.c 文件中的一段代码:
#ifdef CONFIG_MODULES
/* Attempt to load a protocol module if the find failed.
*
* 12/09/1996 Marcin: But! this makes REALLY only sense, if the user
* requested real, full-featured networking support upon configuration.
* Otherwise module support will break!
*/
if (net_families[family] == NULL)
request_module("net-pf-%d", family);
#endif
"net-pf-%d"就是网络协议的alia名. 一个module判断需求的另一个module, 是根据kernel space中是否某一变量:
jessinio@niolaptop /usr/src/linux $ cat /proc/kallsyms |grep net_families
c09270e0 d net_families
* 至少这个变量是否被module的初始化函数去声明. 暂不理会.
可以从上面的使用方式去理解module的alia的作用: 为module定义一个不变的名字
怎么解理呢?
/usr/src/linux/socket.c的代码中, 使用了"net-pf-%d"字符串, 如果ipv4的module名因为需求变化了. 这就会影响到socket.c的使用! 当alia的存在可以很方便解决这种问题
其实就与NSS机制(配置文件为nsswitch.conf)是一样道理的.
Subscribe to:
Posts (Atom)