Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183380
  • 博文数量: 35
  • 博客积分: 762
  • 博客等级: 上士
  • 技术积分: 317
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-30 21:38
文章分类

全部博文(35)

文章存档

2015年(1)

2013年(3)

2012年(1)

2011年(30)

分类: LINUX

2011-06-24 11:02:03


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向上层桌面应用程序提交该硬件的信息.
桌面应用程序会根据这些属性值,做出相应的操作.如:设备若为块设备,则进行挂载等.

阅读(1458) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~