当前位置导航:炫浪网>>网络学院>>操作系统>>Linux教程

设置fc3 HAL自动挂载优盘上的vfat分区

内容部分是翻译,参见 redhat magazine 第一期中,关于 fedora core 3 新特性的文章

http://www.redhat.com/magazine/001nov04/features/fedoracore3/

Meet Fedora Core 3
by Warren Togami and Colin Charles

* Introduction
* Desktop Improvements
* Behind the Desktop
* NetworkManager
* International Language Input
* Multimedia and Fun
* GCC
* Faster Updates
* Common Gotchas in Fedora Core 3
* Looking Ahead
* About the Authors

本来把文档翻译了一遍,但是在后台打开另一个网页时,firefox 挂掉了
本来还做了很多很多评注的。把大概意思说说

FC3 的新东西,包括 gnome-2.8, kernel-2.6.9, gcc-3.4.2 等等。(文中就是这样说的, 而论坛上大家关心的 fat32, ntfs, mp3, nvidia,fonts 等等几乎不可能成为自由软件的东西是永远不会出现的。)(所有其他发行版都会用到 redhat 在 linux 的开发中做出的贡献,并不是只有一个公司会受益。即使你使用别的发行版,也有一大半的组件是 redhat 的作品,那么用 fedora 有什么不好?)

fedora 中主要的新内容,是设备的即插即用。这一套并不是表面上可以看到的。它主要由 hotplug, udev, D-BUS, HAL, gamin 几个组件组成。
hotplug 是内核的一部分,在设备插入或拔出时,自动进行配置内核状态。udev 是 hotplug 的一部分,负责维护动态的 /dev 目录,使 /dev 目录的内容与当前系统状态一致。D-BUS 可以在应用程序之间传送消息,例如可以把“连接上一台打印机”的消息发送给 HAL。HAL 可以集成多种来源的信息,包括内核消息,配置文件等等,然后根据 D-BUS 的消息进行操 作。gamin 是改进的文件状态监视程序。
例如插入优盘。hotplug 自动加载需要的模块,udev 创建相应的 /dev/sda1 等等节点,hotplug 向 HAL 发消息,HAL 收到消息后,根据配置文件,它运行 fstab-sync 来修改 fstab,创建 /media 的子目录作为挂载点。gamin 检测到 fstab 发生变化之后,通知桌面系统。桌面系统在 “计算机” 项目中建立驱动器图标。
在拔出优盘时,与上面的过程类似,模块被卸载,设备文件被删除,fstab 中相应条目被删除,/media 目录下的挂载点也被删除了。
如果认为 autofs 或者手动 mount 比这个要简单,那么可以同时使用两个优盘,试试看哪个更好用。

这个过程非常有用,不同的设备都可以用这个过程,例如音乐 CD 放入光驱后,HAL 可以启动播放程序或者抓轨程序等等。另一个最重要的用途,在 redhat magazine 第三期中提到了,是 NetworkManager。因为使用移动无线通讯的用户可能会频繁更换网络的连接方式,只有用 hotplug 和 hal 等协作,才可能快速地作出反应,动态切换网络配置。

gnome-2.8 对于 gnome-2.6 的改进,体现在文件选择框上。只要按任意键,就会弹出简单 的搜索窗口,可以更快地找到自己需要的内容。如果按下 `/' 键,那么会跳出与在 nautilus 中按下 ctrl-l 一样的跳转位置框。

evolution-2.0 采用了 SpamAssassin,垃圾邮件的防范非常出色。另外还有 gpg 等等非常重要的功能。至于去掉的新闻功能,使用 firefox 的动态书签可以更方便.

忘了其他的了。
建议大家关心一下 redhat magazine 中关于 fedora 的内容,有些是非常精彩的!

设置 hal 的 mount policy 使优盘自动挂载可以正常工作

声明
部分转载并翻译自 redhat 网站,本文遵循 GNU FDL,仅正文部分可自由修改,重发布时正 文之外的部分必须同时原样发布。译者对未告知作者表示歉意,但对误读的后果表示不负责。

正文开始
由于 fc3 内核默认 fat32 文件系统字符编码是 ascii,如果优盘的文件名包含中文,那么在转换时会出问题,应用程序就会失去响应。具体的表现有多种,比如桌面假死,关机时提示无法卸载分区等等

解决的办法是在挂载时,根据语言环境 locale 的值,使用挂载参数。如果是 UTF-8 那么就用 mount -o utf8,如果是 GB* 那么就用 mount -o iocharset=cp936。但是这样繁琐地手动挂载就失掉了 FC3 的好处。正确的解决办法,是添加自己的配置文件,我的是这样

代码:
[yuan@jackycom ~/Desktop]$ cat /usr/share/hal/fdi/95userpolicy/storage-policy.fdi

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->



<deviceinfo version="0.2">

  <device>

    <match key="@block.storage_device:storage.removable" bool="true">

      <merge key="volume.policy.mount_option.fmask=111" type="bool">true</merge>

      <merge key="volume.policy.mount_option.dmask=0" type="bool">true</merge>

      <merge key="volume.policy.mount_option.users" type="bool">true</merge>

      <merge key="volume.policy.mount_option.utf8" type="bool">true</merge>

   </match>

    <match key="@block.storage_device:storage.hotpluggable" bool="true">

      <merge key="volume.policy.mount_option.fmask=111" type="bool">true</merge>

      <merge key="volume.policy.mount_option.dmask=0" type="bool">true</merge>

      <merge key="volume.policy.mount_option.users" type="bool">true</merge>

      <merge key="volume.policy.mount_option.utf8" type="bool">true</merge>

   </match>

  </device>

</deviceinfo>
原理正如上面所说,hal 在收到优盘插入的通知时,将读取这些 storage policy 配置文件。在改写 /etc/fstab 时,将用到配置文件中的数据,将这些 mount_option 全部加入 fstab 中去。

如何测试效果
测试效果的办法简单得很,但是不要急着插入优盘,而是应当先运行
代码:
service haldaemon restart
然后插入优盘。几秒钟之后,桌面上会出现优盘图标。看看你的 fstab,如果多了这样一行
代码:
/dev/sda1               /media/YUAN             vfat    pamconsole,utf8,users,dmask=0,fmask=111,noatime,sync,fscontext=system_u:object_r:removable_t,exec,noauto,managed 0 0
那么说明没什么问题。也许你的系统中 selinux 已经被关闭了,所以参数没有这么长。访问优盘,应该不会再出错了。

可能的问题
如果你的语言环境是 gb2312,那么要把上面的配置文件稍微修改一下,把两次出现的 utf8 修改为 iocharset=cp936
小心配置文件中的拼写错误
如果仍然会挂起或死机,那么可能 haldaemon 没有重启动,甚至可能被关闭了。运行
代码:
chkconfig haldaemon on

chkconfig messagebus on

service messagebus restart

service haldaemon restart
命令的可重复性
不要手动修改 /etc/fstab,所有修改都会被丢弃掉,应该只修改 hal 的配置文件
因为我们只新建了一个配置文件,然后重启了一个服务,因此可重复性应该很好。配置文件中的选项如果发生冲突,据说将使用读取时靠后的一个,也就是说 95userpolicy 将比 90defaultpolicy 后读取?

与其他方案的兼容性
autofs 修改的是 /etc/auto.misc 和 /etc/auto.master,不会有冲突
手动挂载,或手动修改 /etc/fstab, 在重启后都将失效,因为 haldaemon 将接管 fstab 文件,除非在 fstab 中加入选项 unmanaged (?)

如何回退到最初的状态
因为只添加了一个配置文件,因此只要将它删除就可以了。另外最好执行一次
代码:
service haldaemon restart
正文结束

后记

这篇文档中的配置文件已经没有意义了,因为它的主要目的是添加 utf8 选项,而新版本的 hal 中已经包含了这个配置。并且,新版本的配置文件中使用 volume.fstype 作为匹配时的关键字,具有更好的通用性,当优盘是其他格式时仍然可用。代码如下,节选自新的 90defaultpolicy/storage-policy.fdi
代码:
          <!-- Use UTF-8 charset for vfat -->

          <match key="volume.fstype" string="vfat">

            <merge key="volume.policy.mount_option.iocharset=utf8" ype="bool">true</merge>

          </match>
所以仿照这个文件,将自定义的策略文件 /usr/share/hal/fdi/95userpolicy/storage-policy.fdi 修改如下
代码:
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->



<deviceinfo version="0.2">

  <device>

    <match key="block.is_volume" bool="true">

      <match key="volume.fsusage" string="filesystem">

        <match key="volume.fstype" string="vfat">

          <merge key="volume.policy.mount_option.fmask=111" type="bool">true</merge>

          <merge key="volume.policy.mount_option.dmask=0" type="bool">true</merge>

          <merge key="volume.policy.mount_option.users" type="bool">true</merge>

          <merge key="volume.policy.mount_option.utf8" type="bool">true</merge>

        </match>

      </match>

    </match>

  </device>

</deviceinfo>
update:
在新的 hal-0.50 中,配置文件的位置发生了变化,因此如果以前做过上面所说的设置,那么必须在安装之后,将 /usr/share/hal/fdi/95userpolicy 移动到 policy 子目录中,也就是说,移动后成为 /usr/share/hal/fdi/policy/95userpolicy 目录
如果以前没有做过任何设置,那么只要新建 /usr/share/hal/fdi/policy/95userpolicy 目录,并按照上面的内容复制配置文件就可以了
相关内容
赞助商链接