+ -
当前位置:首页 → 问答吧 → [LFS 幻想系列] 使用 HAL/ivman 为 fstab 中自动添加记录 以及 自动加载。

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

时间:2005-11-24

来源:互联网

看大家都用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用的。
代码:
--- util-linux-2.12a/mount/mount.c.sopwith 2004-03-04 20:28:22.000000000 -0500
+++ util-linux-2.12a/mount/mount.c      2004-07-16 16:50:18.792814782 -0400
@@ -191,6 +191,8 @@
 { "diratime",        0, 1, MS_NODIRATIME },  /* Update dir access times */
 { "nodiratime", 0, 0, MS_NODIRATIME },       /* Do not update dir access times */
 #endif
+ { "kudzu", 0, 0, MS_COMMENT }, /* Silently remove this option (backwards compat use only - deprecated) */
+ { "managed", 0, 0, MS_COMMENT }, /* Silently remove this option */
 { NULL,        0, 0, 0 }
 };
C. 修改/添加 HAL 的 policy 文件。
在 /usr/share/hal/fdi/policy 建立目录 95userdirectory
然后95目录在里边添加文件 95-user-policy.fdi。内容如下:
代码:
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
 <!-- User specif policies merged onto computer root object -->
 <device>
 <match key="info.udi" string="/org/freedesktop/Hal/devices/computer">
 <merge key="storage.policy.default.mount_option.exec" type="bool">false</merge>
 <merge key="storage.policy.default.mount_option.pamconsole" type="bool">false</merge>
 </match>

 <match key="volume.fstype" string="vfat">
 <merge key="volume.policy.mount_option.users" type="bool">true</merge>
 <merge key="volume.policy.mount_option.quiet" type="bool">true</merge>
 <merge key="volume.policy.mount_option.sync" type="bool">false</merge>
 <merge key="volume.policy.mount_option.codepage=936" type="bool">true</merge>
 <merge key="volume.policy.mount_option.iocharset=utf8" type="bool">true</merge>
 <merge key="volume.policy.mount_option.dmask=022" type="bool">true</merge>
 <merge key="volume.policy.mount_option.fmask=033" type="bool">true</merge>
 <merge key="volume.policy.mount_option.uid=1000" type="bool">true</merge>
 <merge key="volume.policy.mount_option.gid=100" type="bool">true</merge>
 </match>
 </device>
</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 的启动。以下是部分截取。
代码:
case "${1}" in
 start)
 boot_mesg "Starting Ikke's Volume Manager (ivman) ..."
 loadproc /usr/bin/ivman -s
 ;;

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

 restart)
 ${0} stop
 sleep 3
 ${0} start
 ;;

 status)
 statusproc /usr/bin/ivman
 ;;

 *)
 echo "Usage: ${0} {start|stop|restart|status}"
 exit 1
 ;;
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
上传的附件
IvmConfig.tar.bz2 (3.4 KB, 54 次查看)

作者: 晨想   发布时间: 2005-11-24

沙发!做到BLFS

作者: 休想   发布时间: 2005-11-24

lfs-dev的bootscript用udev做hotplug事件的处理daemon,
而现在的udev有bug,不能将hotplug事件传递到hal等处理程序。我之前也研究过hotplug处理过程,发现采用hal无法做到u盘自动mount。我是用automount搞掂的。automount不涉及hotplug,只监视对mount point的访问。也能达到u盘自动mount。同时automount还能超时自动umount,很合适u盘这种移动设备。

作者: iamfool   发布时间: 2005-11-24

udev我用的是 071。我没用automount。

研究了1个晚上,成果:

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

作者: 晨想   发布时间: 2005-11-24

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

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

作者: iamfool   发布时间: 2005-11-25

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

弱问:HAL,ivman等是什麽玩意?

作者: d00m3d   发布时间: 2005-11-25

引用:
作者: 终极幻想
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, 但希望不吝賜教

作者: garychang   发布时间: 2005-11-26

引用:
作者: d00m3d
弱问:HAL,ivman等是什麽玩意?
难得有d00m3d不懂/不知道的东西啊。。

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

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

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

作者: 晨想   发布时间: 2005-11-26

引用:
作者: 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配置中去掉那个参数就可以了)。

作者: 晨想   发布时间: 2005-11-26

引用:
作者: 终极幻想
难得有d00m3d不懂/不知道的东西啊。。

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

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

HAL 在BLFS里边也有安装的。
http://www.linuxfromscratch.org/blfs...neral/hal.html
ivman没有,所以我后来才发现了这个软件。。活活。。
嘿嘿,我不懂/不知道的东西多的是呢,所以常来这里跟大家学习学习

BLFS的东西实在太多了,都没有把每个软件看透,觉得"没用"的就随便跳过了,实在太鲁蟒了。谢谢老大提醒,看来应该把BLFS手册重读了

作者: d00m3d   发布时间: 2005-11-26

发展的趋势是udev将接管所有的hotplug事件,hotplug script将被放弃。

作者: iamfool   发布时间: 2005-11-26

现在udev是否能够解决firmware的load?
现在我用的一个系统,出现很郁闷的事情:hotplug挂firmware有问题
研究了好久也没有什么进展。所以想试试udev替换

作者: demonlj   发布时间: 2005-11-27

引用:
作者: 终极幻想
我以前也用supermount,但是现在内核似乎不支持了。打补丁都打不上。所以我也放弃了。
可利用 mandriva 的 kernel srpm 裡的 patch
(supermount 是 mandriva ?助的對吧!)

能請版主看看這個有關 supermount 的問題嗎?
http://cle.linux.org.tw/forum/viewto...ad98ce2d308315

作者: garychang   发布时间: 2005-11-29

有没有试过Hal 0.5.7的版本,不用fstab-sync的方法!
我在尝试,没有成功!

求大家讨论!

作者: allen_chen   发布时间: 2006-04-03

要求是:
Linux kernel 2.6.13 (or later), udev 071 (or later), dbus 0.50 or later and using /sbin/udevsend as the hotplug multiplexer/helper (latest is HAL 0.5.8)

你的系统是否达到以上的要求了?

作者: 晨想   发布时间: 2006-04-03

完全符合!
我的版本是:
udev 087
hal 0.5.7
dbus 0.61
ivman也是最新!
我是用最新的LFS构建的系统,所以还没有看到LFS相关这方面的文档,
用了楼主的IVMAan配置文档,但是不知道哪里出错了!
应该调整哪里?就是不能自动mount优盘和移动硬盘!

作者: allen_chen   发布时间: 2006-04-04

我没用过 udev-087,用的是 071,没时间更新系统。。。。。

作者: 晨想   发布时间: 2006-04-04

udev 0.84以后的改进是不再需要hotplug包了!udev独立完成了所有工作,我确信我的udev系统能正常工作了,但是udev再之上的hal等就不知道不正常,最主要感觉对于HAL和ivman系统调试缺乏足够的手段!兄台能否给些hints!?

作者: allen_chen   发布时间: 2006-04-04

我的测试系统中,就是用 纯udev 的,对usb盘似乎也能识别,不过没配置 ivman/hal 呢,理论上应该没问题吧。。。你用最新的 udev 试试?参考 LFS 的方法。

还有,你的内核版本是?

作者: 晨想   发布时间: 2006-04-04

hua@vgh:~$ acw usbmount
Package: usbmount
Priority: extra
Section: universe/admin
Installed-Size: 116
Maintainer: Martin Dickopp <[email protected]>
Architecture: all
Version: 0.0.14
Depends: udev (>= 0.060-1), lockfile-progs
Filename: pool/universe/u/usbmount/usbmount_0.0.14_all.deb
Size: 10260
MD5sum: b49c4657b8898586c1d61cb9c89d04d7
Description: automatically mount and unmount USB mass storage devices
This package automatically mounts USB mass storage devices (typically
USB pens) when they are plugged in, and unmounts them when they are
removed. The mountpoints (/media/usb[0-7] by default), filesystem types
to consider, and mount options are configurable. When multiple devices
are plugged in, the first available mountpoint is automatically
selected. If the device provides a model name, a symbolic link
/var/run/usbmount/MODELNAME pointing to the mountpoint is automatically
created.
.
The script that does the (un)mounting is called by the udev daemon.
Therefore, USBmount requires a 2.6 (or newer) kernel.
.
USBmount is intended as a lightweight solution which is independent of
a desktop environment. Users which would like an icon to appear when an
USB device is plugged in should use the pmount and hal packages
instead.
.
Homepage: http://usbmount.alioth.debian.org/
Bugs: mailto:[email protected]
Origin: Ubuntu

作者: jhuangjiahua   发布时间: 2006-04-04

hal 似乎更多人用,而且很多软件都用hal,这个 usbmount 的功能比较专一。不过试试也不错。嘿嘿。

作者: 晨想   发布时间: 2006-04-04

都说了 usbmount 是为了在轻型(简陋)环境下用的

要好用的,请使用 gnome/KDE 的自动挂载

作者: jhuangjiahua   发布时间: 2006-04-05

一般不用图形界面整理文件。所以 kde 的自动挂载我不太喜欢。。。
其实就算不用 图形界面,也可以用 hal/ivman,感觉不错。:)。

作者: 晨想   发布时间: 2006-04-05

最近测试 Kanotix 新的 CeBit edition 发觉 KDE 不单自动挂载,好像也搞 autorun 似的,感觉如同跑 M$ crap,我不太喜欢。。。

作者: d00m3d   发布时间: 2006-04-09

我不太喜欢 KDE 的自动挂载的。不习惯。。。autorun的东西,更讨厌噢。活活。。

作者: 晨想   发布时间: 2006-04-09

我的Ivman安装上之后不能作为daemon运行。插上U盘后必须要手动运行一次才能挂载上U盘,用ps -A 也看不到任何Ivman在运行,但/var/run/ivman.pid文件却存在,不知道这是怎么回事。

作者: dy07   发布时间: 2007-12-05

有一点不解:
hal有callout , 是不是可以不用ivman呢?

作者: yantao123yt   发布时间: 2008-11-11

引用:
作者: yantao123yt
有一点不解:
hal有callout , 是不是可以不用ivman呢?
有 callout 是什麽意思?

作者: d00m3d   发布时间: 2008-11-12

我的 gnome 可以在 root 下自动挂载的。

作者: linux001   发布时间: 2008-11-12

引用:
作者: d00m3d
有 callout 是什麽意思?
Callouts are programs that run when device objects are added and removed in the HAL daemon.

作者: yantao123yt   发布时间: 2008-11-12