您的位置:首页 > 运维架构 > Linux

Linux 热插拔(Hot Plug…

2013-12-19 20:50 281 查看
将可移动设备连入系统时,系统的后台中会依次发生如下事件:
l

内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。
l
udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。
l
hotplug装入了相应的内核模块之后,会把这一消息通知给hald。
l
hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc/fstab,为相应的设备节点创建适合的挂载点。
l

卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。

当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助:
l
hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。
l

卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。

要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。

下面是上面的过程中涉及的模块和工具:
l
hotplug
hotplug
包和内核里的hotplug模块不是一回事,2.6内核里的pci_hotplug.ko是一个内核模块,而hotplug包是用来处理内核产生的hotplug事件。这个软件包还在引导时检测现存的硬件并在运行的内核中加载相关模块。

不但有热插拔,还有冷插拔(cold pluging)。热插拔在内核启动之后发生,而“cold pluging”发生在内核启动的过程中。
/etc/hotplug };
MODULE_DEVICE_TABLE(usb, mdc800_table);[/b]
which causes the following line to be added to the
modules.usbmap file:

mdc800 0x0003 0x055f 0xa800 0x0000 0x0000 0x00 0x00
0x00 0x00 0x00 0x00 0x00000000

Or it can specify that it accepts any device that matches a
specific USB class code, as in this example from
drivers/usb/printer.c:
static struct usb_device_id usblp_ids [] = {
{ USB_INTERFACE_INFO(USB_CLASS_PRINTER, 1, 1) },
{ USB_INTERFACE_INFO(USB_CLASS_PRINTER, 1, 2) },
{ USB_INTERFACE_INFO(USB_CLASS_PRINTER, 1, 3) },
{ }
};
MODULE_DEVICE_TABLE(usb, usblp_ids);

which causes the following lines to be added to the modules.usbmap
file:
printer 0x0380 0x0000 0x0000 0x0000 0x0000 0x00 0x00
0x00 0x07 0x01 0x01 0x00000000
printer 0x0380 0x0000 0x0000 0x0000 0x0000 0x00 0x00
0x00 0x07 0x01 0x02 0x00000000
printer 0x0380 0x0000 0x0000 0x0000 0x0000 0x00 0x00
0x00 0x07 0x01 0x03 0x00000000

Again these USB examples show that the information in the
modules.usbmap file matches the information provided to
/sbin/hotplug by the kernel, enabling /sbin/hotplug to determine
which driver to load without relying on a hand-generated table, as
PCMCIA does.

Preprocessor Abuse

The macro MODULE_DEVICE_TABLE automatically creates two
variables. For the example: MODULE_DEVICE_TABLE (usb, usblp_ids);
the variables __module_usb_device_size and
__module_usb_device_table are created and placed into the read-only
data section and the initialized data section of the module,
respectively. The variable __module_usb_device_size contains the
value of the size of the struct usb_id structure, and
__module_usb_device_table points to the usblp_ids structure. The
usblp_ids variable is an array of usb_id structures with a
terminating NULL structure at the end of the list.

When the depmod program is run, as part of the kernel
installation process, it goes through every module looking for the
symbol __module_usb_device_size to be present in the compiled
module. If it finds it, it copies the data pointed to by the
__module_usb_device_table symbol into a structure, extracts all of
the information and writes it out to the modules.usbmap file, which
is located in the module root directory. It does the same thing
while looking for the __module_pci_device_size in creating the
modules.pcimap file.

With the kernel module information exported to the files
modules.usbmap and modules.pcimap, our version of /sbin/hotplug can
look like Listing 2 [available at ftp.ssc.com/pub/lj/listings/issue96/5604.tgz].
This example only tests for a match of the USB product ID and
vendor IDs. The Linux-Hotplug Project has created a set of scripts
that covers all of the different subsystems that can call
/sbin/hotplug. This enables drivers to be loaded automatically when
new devices are inserted into the systems. It also starts up
network services when network devices are seen. These scripts are
released under the GPL and are available at linux-hotplug.sourceforge.net. Almost
all major Linux distributions are currently shipping this package,
so it is probably already on your machine.

The Future

The current /sbin/hotplug subsystem needs to be incorporated
into other kernel systems, as they develop hot-plug capability.
SCSI, IDE and other systems all have hot-plug patches available for
kernel support but need to have script support, kernel macro
support and modutils depmod support added in order to provide the
user with a consistent experience.

As the kernel boots, and discovers new devices, it tries to
spawn /sbin/hotplug, but since user space has not been initialized
yet, it cannot run. This means that any USB or PCI devices that are
needed at boot time need to be compiled into the kernel or exist in
an initrd RAM disk image as a module. Sometime during the 2.5
development process, the initrd RAM disk image will be converted to
contain an entire small user-space tree. This will allow
/sbin/hotplug to be run during the boot process and load modules
dynamically. Some links describing this disk image idea are:
lwn.net/2001/0712/kernel.php3,
marc.theaimsgroup.com/?l=acpi4linux&m=99705696732868,
marc.theaimsgroup.com/?l=linux-kernel&m=99436439232254
and marc.theaimsgroup.com/?l=linux-kernel&m=99436253707952.

Because of the small space requirements of this RAM disk image,
the dietHotplug program has been written. It is an implementation
of the Linux-Hotplug bash scripts in C and does not require
modules.*map files when the program runs. The executable size of
the entire dietHotplug program is one-fifth of the size of the
original modules.*map files themselves. The small size is due to
the use of dietLibc (found at www.fefe.de/dietlibc) and other
space-saving techniques. dietHotplug will undergo more development as
the 2.5 kernel requirements are more fully known. dietHotplug can be downloaded from the
Linux-Hotplug site.

Acknowledgements

I would like to thank David Brownell who wrote the original
/sbin/hotplug kernel patch and most of the Linux Hotplug scripts.
Without his persistence, Linux would not have this user-friendly
feature. I also would like to acknowledge the entire Linux USB
development team, who have provided a solid kernel subsystem in a
relatively short amount of time.

Keith Owens wrote the supporting code in the depmod utility and
has endured constant changes to the format of the
MODULE_DEVICE_TABLE() USB structure.

The other developers on the linux-hotplug-devel mailing list who
have helped with their patches and feedback on the hot-plug scripts
also deserve recognition, along with the wonderful Linux
distribution-specific support that Debian, Red Hat and Mandrake
have provided.

This article was based upon a paper and presentation that I gave
at the 2001 Ottawa Linux Symposium.

Greg Kroah-Hartman is currently
the Linux USB and PCI Hotplug kernel maintainer. He works for IBM,
doing various LInux kernel-related things and can be reached at
greg@kroah.com.

email: greg@kroah.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: