freedesktop.org是一个开源项目,他主要针对X-Window系统进行一些技术开发.它们旨在
为Linux/Unix平台的桌面软件建立一个基础平台.使桌面软件在其上层运行.HAL就是这个
项目中的一个软件,HAL的全称是”硬件抽象层(Hardware Abstraction Layer)".它位于操作
系统和桌面软件之间,负责将硬件信息传递给上层的桌面软件.
现在可以连接到Linux上的设备种类繁多,为了可以正常使用这些设备,用户需要有一定的技
术水平才可以.HAL就是为了简化这种操作,将硬件信息分析汇总后,提交给上层桌面软件.桌面
软件根据这些信息,可以判断这个硬件设备的类别和属性,进行相应的操作.从而简化用户自己
去操作的过程.
例如,你在桌面状态下,插入一个U盘后,你会发现,U盘被自动挂载到了/media/usbdisk下,桌面
上还会打开一个窗口,显示U盘中的内容.这个自动挂载功能的实现,就依赖于HAL.
并且,用户可以编制自己的HAL规则,为不同的设备指定不同的实现方法.
Turbolinux 10,10.5和11版本,默认会安装HAL软件包.你也可以手动安装:
# rpm -ivh hal-<版本号>.rpm
你也可以从官方网站下载源码包进行安装.
需要下载2个包,hal和hal-info.hal-info中保存有硬件信息库,hal要使用它来识别
硬件设备.
我们下载了hal-0.5.9.rc3.tar.gz和hal-info-20070618.tar.gz包.
# tar zxf hal-0.5.9.rc3.tar.gz
# cd hal-0.5.9
# ./configure
# make
# make install
# tar zxf hal-info-20070618.tar.gz
# cd hal-info-20070618
# ./configure
# make
# make install
HAL规则保存在/etc/hal/fdi/policy和/usr/share/hal/fdi/policy下.下面是一个策略文件的例子.
true
true
… 作为一个设备策略的范围.里面填写针对某个设备的处理策略.
… 指定与这个策略相匹配的设备的各个属性值.
… 指定针对这个设备,所设置的特殊属性值.
上面的例子的主要目的是:
,如果设备是一个分区.
,容量小于3G.
是一个可插拔的块设备.
true
true
则设置它的mount选项为sync和noatime.
设置的新属性会和硬件信息一起传送到上层桌面软件,桌面软件根据这些信息,进行相应的mount操作.
现在我们在Turbolinux 10.5系统上,编写一个简单的策略.
先将1个U盘插入计算机,然后执行:
# lshal
...
udi = '/org/freedesktop/Hal/devices/volume_uuid_ec8a6f04_b689_4391_a888_cec22928ab29'
volume.unmount.valid_options = {'lazy'} (string list)
volume.mount.valid_options = {'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'noexec', 'quiet', 'remount', 'exec', 'data='} (string list)
org.freedesktop.Hal.Device.Volume.method_execpaths = {'hal-storage-mount', 'hal-storage-unmount', 'hal-storage-eject'} (string list)
org.freedesktop.Hal.Device.Volume.method_argnames = {'mount_point fstype extra_options', 'extra_options', 'extra_options'} (string list)
org.freedesktop.Hal.Device.Volume.method_signatures = {'ssas', 'as', 'as'} (string list)
org.freedesktop.Hal.Device.Volume.method_names = {'Mount', 'Unmount', 'Eject'} (string list)
info.interfaces = {'org.freedesktop.Hal.Device.Volume'} (string list)
volume.ignore = false (bool)
info.udi = '/org/freedesktop/Hal/devices/volume_uuid_ec8a6f04_b689_4391_a888_cec22928ab29' (string)
volume.partition.flags = {} (string list)
volume.partition.uuid = '' (string)
volume.partition.label = '' (string)
volume.partition.type = '0x83' (string)
volume.partition.scheme = 'mbr' (string)
info.product = 'Volume (ext3)' (string)
volume.partition.media_size = 1047789056 (0x3e73fe00) (uint64)
volume.partition.start = 31232 (0x7a00) (uint64)
volume.size = 1047115264 (0x3e69b600) (uint64)
volume.num_blocks = 2045147 (0x1f34db) (int)
volume.block_size = 512 (0x200) (int)
...
找到包含sdc1的段落(我的U盘在系统上识别为sdc设备).这个段落显示的是这个硬件的各种信息.
我们根据硬件的容量值(volume.size = 1047115264),编写策略.
vi /usr/share/hal/fdi/policy/10generic/test.fdi
# 填写下面内容:
true
true
1g
策略说明:
block.is_volume 如果这个设备是一个可以被mount的块设备.
volume.fsusage 并且块设备包含有一个文件系统.
volume.size 文件系统的容量为1047115264字节.
volume.policy.mount_option.sync
添加mount选项sync.
volume.policy.mount_option.noatime
添加mount选项noatime.
volume.policy.desired_mount_point
指定设备mount点是"/media/1g"
在/media下建立1g目录.
# mkdir /media/1g
在桌面环境下,将U盘插入计算机.桌面系统会根据HAL策略将设备挂载到/media/1g下,并打开
一个窗口.
当系统中有新设备连接时,sysfs会通过D-BUS系统信息总线来广播这个消息,并在/sys下建立
该设备的硬件信息.udev会在/dev下建立该设备的设备文件.HAL也会接收到这个信息,它会检查/sys
下的文件,获得硬件信息.然后根据HAL策略,通过D-BUS向上层桌面应用程序提交该硬件的信息.
桌面应用程序会根据这些属性值,做出相应的操作.如:设备若为块设备,则进行挂载等.