2011-7-29 13:10:40

 

 

2011-7-29 13:10:40


platform_mmc_controller2

不见了 是不是恢复的时候电源没有打开?


硬件抽象层(Hardware Abstraction Layer,HAL)是一个守护进程,

它允许桌面应用程序即时读取硬件信息,这样,无论接口或设备类型如何,

应用程序都能找到并使用它们。用这种方法,图形界面以一种无缝、一致的模式为用户提供所有的资源。

关于热插拔

热插拔会发生很多事情,HAL只是其中一部分。当一个新设备被加入,例如插入一个U盘,会发生以下事情(粗略的):

内核获知此新设备并将其注册到/sys.

Udev创建一个设备节点(如/dev/sdb1),然后加载必需的驱动/模块。
HAL守护进程接到D-Bus的通知,将设备及其相关信息加入到数据库。
HAL通过D-Bus将新设备的加入这件事广播给所有订阅程序,如Thunar对此将在快捷边栏上显示图标,或者Metacity/Nautilus对此会在桌面添加一个图标。
可能还有其它监听程序,如卷管理器或者 AutoFS,它被配置为自动创建挂载点并挂载某些类型的驱动器, 当iPod插入时启动Rhythmbox ,等等。
 HAL并不检测硬件(内核)、管理设备或驱动(udev)或者自动挂载驱动器(卷管理器)。作为一个硬件抽象层(hardware abstraction layer),
 它的角色更象是一个通讯中心,为应用程序提供简洁的设备接口。热插拔设备无法正常检测、使用或挂载等问题要仔细研究调查,
 
 要知道它涉及了方方面面。(参看'疑难排解')。

关于卷挂载点

HAL在/media/某文件夹下挂载卷。 对于某文件夹的命名,它使用卷的标签(label),如果卷没有标签,它会使用卷的类型(type) (如果目录已存在则尾随数字),
例如/media/disk,、/media/disk-1 ...

要给分区命名一个标签,可以使用GParted(extra仓库中) ,或者KDE下的PartitionManager(AUR中)。

同时请留意以下挂载设备时常见的三个问题:

目录/media/label_of_your_volume必须不存在,它会由HAL自动创建和销毁。
设备必须没有写在fstab中,否则HAL将拒绝加载它。
你必须有权加载设备,详情参见 Permission Denied。

 

如果由于某些原因你无法给分区命名标签(label),可以设置个伪标签给HAL。你需要先准备好以下两项:

$device_uuid, 设备的uuid(ls -l /dev/disk/by-uuid/
$fake_label, 你选择的伪标签
将以下内容写入/etc/hal/fdi/policy/20-$device_name.fdi,别忘了把$device_uuid和$device_name替换为真正的内容。

File: /etc/hal/fdi/policy/20-$device_name.fdi
 <?xml version="1.0" encoding="UTF-8"?>
 <deviceinfo version="0.2">
    <device>
        <match key="volume.uuid" string="$device_uuid">
            <merge key="volume.label" type="string">$device_name</merge>
        </match>
    </device>
 </deviceinfo>
安装和配置HAL
一、安装
HAL要求守护进程dbus的存在,因此我们需要把它们两个都装上:

# pacman -S dbus hal

然后以root身份编辑/rc.conf文件,把hal添加到DAEMONS列,例如:

DAEMONS=(syslog-ng dbus hal network netfs ...)
现在DBUS和HAL守护进程就会在启动时加载了。由于如果dbus没有运行的话hal会自动加载它,这会导致关机时无法卸载,因此为免麻烦,DAEMONS列表里dbus应该排在hal前面。

注意:有些用户报告说这样设置会出问题。如果你发生问题的话,可以尝试先加载hal然后才dbus。

或者你也可以手动启动hal。以root身份输入以下命令:

# /etc/rc.d/hal start
为了让dbus和hal正常地发挥作用,本地用户必须是optical,storage组的成员。要实现这一点,打开终端,以root身份输入以下命令:

# gpasswd -a username optical
# gpasswd -a username storage
把“username“换成你的用户名(比如johndoe)

你必须完全注销并重新登录,这些用户组设置才会生效。

二、配置
权限策略
程序通过一个D-Bus接口同HAL进行交流。在这里定义很多接口,每个相关含有不同方式:存储设备接口,例如,有'弹出设备'和'关闭光驱'。

 为了能够'挂载'USB盘上的一个分区,你必须获取相关的D-bus接口(这个地方说的是'卷宗'volume)。

/etc/dbus-1/system.d/hal.conf这个配置文件包含了HAL-specific具体的特权。也就是哪些用户有权力访问哪些接口。

/etc/dbus-1/system.conf这个文件内容定义了用在D-bus接口上的例外的策略。简单来说,你需要查看你给用户访问DBUS/HAL接口的权力有哪些,

因为D-Bus默认是不会给你任何全权限的。

默认的hal.conf包含了一些允许和拒绝访问的策略,amongst them this default (the later of two defaults and therefore seemingly the deciding one):

File: /etc/dbus-1/system.d/hal.conf
 <!-- Default policy for the exported interfaces -->
 <policy context="default">
   <deny send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
   <deny send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
   <deny send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
   <deny send_interface="org.freedesktop.Hal.Device.Volume"/>
   <deny send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
 </policy>
简单的说,默认设置是用户被拒绝访问如挂载或者卸载卷的接口。下面的策略就是来让'power'和'storage'组用户访问特定设备的:

File: /etc/dbus-1/system.d/hal.conf
 <policy group="power">
   <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
   <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
 </policy>

 <policy group="storage">
   <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
   <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
 </policy>
这就是为什么你需要添加你的用户到这些组的原因(见'初始设置'),这样也可以减少自己设置配置文件的数量。

设备具体策略
NTFS写权限
如果你想在挂载NTFS文件系统时获得写入支持,你必须安装ntfs-3g然后添加如下内容到 /usr/share/hal/fdi/policy/10osvendor/20-ntfs-config-write-policy.fdi (不存在就新建)

<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
   <device>
       <match key="volume.fstype" string="ntfs">
           <match key="@block.storage_device:storage.hotpluggable" bool="true">
               <merge key="volume.fstype" type="string">ntfs-3g</merge>
               <merge key="volume.policy.mount_filesystem" type="string">ntfs-3g</merge>
               <append key="volume.mount.valid_options" type="strlist">locale=</append>
           </match>
       </match>
   </device>
</deviceinfo>
注意:GNOME自2.20版起使用ntfs-3g挂载ntfs分区,因此你不再需要添加这些了。

mount.ntfs链接
对hal>=0.5.10,上面的策略可能不起作用。这里有一个临时的办法可以强制hal使用ntfs-3g而不是标准的ntfs驱动。请注意,这个办法将会使你的系统中所有ntfs驱动器都使用ntfs-3g的驱动!作为root创建一个从mount.ntfs到ntfs-3g的软链接:

# ln -s /sbin/mount.ntfs-3g /sbin/mount.ntfs
这一做法可能引起的问题:

带有“-i“参数的mount命令会失效
可能与内核中的ntfs模块发生冲突
语言问题
Note: 这个问题在ntfs-3g 2009.1.1和更新的版本里不会发生。
如果你的文件名包含非拉丁字符的话可能会有问题。这是挂载程序没有正确地解析这些策略和语言项。以下是解决方案:

移除软链接: rm /sbin/mount.ntfs-3g
把它替换成包含如下内容的bash脚本:
File: /sbin/mount.ntfs-3g
 #!/bin/bash
 /bin/ntfs-3g $1 "$2" -o locale=en_US.UTF-8,$4  # put your own locale here
使它可执行:chmod +x /sbin/mount.ntfs-3g
添加到 /etc/pacman.conf
File: /etc/pacman.conf
...
 NoUpgrade = sbin/mount.ntfs-3g
...
对可移动设备开启noatime挂载选项
这可以加速文件操作,同时降低闪存设备如U盘、SD卡的损耗.

File: /etc/hal/fdi/policy/20-noatime-removable.fdi
<device>
  <match key="block.is_volume" bool="true">
    <match key="@block.storage_device:storage.hotpluggable" bool="true">
      <merge key="volume.policy.mount_option.noatime" type="bool">true</merge>
    </match>
    <match key="@block.storage_device:storage.removable" bool="true">
      <merge key="volume.policy.mount_option.noatime" type="bool">true</merge>
    </match>
  </match>
</device>
取消登录时自动挂载
如果要登录时取消自动挂载ntfs或者其它文件系统:

File: /etc/hal/fdi/policy/20-disable-automount.fdi
  <device>
    <match key="storage.hotpluggable" bool="false">
      <match key="storage.removable" bool="false">
        <merge key="storage.automount_enabled_hint" type="bool">false</merge>
      </match>
    </match>
  </device>
重启或启动HAL
要修改生效,需要重启hal

# /etc/rc.d/hal restart
疑难解答
Note: 所有修改需要用/etc/rc.d/hal restart重启HAL后才生效!
挂载失败
IsCallerPrivileged failed
如果你在没有使用KDM或者GDM的情况下,出现"IsCallerPriviliged failed"提示消息,可以试一下用ck-launch-session (包含在consolekit 软件包)来启动你的DE/WM。

例如对于startx/KDE,~/.xinitrc中原来的是:

exec startkde
那么新的写法就是:

exec ck-launch-session startkde
无法从Gnome挂在内部驱动器
如果你无法从Gnome挂在内部驱动器(在Nautilus中点击它们),可以打开System -> Preferences下的Authorizations,然后查看org.freedesktop.hal.storage,选择Mount file systems from internal drives,点击Edit,然后将Active Console改为Yes。

权限被拒绝
注意: 解决此问题的另一种方法可见I won the struggle against hal and policykit。它也有助于纠正掉电和系统关机的问题。

如果你是刚升级到的hal-0.5.11-7,突然出现用非root用户挂载设备发生以下这些错误导致失败:

"PermissionDeniedByPolicy mount-removable no"
"PermissionDeniedByPolicy mount-removable-extra-options no"
"org.freedesktop.hal.storage.mount-removable no <-- (action, result)"
"org.freedesktop.hal.storage.mount-removable-extra-options no <-- (action, result)"
可以编辑/etc/PolicyKit/PolicyKit.conf并粘帖以下内容到<config>段以解决这些问题:

File: /etc/PolicyKit/PolicyKit.conf
<match user="$user">
<!-- replace with your login or delete the line if you want to allow all users to manipulate devices (keep security issues in mind though) -->
 <match action="org.freedesktop.hal.storage.*">
  <return result="yes"/>
 </match>
 <match action="hal-storage-mount-fixed-extra-options">
 <!-- for internal devices mounted with extra options like a wished mount point -->
  <return result="yes" />
 </match>
 <match action="hal-storage-mount-removable-extra-options">
 <!-- for external devices mounted with extra options like a wished mount point -->
  <return result="yes" />
 </match>
</match> <!-- don't forget to delete this line if you deleted the first one -->
重启dbus和hal。如果你使用KDE的话还要一同重启KDE(否则设备通知器会出问题并停止响应)。作为这类问题的Hotfix这来自于Gullible Jones的"So long, Arch" 一贴,也许它不是最佳的修复方案(特别是对于很多用户的计算机),不过它的确能行得通。

Note: 请确认你象<match user="myuser"> and NOT like <match user="$myuser">这样输入你的用户名。
仍然不行
如果以上方法仍然不行,可以尝试以下“

 <match user="yourusername">
     <return result="yes"/>
 </match>
注意: 这将允许一切!

其它修复方式
如果你从.xinitrc中启动窗口管理器,请看"IsCallerPrivileged failed"中的第2项。


 

另一种修复方式
File: /etc/PolicyKit/PolicyKit.conf
<config version="0.1">
     <define_admin_auth user="USER"/>
</config>
其中USER是你的用户名。


 

File: ~.xinitrc
exec ck-launch-session window-manager
这将给予用户特定的管理员权限,它和hal和root用户的hal管理权限一样。

自动挂载失败
插入的CD/DVD不能被hal识别
如果插入的CD/DVD没有被hal识别(桌面上没有图标),检查/etc/fstab,移除可选驱动器的相关行。

如果不行,这可能是因为你的设备没有被HAl标记为自动挂载。我也不知道这是为什么,不过你可以编辑包含以下内容的/etc/hal/fdi/information/media-check-disable-storage_model_$YOUR_DEVICE.fdi:

File: /etc/hal/fdi/information/media-check-disable-storage_model_$YOUR_DEVICE.fdi
 <deviceinfo version="0.2">
   <device>
     <match key="info.udi" string="/org/freedesktop/Hal/devices/storage_model_DV$
       <merge key="storage.media_check_enabled" type="bool">false</merge>
     </match>
   </device>
 </deviceinfo>
如果key设为了false,那么你只需要把它改为true就行了。

USB闪盘/驱动器没有被正确地自动挂载
这段内容来自这个论坛.

 

如果你在自动挂载USB闪盘/驱动器时遭遇了麻烦,自动挂载CD、DVD却毫无问题,而且如果你可以手动挂载那些遇到麻烦的USB设备,
那么你应该在/etc/hal/fdi/policy中创建一个“preferences.fdi”文件,然后把下面这一行粘贴到文件中:

File: /etc/hal/fdi/policy/preferences.fdi
 <merge key="volume.ignore" type="bool">false</merge>
而且,如果你安装了gparted,可能还需要删除这个文件/usr/share/hal/fdi/policy/gparted-disable-automount.fdi 。在[1]这个帖子的末尾有人提到这一点。

同时你还得删除/etc/fstab行中相应的usb设备,hal会自动挂载它们。

移除U盘导致不正常卸载
如果你在没有卸载前移除你的U盘,HAL的自动卸载可能会工作不正常。

你会发现/media/.hal-mtab中相应的记录没有被删除,并且nautilus的设备列表(还有GNOME的桌面)会保留了指向设备曾经挂载过的空文件夹的链接。

这些都可以通过用延迟参数卸载U盘来解决。只要这么做:

1) 创建访问权限755的可执行脚本/usr/lib/hal/hal-unmount.sh,内容如下:

File: /usr/lib/hal/hal-unmount.sh
 #!/bin/sh
 # sanity check. DEVNAME should start with a /
 [ "$DEVNAME" != "${DEVNAME#/}" ] || exit 0
 # Lazily unmount drives which are removed, but still mounted
 if [ "$ACTION" = remove ] ; then
   if [ -x /usr/bin/pumount ] ; then
     /usr/bin/pumount -l "$DEVNAME";
   else
     /bin/umount -l "$DEVNAME";
   fi
 fi
 exit 0
2) 然后你得告诉HAL当你移除你的U盘时运行这个脚本。在/etc/udev/rules.d/90-hal.rules中加入以下内容:

File: /etc/udev/rules.d/90-hal.rules
 SUBSYSTEM=="block", ACTION=="remove", RUN+="/usr/lib/hal/hal-unmount.sh"
3) 执行重启

# /etc/rc.d/hal restart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值