Difference between revisions of "HAL (简体中文)"

From ArchWiki
Jump to: navigation, search
(rm temporary i18n template)
(Redirect two systemd method.)
 
Line 1: Line 1:
[[Category:Hardware detection and troubleshooting (简体中文)]]
+
#REDIRECT [[udev (简体中文)#Running HAL]]
[[Category:Daemons and system services (简体中文)]]
 
[[Category:简体中文]]
 
[[en:HAL]]
 
[[es:HAL]]
 
[[it:HAL]]
 
[[pl:HAL]]
 
[[ru:HAL]]
 
[[tr:Ana_sayfa]]
 
{{Article summary start}}
 
{{Article summary text|HAL的安装,配置以及常见问题解答}}
 
{{Article summary end}}
 
{{注意|目前 HAL [http://lists.freedesktop.org/archives/hal/2008-May/011560.html 不推荐使用],已经被官方仓库移除。现在使用 [[udev]]/[[PolicyKit]] 来代替.}}
 
 
 
HAL 已经被诸如udev,udisks,upower这些程序替代,当前一些小型的程序依旧依赖和使用HAL,但是HAL必将逐渐淡出人们的视野。
 
 
 
=介绍=
 
'''HAL''' (Hardware Abstraction Layer 硬件抽象层) 是一个守护进程,他允许桌面程序方便的获取硬件信息,而不需要知道具体的硬件细节信息,这种无缝统一管理硬件的方法非常方便。
 
==关于热插拔==
 
热插拔会发生很多事情,HAL只是其中一部分。当一个新设备被加入,例如插入一个U盘,会发生以下事情(粗略的):
 
* 内核获知此新设备并将其注册到{{ic|/sys}}.
 
* [[Udev]]创建一个设备节点(如{{ic|/dev/sdb1}}),然后加载必需的驱动/模块。
 
* HAL守护进程接到[[D-Bus]]的通知,将设备及其相关信息加入到数据库。
 
* HAL通过D-Bus将新设备的加入这件事广播给所有订阅程序,如Thunar对此将在快捷边栏上显示图标,或者Metacity/Nautilus对此会在桌面添加一个图标。
 
* 可能还有其它监听程序,如卷管理器或者[[autofs | AutoFS]],它被配置为自动创建挂载点并挂载某些类型的驱动器, 当iPod插入时启动Rhythmbox ,等等。
 
 
 
HAL并不检测硬件(内核)、管理设备或驱动(udev)或者自动挂载驱动器(卷管理器)。作为一个硬件抽象层('''h'''ardware '''a'''bstraction '''l'''ayer),它的角色更象是一个通讯中心,为应用程序提供简洁的设备接口。热插拔设备无法正常检测、使用或挂载等问题要仔细研究调查,要知道它涉及了方方面面。(参看'疑难排解')。
 
 
 
==关于卷挂载点==
 
HAL在{{ic|/media/''某文件夹''}}下挂载卷。 对于''某文件夹''的命名,它使用卷的'''标签(label)''',如果卷没有标签,它会使用卷的'''类型(type)''' (如果目录已存在则尾随数字),例如{{ic|/media/disk}},、{{ic|/media/disk-1}} ...
 
 
 
要给分区命名一个标签,可以使用'''GParted'''(extra仓库中) ,或者KDE下的'''PartitionManager'''([[AUR]]中)。
 
 
 
同时请留意以下挂载设备时常见的三个问题:
 
*目录{{ic|/media/''label_of_your_volume''}}必须'''不'''存在,它会由HAL自动创建和销毁。
 
*设备必须'''没有'''写在fstab中,否则HAL将拒绝加载它。
 
*你必须有权加载设备,详情参见 [[#Permission Denied|Permission Denied]]。
 
 
 
如果由于某些原因你'''无法'''给分区命名标签(label),可以设置个伪标签给HAL。你需要先准备好以下两项:
 
* '''$device_uuid''', 设备的uuid({{Ic|ls -l /dev/disk/by-uuid/}}
 
* '''$fake_label''', 你选择的伪标签
 
 
 
将以下内容写入{{ic|/etc/hal/fdi/policy/20-'''$device_name'''.fdi}},别忘了把'''$device_uuid'''和'''$device_name'''替换为真正的内容。
 
{{hc|/etc/hal/fdi/policy/20-$device_name.fdi|2=<nowiki>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<deviceinfo version="0.2">
 
    <device>
 
        <match key="volume.uuid" string="</nowiki>'''$device_uuid'''<nowiki>">
 
            <merge key="volume.label" type="string"></nowiki>'''$device_name'''<nowiki></merge>
 
        </match>
 
    </device>
 
</deviceinfo>
 
</nowiki>}}
 
 
 
=安装和配置HAL=
 
==一、安装==
 
目前官方仓库已经停止支持HAL,但是{{AUR|hal}}依旧被[[AUR]]所支持.
 
{{注意| 如果你安装有yaourt,可以这样安装:
 
# yaourt -S dbus hal
 
}}
 
然后以root身份编辑''/rc.conf''文件,通常有两种方配置方法:
 
'''方法一:手动添加全部'''
 
DAEMONS=(syslog-ng '''dbus hal''' network netfs ...)
 
现在DBUS和HAL守护进程就会在启动时加载了。
 
'''方法二:只添加HAL'''
 
默认情况下,HAL会自动检测并运行dbus。
 
DAEMONS=(syslog-ng '''hal''' network netfs ...)
 
{{注意| 有一些用户反应在使用方法二之后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进行交流。在这里定义很多[http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interfaces 接口],每个相关含有不同方式:存储设备接口,例如,有'弹出设备'和'关闭光驱'。 为了能够'挂载'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):
 
{{hc|/etc/dbus-1/system.d/hal.conf|2=<nowiki>
 
<!-- 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>
 
</nowiki>}}
 
简单的说,默认设置是用户被拒绝访问如挂载或者卸载卷的接口。下面的策略就是来让'power'和'storage'组用户访问特定设备的:
 
{{hc|/etc/dbus-1/system.d/hal.conf|2=<nowiki>
 
<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>
 
</nowiki>}}
 
 
 
这就是为什么你需要添加你的用户到这些组的原因(见'初始设置'),这样也可以减少自己设置配置文件的数量。
 
 
 
===设备具体策略===
 
 
 
====NTFS写权限====
 
如果你想在挂载NTFS文件系统时获得写入支持,你必须安装[[NTFS Write Support|ntfs-3g]]然后添加如下内容到 /usr/share/hal/fdi/policy/10osvendor/20-ntfs-config-write-policy.fdi (不存在就新建)
 
 
 
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
 
<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模块发生冲突
 
 
 
==== 语言问题 ====
 
{{注意|这个问题在ntfs-3g 2009.1.1和更新的版本里不会发生。}}
 
 
 
如果你的文件名包含非拉丁字符的话可能会有问题。这是挂载程序没有正确地解析这些策略和语言项。以下是解决方案:
 
 
 
* 移除软链接: {{Ic|rm /sbin/mount.ntfs-3g}}
 
* 把它替换成包含如下内容的bash脚本:
 
{{hc|/sbin/mount.ntfs-3g|2=<nowiki>
 
#!/bin/bash
 
/bin/ntfs-3g $1 "$2" -o locale=</nowiki>'''en_US.UTF-8'''<nowiki>,$4  # put your own locale here
 
</nowiki>}}
 
* 使它可执行:{{Ic|chmod +x /sbin/mount.ntfs-3g}}
 
* 添加到 /etc/pacman.conf
 
{{hc|/etc/pacman.conf|2=<nowiki>
 
...
 
NoUpgrade = sbin/mount.ntfs-3g
 
...
 
</nowiki>}}
 
 
 
====对可移动设备开启noatime挂载选项====
 
这可以加速文件操作,同时降低闪存设备如U盘、SD卡的损耗.
 
{{hc|/etc/hal/fdi/policy/20-noatime-removable.fdi|2=<nowiki>
 
<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>
 
</nowiki>}}
 
 
 
====取消登录时自动挂载====
 
如果要登录时取消自动挂载ntfs或者其它文件系统:
 
{{hc|/etc/hal/fdi/policy/20-disable-automount.fdi|2=<nowiki>
 
  <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>
 
</nowiki>}}
 
 
 
===重启或启动HAL===
 
 
 
要修改生效,需要重启hal
 
# /etc/rc.d/hal restart
 
 
 
=疑难解答=
 
{{注意|所有修改需要用{{Ic|/etc/rc.d/hal restart}}重启HAL后才生效!}}
 
 
 
==挂载失败==
 
===IsCallerPrivileged failed===
 
如果你在没有使用KDM或者GDM的情况下,出现"IsCallerPriviliged failed"提示消息,可以试一下用ck-launch-session (包含在'''consolekit''' 软件包)来启动你的DE/WM。
 
 
 
例如对于startx/KDE,{{ic|~/.xinitrc}}中原来的是:
 
exec startkde
 
那么新的写法就是:
 
exec ck-launch-session startkde
 
如果还不行,那么请尝试:
 
exec ck-launch-session dbus-launch startkde
 
 
 
===无法从Gnome挂在内部驱动器===
 
如果你无法从Gnome挂在内部驱动器(在Nautilus中点击它们),可以打开System -> Preferences下的Authorizations,然后查看org.freedesktop.hal.storage,选择Mount file systems from internal drives,点击Edit,然后将Active Console改为Yes。
 
 
 
===权限被拒绝===
 
'''注意:''' 解决此问题的另一种方法可见[https://bbs.archlinux.org/viewtopic.php?id=65070 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)"
 
可以编辑{{ic|/etc/PolicyKit/PolicyKit.conf}}并粘帖以下内容到<config>段以解决这些问题:
 
{{hc|/etc/PolicyKit/PolicyKit.conf|2=<nowiki>
 
<match user="</nowiki>'''$user'''<nowiki>">
 
<!-- 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 -->
 
</nowiki>}}
 
重启dbus和hal。如果你使用KDE的话还要一同重启KDE(否则设备通知器会出问题并停止响应)。作为这类问题的Hotfix这来自于Gullible Jones的"So long, Arch" 一贴,也许它不是最佳的修复方案(特别是对于很多用户的计算机),不过它的确能行得通。
 
 
 
{{注意|请确认你象{{Ic|<match user<nowiki>=</nowiki>"myuser">}} and NOT like {{Ic|<match user<nowiki>=</nowiki>"$myuser">}}这样输入你的用户名。}}
 
 
 
====仍然不行====
 
 
 
如果以上方法仍然不行,可以尝试以下“
 
 
 
  <match user="yourusername">
 
      <return result="yes"/>
 
  </match>
 
 
 
注意: 这将允许一切!
 
 
 
====其它修复方式====
 
 
 
如果你从.xinitrc中启动窗口管理器,请看"IsCallerPrivileged failed"中的第2项。
 
 
 
====另一种修复方式====
 
 
 
{{hc|/etc/PolicyKit/PolicyKit.conf|2=<nowiki>
 
<config version="0.1">
 
    <define_admin_auth user="USER"/>
 
</config>
 
</nowiki>}}
 
 
 
其中USER是你的用户名。
 
 
 
{{hc|~.xinitrc|<nowiki>
 
exec ck-launch-session window-manager
 
</nowiki>}}
 
 
 
这将给予用户特定的管理员权限,它和hal和root用户的hal管理权限一样。
 
 
 
==自动挂载失败==
 
===插入的CD/DVD不能被hal识别===
 
如果插入的CD/DVD没有被hal识别(桌面上没有图标),检查{{ic|/etc/fstab}},移除可选驱动器的相关行。
 
 
 
如果不行,这可能是因为你的设备没有被HAl标记为自动挂载。我也不知道这是为什么,不过你可以编辑包含以下内容的{{ic|/etc/hal/fdi/information/media-check-disable-storage_model_'''$YOUR_DEVICE'''.fdi}}:
 
{{hc|/etc/hal/fdi/information/media-check-disable-storage_model_'''$YOUR_DEVICE'''.fdi|2=<nowiki>
 
<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>
 
</nowiki>}}
 
如果key设为了false,那么你只需要把它改为true就行了。
 
 
 
==USB闪盘/驱动器没有被正确地自动挂载==
 
这段内容来自[https://bbs.archlinux.org/viewtopic.php?pid=248224| 这个论坛].
 
 
 
如果你在自动挂载USB闪盘/驱动器时遭遇了麻烦,自动挂载CD、DVD却毫无问题,而且如果你可以手动挂载那些遇到麻烦的USB设备,那么你应该在/etc/hal/fdi/policy中创建一个“preferences.fdi”文件,然后把下面这一行粘贴到文件中:
 
{{hc|/etc/hal/fdi/policy/preferences.fdi|2=<nowiki>
 
<merge key="volume.ignore" type="bool">false</merge>
 
</nowiki>}}
 
 
 
而且,如果你安装了gparted,可能还需要删除这个文件{{ic|/usr/share/hal/fdi/policy/gparted-disable-automount.fdi}} 。
 
在[https://bbs.archlinux.org/viewtopic.php?pid=310284]这个帖子的末尾有人提到这一点。
 
 
 
同时你还得删除{{ic|/etc/fstab}}行中相应的usb设备,hal会自动挂载它们。
 
 
 
==移除U盘导致不正常卸载==
 
如果你在没有卸载前移除你的U盘,HAL的自动卸载可能会工作不正常。
 
 
 
你会发现{{ic|/media/.hal-mtab}}中相应的记录没有被删除,并且nautilus的设备列表(还有GNOME的桌面)会保留了指向设备曾经挂载过的空文件夹的链接。
 
 
 
这些都可以通过用延迟参数卸载U盘来解决。只要这么做:
 
 
 
1) 创建访问权限755的可执行脚本{{ic|/usr/lib/hal/hal-unmount.sh}},内容如下:
 
{{hc|/usr/lib/hal/hal-unmount.sh|2=<nowiki>
 
#!/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
 
</nowiki>}}
 
2) 然后你得告诉HAL当你移除你的U盘时运行这个脚本。在{{ic|/etc/udev/rules.d/90-hal.rules}}中加入以下内容:
 
{{hc|/etc/udev/rules.d/90-hal.rules|2=<nowiki>
 
SUBSYSTEM=="block", ACTION=="remove", RUN+="/usr/lib/hal/hal-unmount.sh"
 
</nowiki>}}
 
 
 
3) 执行重启
 
# /etc/rc.d/hal restart
 
 
 
=外部链接=
 
*[http://people.freedesktop.org/~david/hal-spec/hal-spec.html HAL 0.5.10 specifications] - 一个完整的HAL规范和指引。
 
*[http://dventurin.blogspot.com/2007/04/udev-hal-dbus.html Dam's blog] - An attempt to clarify the division of labor among the kernel, udev, D-Bus and HAL with links to HOWTOs and FAQs on each.
 
*[http://people.freedesktop.org/~david/talks/dynamic-device-handling-OLS-2006.pdf Dynamic Device Handling (pdf)] - 一份关于设备处理的文稿。
 

Latest revision as of 09:44, 12 April 2013