Difference between revisions of "Kernel modules (简体中文)"

From ArchWiki
Jump to: navigation, search
(article created)
 
(黑名单: Add FILES list.)
(8 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 +
[[Category:简体中文]]
 
[[Category:Kernel (简体中文)]]
 
[[Category:Kernel (简体中文)]]
 
[[Category:Hardware detection and troubleshooting (简体中文)]]
 
[[Category:Hardware detection and troubleshooting (简体中文)]]
 
[[Category:Boot process (简体中文)]]
 
[[Category:Boot process (简体中文)]]
{{i18n|Kernel modules}}
+
[[en:Kernel modules]]
{{translateme}}
+
[[es:Kernel modules]]
 
+
[[it:Kernel modules]]
 
本文包含了操作 [[Wikipedia:Loadable_kernel_module|内核模块]] 的不同方法。
 
本文包含了操作 [[Wikipedia:Loadable_kernel_module|内核模块]] 的不同方法。
  
 
== 概览 ==
 
== 概览 ==
{{Expansion}}
 
For a module to be recognized as such, it has to be compiled as a module in the kernel configuration (the line related to the module will therefore display the letter {{ic|M}}).
 
  
Modules are stored in {{ic|/lib/modules/''kernel_release''}} (use the command {{ic|uname -r}} to print your current kernel release).
+
要让内核认识模块,需要在内核配置时将模块配置为 {{ic|M}} (模块)。
 +
 
 +
模块保存在 {{ic|/lib/modules/''kernel_release''}} (使用 {{ic|uname -r}} 命令显示当前内核版本)
  
The {{ic|/sbin/modprobe}} command handles the addition and removal of modules from the Linux kernel.
+
{{ic|/sbin/modprobe}} 命令负责内核模块的加入和移除。
  
The {{ic|/etc/modprobe.d/}} directory can be used to pass module settings to [[udev]], which will use {{ic|modprobe}} to manage the loading of the modules during system boot. You can use configuration files with any name in the directory, given that they end with the {{ic|.conf}} extension.
+
{{ic|/etc/modprobe.d/}} 目录可以将模块设置传递给 [[udev]], udev 使用 {{ic|modprobe}} 在系统启动时管理内核模块的装入。可以使用任意配置文件名,只要是以 {{ic|.conf}} 结尾即可。
  
{{Note|Module names often use underscores ({{ic|_}}) or dashes ({{ic|-}}), however those symbols are interchangeable both when using the {{ic|modprobe}} command and in configuration files in {{ic|/etc/modprobe.d/}}.}}
+
{{注意|模块名通常使用 ({{ic|_}}) {{ic|-}} 连接,但是这些符号在 {{ic|modprobe}} 命令和 {{ic|/etc/modprobe.d/}} 配置文件中都是可以相互替换的。}}
  
 
== 获取信息 ==
 
== 获取信息 ==
  
* Format the contents of {{ic|/proc/modules}} and show what kernel modules are currently loaded:
+
* 显示当前装入的内核模块:
 
  $ lsmod
 
  $ lsmod
  
* Use {{ic|modinfo}} to show information about a module:
+
* 使用 {{ic|modinfo}} 显示模块信息:
 
  $ modinfo ''module_name''
 
  $ modinfo ''module_name''
  
* Use {{ic|modprobe}} to list the dependencies of a module (or alias), including the module itself:
+
* 使用 {{ic|modprobe}} 显示模块的依赖关系:
 
  $ modprobe --show-depends ''module_name''
 
  $ modprobe --show-depends ''module_name''
 +
 +
* 使用 {{ic|systool}} 显示一个装入模块使用的选项:
 +
$ systool -v -m ''module_name''
  
 
===配置===
 
===配置===
  
If you want to display the comprehensive configuration of all the modules you can use the command:
+
显示所有模块的配置信息:
  
 
  $ modprobe -c | less
 
  $ modprobe -c | less
  
To display the configuration of a particular module, use:
+
显示某个模块的配置信息:
  
 
  $ modprobe -c | grep ''module_name''
 
  $ modprobe -c | grep ''module_name''
  
==载入==
+
===Parameters===
To manually load (or add) a module, run:
+
 
 +
下面的 bash 脚本可以显示当前装入模块、模块参数及当前参数的数值。它使用 {{ic|/proc/modules}} 获取当前装入模块的列表,然后用 modinfo 获取模块的描述和模块的参数,最后访问 sysfs 文件系统获得当前模块名和参数值。
 +
 
 +
{{bc|<nowiki>function aa_mod_parameters ()  
 +
{
 +
    N=/dev/null;
 +
    C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
 +
    for mod in $(cat /proc/modules|cut -d" " -f1);
 +
    do
 +
        md=/sys/module/$mod/parameters;
 +
        [[ ! -d $md ]] && continue;
 +
        m=$mod;
 +
        d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
 +
        echo -en "$O$m$C";
 +
        [[ ${#d} -gt 0 ]] && echo -n " - $d";
 +
        echo;
 +
        for mc in $(cd $md; echo *);
 +
        do
 +
            de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
 +
            echo -en "\t$mc=`cat $md/$mc 2>$N`";
 +
            [[ ${#de} -gt 1 ]] && echo -en " - $de";
 +
            echo;
 +
        done;
 +
    done
 +
}</nowiki>}}
 +
 
 +
示例输出:
 +
 
 +
{{hc|# aa_mod_parameters|<nowiki>>>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver
 +
        hird=0 - hird:host initiated resume duration, +1 for each 75us (int)
 +
        ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool)
 +
        log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int)
 +
        park=0 - park:park setting; 1-3 back-to-back async packets (uint)
 +
 
 +
>>> processor - ACPI Processor Driver
 +
        ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int)
 +
        ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int)
 +
        latency_factor=2 - latency_factor: (uint)
 +
 
 +
>>> usb_storage - USB Mass Storage driver for Linux
 +
        delay_use=1 - delay_use:seconds to delay before using a new device (uint)
 +
        option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
 +
        quirks= - quirks:supplemental list of device IDs and their quirks (string)
 +
        swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)
 +
 
 +
>>> video - ACPI Video Driver
 +
        allow_duplicates=N - allow_duplicates: (bool)
 +
        brightness_switch_enabled=Y - brightness_switch_enabled: (bool)
 +
        use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)</nowiki>}}
 +
 
 +
==装入==
 +
要手动装入模块,运行:
  
 
  # modprobe ''module_name''
 
  # modprobe ''module_name''
  
For information on loading modules automatically at system boot, see [[rc.conf#Hardware|rc.conf]].
+
要在系统启动时自动装入模块,请参考 [[rc.conf#Hardware|rc.conf]]
  
 
==移除==
 
==移除==
Occasionally you could need to remove (or unload) a module; in this case use the following command:
+
如果要移除一个模块:
 
+
 
  # modprobe -r ''module_name''
 
  # modprobe -r ''module_name''
  
Or, alternatively:
+
或者:
  
 
  # rmmod ''module_name''
 
  # rmmod ''module_name''
  
 
==选项==
 
==选项==
To pass a parameter to a kernel module you can use a modprobe conf file or use the kernel command line.
+
可以用 modprobe 配置文件或内核命令行传入模块配置信息。
  
 
===使用 /etc/modprobe.d/中的文件===
 
===使用 /etc/modprobe.d/中的文件===
To pass options to a module using modprobe config files, a .conf file with any name (you can even use {{ic|/etc/modprobe.d/modprobe.conf}}) needs to be placed in {{ic|/etc/modprobe.d/}} with this syntax:
+
要通过配置文件传递参数,在 {{ic|/etc/modprobe.d/}} 中放入任意名称 {{ic|.conf}} 文件,加入:
 
{{hc|/etc/modprobe.d/myfilename.conf|2=options modname parametername=parametercontents}}
 
{{hc|/etc/modprobe.d/myfilename.conf|2=options modname parametername=parametercontents}}
for example:
+
例如
 
{{hc|/etc/modprobe.d/thinkfan.conf|2=# On thinkpads, this lets the thinkfan daemon control fan speed
 
{{hc|/etc/modprobe.d/thinkfan.conf|2=# On thinkpads, this lets the thinkfan daemon control fan speed
 
options thinkpad_acpi fan_control=1}}
 
options thinkpad_acpi fan_control=1}}
  
 
===使用内核命令行===
 
===使用内核命令行===
If the module is built into the kernel you can also pass options to the module using the kernel command line (e.g. in [[GRUB]], [[LILO]] or [[Syslinux]]) using the following syntax:
+
如果模块直接编译进内核,也可以通过启动管理器([[GRUB]], [[LILO]] [[Syslinux]])的内核行加入参数:
 
  modname.parametername=parametercontents
 
  modname.parametername=parametercontents
for example:
+
例如:
 
  thinkpad_acpi.fan_control=1
 
  thinkpad_acpi.fan_control=1
  
 
==别名==
 
==别名==
{{Expansion}}
+
 
 
{{hc|/etc/modprobe.d/myalias.conf|<nowiki># Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'
 
{{hc|/etc/modprobe.d/myalias.conf|<nowiki># Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'
 
alias mymod really_long_module_name</nowiki>}}
 
alias mymod really_long_module_name</nowiki>}}
  
Some modules have aliases which are used to autoload them when they are needed by an application. Disabling these aliases can prevent auto-loading, but will still allow the modules to be manually loaded.
+
有些模块具有别名,以方便其它程序自动装入模块。禁用这些别名可以阻止自动装入,但是仍然可以手动装入。
 
{{hc|/etc/modprobe.d/modprobe.conf|<nowiki># Prevent autoload of bluetooth
 
{{hc|/etc/modprobe.d/modprobe.conf|<nowiki># Prevent autoload of bluetooth
 
alias net-pf-31 off
 
alias net-pf-31 off
Line 85: Line 139:
  
 
==黑名单==
 
==黑名单==
Blacklisting, in the context of kernel modules, is a mechanism to prevent the kernel module from loading. This could be useful if, for example, the associated hardware is not needed, or if loading that module causes problems: for instance there may be two kernel modules that try to control the same piece of hardware, and loading them together would result in a conflict.
+
对内核模块来说,黑名单是指禁止某个模块装入的机制。当对应的硬件不存在或者装入某个模块会导致问题时很有用。
  
Some modules are loaded as part of the [[initramfs]]. {{ic|mkinitcpio -M}} will print out all autodetected modules: to prevent the initramfs from loading some of those modules, blacklist them in {{ic|/etc/modprobe.d/modprobe.conf}}. Running {{ic|mkinitcpio -v}} will list all modules pulled in by the various hooks (e.g. filesystem hook, SCSI hook, etc.). Remember to rebuild the initramfs once you have blacklisted the modules and to reboot afterwards.
+
有些模块作为 [[initramfs]] 的一部分装入。
 +
 
 +
{{ic|mkinitcpio -M}} 会显示所有自动检测到到模块:要阻止 initramfs 装入某些模块,可以在 {{ic|/etc/modprobe.d/modprobe.conf}} 中将它们加入黑名单。
 +
 
 +
运行 {{ic|mkinitcpio -v}} 会显示各种钩子(例如 filesystem 钩子, SCSI 钩子等)装入的模块。如果要禁用这些模块,记得在配置完成后,将{{ic|.conf}}文件加入{{ic|/etc/mkinitcpio.conf}} 的 FILES 部分,然后重新生成 initramfs。
  
 
===使用 /etc/modprobe.d/ 中的文件===
 
===使用 /etc/modprobe.d/ 中的文件===
  
Create a {{ic|.conf}} file inside {{ic|/etc/modprobe.d/}} and append a line for each module you want to blacklist, using the {{ic|blacklist}} keyword. If for example you want to prevent the {{ic|pcspkr}} module from loading:
+
{{ic|/etc/modprobe.d/}} 中创建 {{ic|.conf}} 文件,使用 {{ic|blacklist}} 关键字屏蔽不需要的模块,例如如果不想装入 {{ic|pcspkr}} 模块:
  
 
{{hc|/etc/modprobe.d/nobeep.conf|<nowiki># Do not load the pcspkr module on boot
 
{{hc|/etc/modprobe.d/nobeep.conf|<nowiki># Do not load the pcspkr module on boot
 
blacklist pcspkr</nowiki>}}
 
blacklist pcspkr</nowiki>}}
  
{{Note|The {{ic|blacklist}} command will blacklist a module so that it will not be loaded automatically, but the module may be loaded if another non-blacklisted module depends on it or if it is loaded manually.
+
{{注意|{{ic|blacklist}} 命令将屏蔽一个模板,所有不会自动装入,但是如果其它非屏蔽模块需要这个模块,系统依然会装入它。}}
  
However, there is a workaround for this behaviour; the {{ic|install}} command instructs modprobe to run a custom command instead of inserting the module in the kernel as normal, so you can force the module to always fail loading with:
+
要避免这个行为,可以让 modprobe 使用自定义的 {{ic|install}} 命令,直接返回导入失败:
  
 
{{hc|/etc/modprobe.d/blacklist.conf|<nowiki>...
 
{{hc|/etc/modprobe.d/blacklist.conf|<nowiki>...
Line 104: Line 162:
 
...</nowiki>}}
 
...</nowiki>}}
  
This will effectively "blacklist" that module and any other that depends on it.}}
+
这样就可以 "屏蔽" 模块及所有依赖它的模块。
  
 
===使用内核命令行===
 
===使用内核命令行===
  
{{Tip|This is useful in an emergency where a broken module makes it impossible to boot your system.}}
+
同样可以通过内核命令行(位于 [[GRUB]][[LILO]] [[Syslinux]])禁用模块:
 
+
You can also blacklist modules on the kernel command line (e.g. in [[GRUB]], [[LILO]] or [[Syslinux]]) using the following syntax:
+
 
  modprobe.blacklist=modname1,modname2,modname3
 
  modprobe.blacklist=modname1,modname2,modname3
  
Alternatively:
+
当某个模块导致系统无法启动时,可以使用此方法禁用模块。
 
+
modname.disable=1
+
  
 
====使用 GRUB 的示例====
 
====使用 GRUB 的示例====
Line 130: Line 184:
  
 
*http://linuxmanpages.com/man5/modprobe.conf.5.php
 
*http://linuxmanpages.com/man5/modprobe.conf.5.php
*[[Disabling IPv6]]
+
*[[Disabling IPv6 (简体中文)|禁用 IPv6]]
*[[Disable PC Speaker Beep]]
+
*[[Disable PC Speaker Beep (简体中文)|禁用 PC喇叭]]

Revision as of 05:58, 21 November 2012

本文包含了操作 内核模块 的不同方法。

概览

要让内核认识模块,需要在内核配置时将模块配置为 M (模块)。

模块保存在 /lib/modules/kernel_release (使用 uname -r 命令显示当前内核版本)。

/sbin/modprobe 命令负责内核模块的加入和移除。

/etc/modprobe.d/ 目录可以将模块设置传递给 udev, udev 使用 modprobe 在系统启动时管理内核模块的装入。可以使用任意配置文件名,只要是以 .conf 结尾即可。

注意: 模块名通常使用 (_) 或 - 连接,但是这些符号在 modprobe 命令和 /etc/modprobe.d/ 配置文件中都是可以相互替换的。

获取信息

  • 显示当前装入的内核模块:
$ lsmod
  • 使用 modinfo 显示模块信息:
$ modinfo module_name
  • 使用 modprobe 显示模块的依赖关系:
$ modprobe --show-depends module_name
  • 使用 systool 显示一个装入模块使用的选项:
$ systool -v -m module_name

配置

显示所有模块的配置信息:

$ modprobe -c | less

显示某个模块的配置信息:

$ modprobe -c | grep module_name

Parameters

下面的 bash 脚本可以显示当前装入模块、模块参数及当前参数的数值。它使用 /proc/modules 获取当前装入模块的列表,然后用 modinfo 获取模块的描述和模块的参数,最后访问 sysfs 文件系统获得当前模块名和参数值。

function aa_mod_parameters () 
{ 
    N=/dev/null;
    C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
    for mod in $(cat /proc/modules|cut -d" " -f1);
    do
        md=/sys/module/$mod/parameters;
        [[ ! -d $md ]] && continue;
        m=$mod;
        d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
        echo -en "$O$m$C";
        [[ ${#d} -gt 0 ]] && echo -n " - $d";
        echo;
        for mc in $(cd $md; echo *);
        do
            de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
            echo -en "\t$mc=`cat $md/$mc 2>$N`";
            [[ ${#de} -gt 1 ]] && echo -en " - $de";
            echo;
        done;
    done
}

示例输出:

# aa_mod_parameters
>>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver
        hird=0 - hird:host initiated resume duration, +1 for each 75us (int)
        ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool)
        log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int)
        park=0 - park:park setting; 1-3 back-to-back async packets (uint)

>>> processor - ACPI Processor Driver
        ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int)
        ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int)
        latency_factor=2 - latency_factor: (uint)

>>> usb_storage - USB Mass Storage driver for Linux
        delay_use=1 - delay_use:seconds to delay before using a new device (uint)
        option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
        quirks= - quirks:supplemental list of device IDs and their quirks (string)
        swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)

>>> video - ACPI Video Driver
        allow_duplicates=N - allow_duplicates: (bool)
        brightness_switch_enabled=Y - brightness_switch_enabled: (bool)
        use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)

装入

要手动装入模块,运行:

# modprobe module_name

要在系统启动时自动装入模块,请参考 rc.conf

移除

如果要移除一个模块:

# modprobe -r module_name

或者:

# rmmod module_name

选项

可以用 modprobe 配置文件或内核命令行传入模块配置信息。

使用 /etc/modprobe.d/中的文件

要通过配置文件传递参数,在 /etc/modprobe.d/ 中放入任意名称 .conf 文件,加入:

/etc/modprobe.d/myfilename.conf
options modname parametername=parametercontents

例如

/etc/modprobe.d/thinkfan.conf
# On thinkpads, this lets the thinkfan daemon control fan speed
options thinkpad_acpi fan_control=1

使用内核命令行

如果模块直接编译进内核,也可以通过启动管理器(GRUB, LILOSyslinux)的内核行加入参数:

modname.parametername=parametercontents

例如:

thinkpad_acpi.fan_control=1

别名

/etc/modprobe.d/myalias.conf
# Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'
alias mymod really_long_module_name

有些模块具有别名,以方便其它程序自动装入模块。禁用这些别名可以阻止自动装入,但是仍然可以手动装入。

/etc/modprobe.d/modprobe.conf
# Prevent autoload of bluetooth
alias net-pf-31 off

# Prevent autoload of ipv6
alias net-pf-10 off

黑名单

对内核模块来说,黑名单是指禁止某个模块装入的机制。当对应的硬件不存在或者装入某个模块会导致问题时很有用。

有些模块作为 initramfs 的一部分装入。

mkinitcpio -M 会显示所有自动检测到到模块:要阻止 initramfs 装入某些模块,可以在 /etc/modprobe.d/modprobe.conf 中将它们加入黑名单。

运行 mkinitcpio -v 会显示各种钩子(例如 filesystem 钩子, SCSI 钩子等)装入的模块。如果要禁用这些模块,记得在配置完成后,将.conf文件加入/etc/mkinitcpio.conf 的 FILES 部分,然后重新生成 initramfs。

使用 /etc/modprobe.d/ 中的文件

/etc/modprobe.d/ 中创建 .conf 文件,使用 blacklist 关键字屏蔽不需要的模块,例如如果不想装入 pcspkr 模块:

/etc/modprobe.d/nobeep.conf
# Do not load the pcspkr module on boot
blacklist pcspkr
注意: blacklist 命令将屏蔽一个模板,所有不会自动装入,但是如果其它非屏蔽模块需要这个模块,系统依然会装入它。

要避免这个行为,可以让 modprobe 使用自定义的 install 命令,直接返回导入失败:

/etc/modprobe.d/blacklist.conf
...
install MODULE /bin/false
...

这样就可以 "屏蔽" 模块及所有依赖它的模块。

使用内核命令行

同样可以通过内核命令行(位于 GRUBLILOSyslinux)禁用模块:

modprobe.blacklist=modname1,modname2,modname3

当某个模块导致系统无法启动时,可以使用此方法禁用模块。

使用 GRUB 的示例

/boot/grub/menu.lst
...
kernel /vmlinuz-linux root=/dev/sda1 modprobe.blacklist=pcspkr,ipv6 ro
...
/boot/grub/menu.lst
...
kernel /vmlinuz-linux root=/dev/sda1 pcspkr.disable=1 ipv6.disable=1 ro
...

参见