dbus+hal和hotplug+updfstab比较
以下言论仅供参考,难免有错误的地方,只自己的一点理解。linux内核支持hotplug在文件系统中
# cat /proc/sys/kernel/hotplug
/sbin/hotplug
/sbin/hotplug程序在hotplug的包中,该包会按linux内核中提示的类型
调用/sbin/hotplug程序,hotplug程序会调用/etc/hotplug.d/default下
的脚本,/etc/hotplug.d/default/default.hotplug又调用/etc/hotplug/
下的对应脚本,如果是usb则调用/etc/hotplug/usb.agent,该脚本如果
参数是add则会自动查找usb的驱动,然后调用kudzu包中updfstab程序,
该程序会修改/etc/fstab文件,增加一个mount的记录,比如:
/dev/sda1 /mnt/generichd auto noauto,owner,kudzu 0 0
kudzu表示是kudzu自动生成的,然后kdebase中kdebase-3.4.0/kioslave/media/kdedmodule这个模块如果是按fstab而不是
hal的编译的话fstabbackend.cpp(.h)这个模块就会编译到kded_mediamanager
这个kde后台执行程序中去,该模块会不断的扫描/etc/fstab和/etc/mtab两个
文件,如果发现有新的设备加入,就会自动触发桌面设备图标和konquer左边
栏中的设备图标,自动添加该设备。
参数如果是remove的话,会自动调用updfstab程序,该程序会自动删除/etc/fstab
中有kudzu添加的设备选项即加了kudzu这个参数的设备。然后kde后台的上面
提到的那个后台程序,就会把图标删掉。
不过这个工作方式的效率不如hal的工作效率,hal其实也是由hotplug触发的,
/etc/hotplug.d/default/20-hal.hotplug,(hal原来主要流行于gnome桌面环境)
hal好像是直接调用程序嵌入的,它会按消息来源触发不同的设备,而updfstab
则要扫描所有设备然后重新生成/etc/fstab文件,hal不会改该文件,它有自己的
消息机制,程序中要调用它hal-devel和dbus-devel的连接库开发,就这点来说hotplug中用脚本
方式相对比较自由一点。 而且后来的发行版的kudzu包中,都不包括updfstab这个程序了必须自己
make updfstab
make install-updfstab
手动编译和安装 支持一下楼主,给了个精华。 分析的很细致,好的学习资料。 hal 会修改 fstab
而且后来的发行版的kudzu包中,都不包括updfstab这个程序了
那是因为引入了hal 之后 不需要它了 这个是原理图。
hal自己不会修改fstab的,它会调用其它程序来接这个请求。目前做这项工作的程序是fstab-sync。
另外,hotplug自己很少会和hal接触,因为hotplug的主要工作是和内核接触,挂上相应的模块。而hal只能在设备创建之后才能够去通知要更新fstab和上层的应用程序。在模块挂上到设备创建之间的过程,一般是通过udev来实现的。 KDE中支持hal,是在文件kdebase\kioslave\media\kdemodule\halbackend.cpp中,
它在HAL中注册几个回调函数,当HAL发现新硬件会调用这几个函数,然后这几个
函数在根据HAL提供的设备信息创建媒体设备对象,即konqueror左侧设备对象和
桌面设备对象,在kdebase/kioslave/media/services目录中是对该类设备操作服务,
比如:media_mount.desktop为挂载设备,该目录下的服务最终都是调用的同一个
程序:kdebase/kioslave/media/mounthelper/kio_media_mounthelper.cpp,该程
序编译后为/usr/bin/kio_media_mounthelper,该程序负责调用设备的装载和卸载
等操作。它最终调用的都是kdelibs/kio中的mount\umount的操作函数,该函数在
文件:kdelibs\kio\kio\job.cpp中,mount\umount函数不做具体的处理,继续调用
“file:/”文件服务协议,该协议的实现在:kdelibs/kioslave/file/file.cc文件中,该文件
先调用pmount程序挂载设备(传递的参数:pmount /dev/sda1,pmount根据设备
的具体情况去判断挂接点和设备文件系统类型),失败后调用mount程序挂载,这
次会尽量多的把参数传递过去(例如:mount -t vfat /dev/sda1 /media/sda1)
页:
[1]