浅谈Linux下的自动挂载机制


关键字: sysfs, hotplug, udev, hal, gnome-volume-manager, pmount

关于自动挂载可移动存储介质,譬如 u 盘啥的一直是很多人想要实现的东东,缺省的,对于高版本内核的系统,gnome 里面是可以这样的,这个原因恐怕很多人还不是很清楚,那天看了两眼,来解释一下,有啥不对的地方,还请指出 

本文原发于北邮真情流露 BBS Linux 版面。

自动挂载磁盘分区的操作从底层来说,是要内核支持的,2.6 内核的sysfs 虚拟文件系统就提供了这一支持,这个文件系统 (/sys/) 通常用于反应系统硬件信息,总线上的设备变化、网络设备的变化等事件在这里都能反应出来,这个文件系统的变化配合上内核的 hotplug 机制就可以掌握硬件改动相关的信息了。

说到内核的 hotplug 机制,简单地说就是在硬件发生变化的时候去通知某一用户态程序,缺省是 /sbin/hotplug,不过现在它已经被 udev 取代了,收到信息之后,udev 会根据 sysfs 的变化调用一些脚本来处理这个事件,这里的处理是指某个用户空间的动作,而不是加载驱动,加载驱动是内核自己的事情,在 udev 反应过来之前就完成了。

下面轮到我们著名的硬件抽象层 (HAL) 程序的了,这个程序有一个派驻到 udev 的脚本,把硬件改动信息部分地送到自己这里来处理,根据它的不同设置,有可能会提示某些东东来挂载磁盘阿、检测新进来的数码相机阿……

那 hal 怎么发出通知呢? 这是利用一个新兴的系统内用户空间消息总线系统 -- dbus 来完成的,hal 会通过 dbus 上的一条消息总线把新加入的块设备和相关的挂载提示信息,比如加载选项 sync, iocharset 之类的信息发送到总线上来,只等待一个终结者来接受并处理这些信息了。

这个终结者对于 gnome 来说就是 gnome-volume-manager (名字太长了,下面简称 gvm),它从 dbus 上探听消息,当发现有设备挂载提示的时候就会尝试把设备挂载上来。缺省的,还会打开一个 nautilus 浏览窗口来浏览新挂载上的分区的内容。

嗯,最后一个问题就是怎么挂了,众所周知,如果块设备在 /etc/fstab 里没有描述存在的话,挂载就比较麻烦: 

  • 本来如果有 fstab 中的 user 属性的话,普通用户可以挂载,但  现在没有,普通用户没法挂
  • 如果 sudo 授权的话,用户可能获得挂载其他分区的过大权限,危及系统安全。

pmount 就是这个工具链上的最后一环,它可以代表用户 (运行 gvm 的用户) 来挂载一个属于他的可移动存储设备,即使 fstab 里没有这个设备存在,缺省的挂载位置是 /media/ 下,和 块设备同名,比如 /dev/sda1 挂载到 /media/sda1/ 目录。

嗯,综上,设备的自动挂载就完成了,呵呵,希望一大堆的关键词没把大家搞晕,回顾一下:

kernel 发现设备变化反应到 sysfs 上并通过 hotplug 机制通知 udev, udev 把硬件相关内容送给 hal,hal 过滤、处理之后发送信息到 dbus 上,在 dbus 上等候的 gvm 收到消息后用 pmount 把设备挂上,这样,设备的自动挂载就完成了 :)