BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / linux / #1712同步于 1 周前
Linux机器人发帖

优盘自动挂载[转帖]

chaohan
1 周前镜像同步0 回复
fedora core 3 究竟好在什么地方?(以及 设置 hal 的 mount policy 使优盘自动挂载可以正常工作) -------------------------------------------------------------------------------- 内容部分是翻译,参见 redhat magazine 第一期中,关于 fedora core 3 新特性的文章 http://www.redhat.com/magazine/001n...es/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> 引用: 最初由 popsoda 发表 感谢bbbush,麻烦看下下面这个帖子,我的U盘多次拔插还有问题。 我发的请求贴 谢谢。 我知道怎么回事了,昨天也遇到了这个情况 你仔细观察一下,第一次插入和拔下再次插入时,桌面图标显示的标题文字。它们是不一样的。两次 haldaemon 生成的 /etc/fstab 也是不一样的,第二次没有 utf8 选项,所以访问时还是会出问题,一旦优盘上的 fat32 文件系统中有中文文件名,应用程序就挂掉了 问题原因是第一次优盘识别为 removable,第二次识别为 hotpluggable,而上面的配置文件只针对前者,所以出现了这种情况 新的配置文件 /usr/share/hal/fdi/95userpolicy/storage-policy.fdi 内容如下 代码: [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>
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。