HAL (简体中文)

From ArchWiki

Jump to: navigation, search


i18n
English
Polish
Русский
简体中文

Contents

[edit] HAL总览

硬件抽象层(Hardware Abstraction Layer,HAL)是一个守护进程,它允许桌面应用程序即时读取硬件信息,这样,无论接口或设备类型如何,应用程序都能找到并使用它们。用这种方法,图形界面以一种无缝、一致的模式为用户提供所有的资源。

例如,HAL能收集可移动存储器的信息然后在桌面上创建一个图标让用户方便地读写。

[edit] 初始设置

HAL要求守护进程dbus的存在,因此我们需要把它们两个都装上。打开终端,以root身份输入:

# pacman -S dbus hal

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

DAEMONS=(syslog-ng hal network netfs ...)

现在hal守护进程就会在启动时加载了。hal会在初始化的时候检查并自动加载dbus,如果你的DAEMONS列表里有dbus,请移除它,因为那有可能引起麻烦。

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

# /etc/rc.d/hal start

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

# gpasswd -a username optical
# gpasswd -a username storage

把“username“换成你的用户名(比如johndoe)

如果你在把自己加到这些组之前已经启动了hal,那么你要把hal和dbus两者都重新启动以使这些变动生效。你可以用root身份输入:

# /etc/rc.d/dbus restart
# /etc/rc.d/hal restart

[edit] 策略

注意:自hal0.5.10起,不赞成这样做。

创建“/etc/hal/fdi/policy/preferences.fdi文件,用文本编辑器打开,插入:

 <?xml version="1.0" encoding="UTF-8"?> 
 <deviceinfo version="0.2">
 
   [RULE_1]
 
   [RULE_2]
 
 </deviceinfo>

把 [RULE_X] 替换成下面的规则(你需要的那些)

[edit] 带写入支持的NTFS文件系统的自动挂载(ntfs-3g)

如果你想在挂载NTFS文件系统时获得写入支持,你必须安装ntfs-3g然后添加这一规则:

   <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>

注意:GNOME自2.20版起使用ntfs-3g挂载ntfs分区,因此你不再需要添加这些了。

[edit] 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模块发生冲突

[edit] 语言问题

如果你使用KDE,含有非拉丁字符的文件名可能会是一个麻烦。之所以发生这样的问题,是因为KDE的挂载程序没有正确地解析这些策略和语言项。这里有一个临时的办法来解决:

1) 移除软链接“/sbin/mount.ntfs-3g"。代码:rm /sbin/mount.ntfs-3g

2) 把它替换成包含如下内容的bash脚本:

#!/bin/bash
/bin/ntfs-3g $1 $2 -o locale=en_US.UTF-8 #put your own locale here

3) 使它可执行: chmod +x /sbin/mount.ntfs-3g

这样,只有当你的分区名( partition labels)中含有空格时才会出现问题,因此,如果你使用这样的分区名,就把空格换成下划线,否则当你挂载它时就会出错。

注意:ntfs-3g每次升级时,这个脚本都会被新文件覆盖,所以请重复以上的过程。

[edit] 为ntfs-3g打开dmask和fmask

dmask和fmask是很有用的设定,它们为目录和文件设置不同的访问权限,比如:dmask=000,fmask=111将令目录对所有人可读,同时保持文件不可执行。

    <device>
        <match key="volume.fstype" string="ntfs">
            <append key="volume.mount.valid_options" type="strlist">dmask=</append>
            <append key="volume.mount.valid_options" type="strlist">fmask=</append>
        </match>
    </device>

[edit] 设置iPod的挂载点

如果你不告诉hal把ipod挂载到哪里,它就会根据你给ipod起的名字将其挂载到一个同名文件夹下。要改变这一点,必须给hal制定一个策略。

  <device>
    <match key="@block.storage_device:storage.model" string="iPod">
      <merge key="volume.policy.desired_mount_point" type="string">ipod</merge>
      <merge key="volume.policy.mount_option.iocharset=iso8859-15" type="bool">true</merge>
      <merge key="volume.policy.mount_option.sync" type="bool">true</merge>
    </match>
  </device>

[edit] 只自动挂载可移除设备

默认地,hal自动挂载所有没有被挂载到/etc/fstab的可用分区并为它们创建桌面图标。要跳过这种行为方式,只自动挂载可移除设备,只需添加规则:

 <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>

如果你使用KDE,设备被自动挂载了(比如它出现在Konquerer中)却没有出现在桌面上,打开控制中心-> Desktop -> Behavior -> Device Symbols(第三个标签)确认它的复选框是勾上的。

[edit] 在小于8G的设备上打开sync和noatime,在容量更大的设备上关闭它们

这么做可以防止小容量设备上(比如USB闪存)的数据损坏, 同时又提高了大容量设备的性能(假设1GB = 1000000000 byte).

 <device> 
   <match key="block.is_volume" bool="true">
     <match key="volume.size" compare_lt="8000000000">
       <match key="@block.storage_device:storage.hotpluggable" bool="true">
         <merge key="volume.policy.mount_option.sync" type="bool">true</merge>
         <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.sync" type="bool">true</merge>
         <merge key="volume.policy.mount_option.noatime" type="bool">true</merge>
       </match>
     </match>
     <match key="volume.size" compare_ge="8000000000">
       <match key="@block.storage_device:storage.hotpluggable" bool="true">
         <merge key="volume.policy.mount_option.sync" type="bool">false</merge>
         <merge key="volume.policy.mount_option.noatime" type="bool">false</merge>
       </match>
       <match key="@block.storage_device:storage.removable" bool="true">
         <merge key="volume.policy.mount_option.sync" type="bool">false</merge>
         <merge key="volume.policy.mount_option.noatime" type="bool">false</merge>
       </match>
     </match>
   </match>
 </device>

[edit] ... 最后

重启hal

# /etc/rc.d/hal restart

[edit] 疑难解答

[edit] Security error

如果系统识别出插入的CD/DVD并在桌面上创建了图标,但你却不能打开浏览这一设备,那么你可能需要让你的用户加入“storage”组。

适用于这样的情形:双击图标时弹出错误窗口,提示“A security policy prevents this sender from sending this message to this recipient...“

以root身份按照如下方法添加你的用户到“storage”组

gpasswd -a USERNAME storage

你可以这样来查看自己属于哪些组

groups USERNAME

作为补充,你还可以查看“/etc/group”文件,确认你的用户名被列在你希望从属于的组的名称之后,以此来验证自己属于某一特定的组。强烈推荐你这样做,因为有的时候虽然“groups USERNAME”显示你属于某一组,但这一情况却没有被反映在“/etc/group”文件中,这样你就不能获得该组的权限。

[edit] 插入的CD/DVD不能被hal识别

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

[edit] USB闪盘/驱动器没有被正确地自动挂载

这段内容来自这个论坛.

如果你在自动挂载USB闪盘/驱动器时遭遇了麻烦,自动挂载CD、DVD却毫无问题,而且如果你可以手动挂载那些遇到麻烦的USB设备,那么你应该在/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]

[edit] 另一个修复USB自动挂载的办法

来自Antix: 在我的SONY VGN-N365E笔记本上运行着XFCE,所有这些办法都不能解决自动挂载USB闪盘的问题。我编辑了/etc/dbus-1/system.d/hal.conf,把下面的“0”改成了我的用户名:

 <policy user="0">
   <allow send_interface="org.freedesktop.Hal.Device.SystemPowerManagement"/>
   <allow send_interface="org.freedesktop.Hal.Device.VideoAdapterPM"/>
   <allow send_interface="org.freedesktop.Hal.Device.LaptopPanel"/>
   <allow send_interface="org.freedesktop.Hal.Device.Volume"/>
   <allow send_interface="org.freedesktop.Hal.Device.Volume.Crypto"/>
 </policy>

现在所有的设备都能很好地挂载。

[edit] 使用PMount

如果你像我一样,发现以上的方法都不管用,你可以试试PMount。PMount是标准mount程序的一个周边,它允许普通用户挂载在/etc/fstab中没有对应条目的可移除设备。

# pacman -Sy pmount
Personal tools