LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6987|回复: 31

[LFS 幻想系列] 使用 HAL/ivman 为 fstab 中自动添加记录 以及 自动加载。

[复制链接]
发表于 2005-11-24 06:40:44 | 显示全部楼层 |阅读模式
看大家都用HAL了,我也顺便看看。今天正好有时间。搜索了无数网页后,基本上搞定了。

这部分是添加fstab 记录。第二部分是自动加载。

一开始用,有3个主要问题:
1。managed参数不被mount识别。需要patch!
2。中文不被支持。主要体现在需要加入 iocharset 等参数。
3。安全问题,普通用户无法mount等。参数 exec, users 等的修改。

解决方案的步骤:

1。自动添加记录。

A. 按照 LFS/BLFS 安装HAL,DBUS等。

B. 给 util-linux 打补丁,重装一次。经测试util-linux-2.12.r也可以用这个补丁。
主要是给mount加上对managed参数的支持。该参数是HAL用的。

  1. --- util-linux-2.12a/mount/mount.c.sopwith        2004-03-04 20:28:22.000000000 -0500
  2. +++ util-linux-2.12a/mount/mount.c        2004-07-16 16:50:18.792814782 -0400
  3. @@ -191,6 +191,8 @@
  4.    { "diratime",        0, 1, MS_NODIRATIME },        /* Update dir access times */
  5.    { "nodiratime", 0, 0, MS_NODIRATIME },        /* Do not update dir access times */
  6. #endif
  7. +  { "kudzu", 0, 0, MS_COMMENT },                /* Silently remove this option (backwards compat use only - deprecated) */
  8. +  { "managed", 0, 0, MS_COMMENT },                /* Silently remove this option */
  9.    { NULL,        0, 0, 0                }
  10. };
复制代码


C. 修改/添加 HAL 的 policy 文件。
在 /usr/share/hal/fdi/policy 建立目录 95userdirectory
然后95目录在里边添加文件 95-user-policy.fdi。内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
  2. <deviceinfo version="0.2">
  3.   <!-- User specif policies merged onto computer root object  -->
  4.   <device>
  5.     <match key="info.udi" string="/org/freedesktop/Hal/devices/computer">
  6.       <merge key="storage.policy.default.mount_option.exec" type="bool">false</merge>
  7.       <merge key="storage.policy.default.mount_option.pamconsole" type="bool">false</merge>
  8.     </match>

  9.     <match key="volume.fstype" string="vfat">
  10.       <merge key="volume.policy.mount_option.users" type="bool">true</merge>
  11.       <merge key="volume.policy.mount_option.quiet" type="bool">true</merge>
  12.       <merge key="volume.policy.mount_option.sync" type="bool">false</merge>
  13.       <merge key="volume.policy.mount_option.codepage=936" type="bool">true</merge>
  14.       <merge key="volume.policy.mount_option.iocharset=utf8" type="bool">true</merge>
  15.       <merge key="volume.policy.mount_option.dmask=022" type="bool">true</merge>
  16.       <merge key="volume.policy.mount_option.fmask=033" type="bool">true</merge>
  17.       <merge key="volume.policy.mount_option.uid=1000" type="bool">true</merge>
  18.       <merge key="volume.policy.mount_option.gid=100" type="bool">true</merge>
  19.     </match>
  20.   </device>
  21. </deviceinfo>
复制代码

里边的 uid , gid, iocharset 等参数的内容,自己修改。我去掉了默认的exec和pamconsole。因为exec不安全,pamconsole不被识别。

D.重启 HAL。
/etc/rc.d/init.d/haldaemon restart

E. 测试。
插一个USB盘,就可以看到fstab里边多了一条记录,而且/media目录里边多了一个usbdisk目录。

相关的日志:
user.log:
fantasy scsi.agent[2009]: disk at /devices/pci0000:00/0000:00:02.1/usb1/1-2/1-2:1.0/host16/target16:0:0/16:0:0:0
fantasy fstab-sync[2079]: added mount point /media/usbdisk for /dev/sdk1
fantasy kernel: usb 1-2: USB disconnect, address 11
fantasy fstab-sync[2163]: removed mount point /media/usbdisk for /dev/sdk1

fstab里边自动出现的记录:
/dev/sdk1               /media/usbdisk          vfat    users,noauto,gid=100,uid=1000,fmask=033,dmask=022,iocharset=utf8,codepage=936,quiet,managed 0 0



3。自动加载的设置。

A。首先下载 ivman 并且安装。(我用的是 ivman-0.6.6)
./configure --prefix=/usr --sysconfdir=/etc
make
make install

B。bootscripts 里边加入 ivman 的启动。以下是部分截取。
  1. case "${1}" in
  2.         start)
  3.                 boot_mesg "Starting Ikke's Volume Manager (ivman) ..."
  4.                 loadproc /usr/bin/ivman -s
  5.                 ;;

  6.         stop)
  7.                 boot_mesg "Stopping Ikke's Volume Manager (ivman) ..."
  8.                 killproc /usr/bin/ivman
  9.                 ;;

  10.         restart)
  11.                 ${0} stop
  12.                 sleep 3
  13.                 ${0} start
  14.                 ;;

  15.         status)
  16.                 statusproc /usr/bin/ivman
  17.                 ;;

  18.         *)
  19.                 echo "Usage: ${0} {start|stop|restart|status}"
  20.                 exit 1
  21.                 ;;
  22. esac
复制代码


C。设置 ivman 的文件。
IvmConfigActions.xml:当设备插入拔出的时候,Ivman 就会参照这个文件运行相应的命令。
IvmConfigBase.xml:设置 Ivman 的基础属性。如启动延迟,初次扫描等。
IvmConfigConditions.xml:硬件情况出现变化的时候,就参考这个文件里边的内容。比如按下电源键的时候,hal产生一个信号,ivman 可以捕捉到,运行相应的命令。
IvmConfigProperties.xml: 设备属性变化的时候,就参考这个文件。

具体的请看文件里边的例子和 man 文档。

我的文件都打包在附件里边,解压后放在 /etc/ivman 里边。主要实现的是 cdrom/USB 插入的时候,自动mount。USB 拔出的时候最好手动 umount,CDROM 则不用,可以自动umount。


转载请保持完整,并注明出处。

by 终极幻想@LinuxSir.Org

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2005-11-24 06:42:23 | 显示全部楼层
沙发!做到BLFS
回复 支持 反对

使用道具 举报

发表于 2005-11-24 12:38:50 | 显示全部楼层
lfs-dev的bootscript用udev做hotplug事件的处理daemon,
而现在的udev有bug,不能将hotplug事件传递到hal等处理程序。我之前也研究过hotplug处理过程,发现采用hal无法做到u盘自动mount。我是用automount搞掂的。automount不涉及hotplug,只监视对mount point的访问。也能达到u盘自动mount。同时automount还能超时自动umount,很合适u盘这种移动设备。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-24 13:10:20 | 显示全部楼层
udev我用的是 071。我没用automount。

研究了1个晚上,成果:

DBUS + HAL + ivman 实现动态加载 usb 盘,自动创建mount的目录。插几个,就加几个!(实验中用了2个U盘。)
cdrom实现自动mount,随时按弹出键不影响,不过不能动态加载cdrom(也没这个机会。嘿嘿)。
回复 支持 反对

使用道具 举报

发表于 2005-11-24 19:51:41 | 显示全部楼层
怕的就是u盘。linux用了延迟写技术,如果没有umount就拔掉u盘会造成数据丢失。
实际上实现u盘自动加载不需要使用DBUS和HAL,使用hotplug script就完全足够了。
DBUS和HAL的主要意义是提供一个设备无关的硬件抽象层。提供给X或其他软件使用。
现在问题是udev做hotplug事件的daemon时无法将hotplug事件传递给hotplug script 或者HAL。

automount虽然不能在设备插入时自动mount,但是能在你访问设定的加载点时挂上相应的设备。
而且当一段时间不访问加载点后又会自动卸载掉相应设备,这样不容易造成数据丢失。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-25 00:56:41 | 显示全部楼层
1。关于umount这个问题,我试过了,只要别在写的时候拔去,就没问题,mount中用 sync 参数。速度会慢一点,不过安全第一。

2。hotplug可以,不过dbus/hal用起来似乎更利落。只要对应了条件,就执行相应的事情,懒得考虑其他问题。 hotplug我没研究过,不好下定论。

发生的事件:
插入U盘的时候,通知udev建立相应的special文件。HAL 则通过fstab-sync生成相应的 fstab内容。最后ivman自动 mount/umount。
拔出U盘的时候,ivman就umount,然后HAL删除fstab内容,最后udev删除special文件。

因为CDROM本身不变,所以 HAL在启动的时候就生成了fstab的内容。过程相对简单一点。
插入 CD的时候,HAL 通知有CD插入。ivman就去mount 该CD。反过来也一样。

3个软件3个功能功能,哪里出错一目了然。

(明早起来再贴后边的。,好困。)。。
回复 支持 反对

使用道具 举报

发表于 2005-11-25 05:07:03 | 显示全部楼层
弱问:HAL,ivman等是什麽玩意?
回复 支持 反对

使用道具 举报

发表于 2005-11-25 19:08:41 | 显示全部楼层
Post by 终极幻想
1。关于umount这个问题,我试过了,只要别在写的时候拔去,就没问题,mount中用 sync 参数。速度会慢一点,不过安全第一。
若是使用 sync ?韺懭 usbdisk, 速度只有十幾二十 k?
之前我是使用 supermount, 但寫入速度很快 (是用 sync)
(一些討論 http://qa.mandriva.com/show_bug.cgi?id=19763)

是否 hal+dbus 能像 supermount 一樣, 在不需 umount 下能自動卸載?
(使用 sync 應該可以)

寫入速度也像 supermount 一樣快?
(還是這只是 interface, 而是根據 sync, async)

--
雖然我是用 mandriva, 但希望不吝賜教
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-26 05:07:55 | 显示全部楼层
Post by d00m3d
弱问:HAL,ivman等是什麽玩意?


难得有d00m3d不懂/不知道的东西啊。。

HAL是类似hotplug的一个东西,主要作用是通知系统硬件上的改动。其中包括了很多详细的资料。

ivman是根据HAL的信息来执行相应的命令的软件。:)。

HAL 在BLFS里边也有安装的。
http://www.linuxfromscratch.org/blfs/view/svn/general/hal.html
ivman没有,所以我后来才发现了这个软件。。活活。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-26 06:22:25 | 显示全部楼层
Post by garychang
若是使用 sync ?韺懭 usbdisk, 速度只有十幾二十 k?
之前我是使用 supermount, 但寫入速度很快 (是用 sync)
(一些討論 http://qa.mandriva.com/show_bug.cgi?id=19763)

是否 hal+dbus 能像 supermount 一樣, 在不需 umount 下能自動卸載?
(使用 sync 應該可以)

寫入速度也像 supermount 一樣快?
(還是這只是 interface, 而是根據 sync, async)

--
雖然我是用 mandriva, 但希望不吝賜教


我以前也用supermount,但是现在内核似乎不支持了。打补丁都打不上。所以我也放弃了。

submount是supermount的代替品(后来找到的),我也用过,不过似乎新内核中支持不是很好,如果cdrom的tray是打开的话,在目标目录ls会引起错误。我记得以前没这个问题的。

sync我试了,速度慢得不可忍受。暂时取消了这个参数。寻找解决方案中。不过自动更新fstab一点问题都没有。我正在实验与automount或者submount之类的整合。

(如果对sync不要求的话,就不用管了,直接在HAL配置中去掉那个参数就可以了)。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表