最后这种介绍几个不同的工具,它们并不完全是文件系统,但简化了文件系统的使用:FUSE和autofs。
FUSE——Filesystem in Userspace,允许用户管理文件系统,挂载FreeBSD内核不支持的文件系统,并将自己的数据转换为类似文件系统的方式进行访问。
autofs——automounter filesystem可以通过NFS或物理连接到系统时为你自动挂载文件系统。
FUSE为用户空间程序提供了一种途径(handle)和处理(process)异常文件系统的方法。
FUSE程序作为用户进程运行,解释数据并处理内核简化的内存结构,以便内核可以向系统呈现文件系统。这允许用户空间程序为内核提供文件系统支持。
文件系统不仅仅是一个存放数据的地方。文件系统也可以成为以新颖、意想不到的方式访问数据的有用工具。考虑devfs(第2章),FreeBSD使用它让程序通过文件系统访问硬件。可选工具,如fdescfs和mqueuefs(第3章),允许您将内核内存结构作为文件系统访问。但许多用户可以从以你甚至无法猜测的方式公开自己的数据中受益。
FUSE还支持有趣的数据转换,例如通过SSH挂载文件系统。FreeBSD开发人员永远不会允许在内核中使用SSH客户端,但由于我们无论如何都在用户区,你最好在那里启动SSH。或者MP3转码器。或者是一个HTTP客户端,允许您在web服务器上挂载和检查ISO,而无需下载整个内容。甚至还有一个维基百科FUSE模块,让您可以将维基百科作为文件系统进行查看和编辑。一些文件系统,如MooseFS(www.MooseFS.org),完全是为FUSE实现的。在我写这篇文章的时候,FreeBSD有三十多个FUSE模块,而且还会定期出现更多。
FUSE模块通常可以在操作系统之间移植。Microsoft NTFS磁盘的数据结构不会根据您正在读取它的操作系统而改变。FUSE模块确实需要更改才能在操作系统之间工作——FreeBSD需要与Linux或Solaris不同的文件系统内存结构——但与在内核内实现文件系统的难度相比,这微不足道。
使用FUSE并非没有风险。FUSE模块将数据馈送到内核中。当内核清理数据时,损坏的文件系统可能会向内核中抛出垃圾。一个聪明的入侵者可能能够利用他的方式进入特权访问。
不过,有时FUSE是解决问题的最佳方法。您需要调查另一台服务器上的文件吗?使用SSH。程序需要调查另一台服务器上的文件,但它只能查看本地文件?将FUSE的mount-over-SSH模块粘在中间,然后继续。
FreeBSD将FUSE支持作为内核模块fuse.ko实现。使用kldload加载它,或将其添加到/boot/loader.conf中,使得开机自动加载它。
使用FUSE需要访问/dev/fuse设备。默认情况下,只有root和operator组成员可以访问。
在某些系统中,将具有FUSE权限的用户分配给operator是合理的。如果不适合你的环境,请为FUSE创建一个特殊组,并使用devd规则将/dev/fuse分配给改组所有者。
如果你想让无特权用户访问FUSE,你需要将vfs.usermount sysctl 设置为1。
我们将使用FUSE SSH模块作为示例。一旦你了解了如何使用sshfs,部署其他模块就应该了解模块的目标——也就是说,要部署FUSE NTFS模块,你需要深入了解NTFS。
在介绍sshfs之后,我们将深入探讨FreeBSD的mount_fusefs的细节,它可以让你微调FreeBSD如何处理FUSE文件系统。
FUSE的fusefs-sshfs模块允许你通过SSH挂载远程目录。你可以将远程文件系统视为本地文件系统,并对储存在远程主机上的文件运行命令。安装软件包fusefs-sshfs后,可以使用sshfs。需要两个两个参数:远程主机和你希望挂载SSH文件系统的目录。
我们强烈建议使用SSH的公钥身份验证。如果你仍然使用基于密码的SSH身份验证,请查看任何在线教程或本身作者编写的SSH Mastery一书。
以下示例,作为常规用户,使用sshfs将我在服务器mail上的主目录挂载到本地主机的$HOME/mnt上:
$ sshfs mail: mnt/
如果我进入mnt目录,我可以在服务器上查看主目录上的文件。可以根据需要移动、复制和重命名里面的文件。
sshfs模块有意与SSH客户端共享许多语法。可使用username@hostname这样的格式用其他用户连接到远程服务器。如果要挂载其他目录,可以在主机名后加冒号,然后指明远程主机上的路径。使用-p选项可指定端口号。类似以下:
xxxxxxxxxx
$ sshfs -p 2222 mail:/tmp mnt/
要卸载sshfs,可以使用umount命令:
xxxxxxxxxx
$ umount /home/mwl/mnt
如果有特殊需求,可以使用-d选项启用FUSE调试。sshfs命令不会从终端分离,而是在使用文件系统时仅显示调试信息:
xxxxxxxxxx
$ sshfs –d mail: mnt/
有关更多选项,请参阅sshfs(1),其中大多数是我们大多数人不需要的。其中大部分作为-o选项的参数存在,与ssh中的完全相同。
FUSE文件系统的处理方式与其他文件系统略有不同。
只有挂载FUSE文件系统的用户可以访问它。虽然root可以看到某用户挂载了FUSE文件系统,但它看不到该文件系统的内容,若root尝试cd到该目录,会受到"Operation not permitted"提示。
此外,FUSE挂载的文件系统上的文件所有权和权限可能与本地文件系统的权限不直接匹配。
我可以使用sshfs挂载远程文件系统,但sshfs不能在我的工作站和服务器之间协调用户和组ID。我可以像在运行命令行登录一样操作这些远程文件。我的工作站可能支持NFSv4 ACL,但通过sshfs挂载的文件使用SSH服务器使用的任何权限方案。
最后,不要仅仅因为sshfs挂载有可执行的文件,就认为这些程序实际上会在你的主机上运行。你需要正确的共享库以及程序所需的任何其他资源。
我发现,当在sshfs挂载上运行时,即使是我的许多简单的shell脚本也不能以我预期的方式工作,因为我假设它们只会在服务器上执行。
FreeBSD的FUSE只允许挂载文件系统的用户访问它。root用户可以覆盖这一点,是FUSE文件系统对所有人都可用。大多数FUSE模块都有请求此行为的选项。对于sshfs,这是allow_other选项(还有个allow_root选项,但此选项对FreeBSD没有影响)。以下示例挂载了一个SSH FUSE文件系统,以便任何人都可以访问它:
xxxxxxxxxx
# sshfs -o allow_other mwl@mail: /mnt
这个命令只能用root执行。将allow_other用作非root用户会触发错误。
由于FUSE的性质,此挂载点缺乏所有权保护。任何可以访问/mnt的用户都可以完全访问文件系统底层的SSH会话。小心限制对此目录的访问!
FUSE提供了几乎无限制的存储选项,其中之一可能会解决你棘手的问题。有关FreeBSD FUSE实现和管理的更多详细信息,请参阅mount_fusefs(8)。
FreeBSD10及更高版本包括一个新的自动挂载服务autofs(5)。它取代了旧版本中更复杂的自动挂载器amd(8)。
autofs会自动为用户识别和挂载文件系统,即使他们没有挂载任何内容的权限。
如果你插入闪存驱动器,FreeBSD可以检查它们,识别上面的文件系统,并挂载它们,所有这些都不需要人工干预。
当用户尝试访问NFS共享时,如果服务器允许,自动挂载它。
autofs会自动处理/etc/fstab中配置的带有noauto标志的可移动媒体、NFS共享和文件系统,并且可以配置为处理FreeBSD可以挂载的几乎任何内容。
虽然许多系统管理员不希望服务器自动挂载可移动媒体,但他们可能会发现自动挂载NFS共享非常有用。
在FreeBSD的早期版本中,系统管理员可以通过将sysctl vfs.usermount设置为1来允许无特权用户挂载可移动文件系统。然后,用户可以将媒体挂载到他们拥有的目录上。但很多用户会忘记卸载他们挂载的文件系统。
自动挂载使系统管理员能够更好地控制用户可以挂载的介质以及挂载的位置。
FreeBSD的autofs经过精心设计,与Solaris automountainer兼容。底层代码完全不同,但实践应该是相同的。任何感觉设计过度的任务以及任何特别令人痛苦的行为都可以归咎于Oracle。如果你有西东挂载器问题,可以查看Solaris文档以及FreeBSD文档。Sun Microsystem将他们的自动挂载器许可给了几乎所有商业Unix供应商,因此你现有的自动挂载经验应该适用。
使用以下命令在/etc/rc.conf中添加启用autofs:
xxxxxxxxxx
# sysrc autofs_enable=YES
默认的autofs配置要求在/media中挂载可移动媒体,在/net中挂载NFS共享。默认情况下,可移动媒体的自动挂载是禁用的,这个稍后介绍。
虽然/media存在于默认的FreeBSD安装中,但/net不存在。在启用autofs之前,请先创建/net目录。目录的缺失不会阻止自动启动,但会阻止您自动挂载NFS共享。
以上是原书中的内容,实际上FreeBSD14的默认安装中,已经有/net了
你找不到autofs启动脚本。FreeBSD分别管理三个主要组件中的每一个,所有组件都由autofs_enable设置控制。
automount命令用于管理自动挂载的文件系统。/etc/rc.d/automount启动脚本加载autofs内核模块autofs.ko。
automountd守护进程处理挂载请求。当你转到autofs使用的目录时,autofs会检查该类型的文件系统。访问/media,并自动挂载检查是否存在可移动媒体。一旦你尝试访问媒体,automountd就会调用mount或其变体来执行挂载。
自动挂载的文件系统可能会堆积起来。autofs的autounmount(8)在超时后断开未使用的文件系统。某用户从系统中挂载的可移动媒体可能会损坏媒体的文件系统,自动卸载可以降低这种情况发生的风险。卸载未使用的NFS共享可以减少NFS服务器上的负载。
这些程序中的大多数都从autofs映射文件/etc/auto_master和相关映射文件/etc/autofs中获取指令。
autofs是通过映射(map)配置的。映射将设备或分区域挂载实体的方法相关联。
FreeBSD包括几个special maps。特殊映射是处理各种媒体的通用映射。FreeBSD的特殊映射包括可移动介质、NFS共享、noauto文件系统和防止autofs挂载的映射。
特殊映射几乎可以处理你可能拥有的任何自动挂载配置。
如果你有一些不能使用特殊映射的案例,你可以创建自定义映射来自动挂载目录和介质。auto_master(5)手册页给出了/etc/auto_master和自定义映射的完整语法。大多数情况下,使用自定义映射是一种管理选择,而不是技术需要——It is an administrative choice rather than a technical necessity.
下面我们将把注意力集中在特殊映射上。
/etc/auto_master文件指向automountainer映射。每行都是一个单独的映射,有两到三个部分:挂载点、映射名称,如果需要还有一些选项。默认配置只包含一个未注释的映射,即NFS特殊映射:
xxxxxxxxxx
/net -hosts -nobrowse,nosuid,intr
此map控制挂载点/net。它使用名为-hosts的映射。当检查此挂载点下的目录时,autofs会使用选项nosuid和intr挂载请求的NFS共享。nobrowse选项特定于autofs,并阻止autofs为/etc/hosts中的所有主机自动创建子目录。
任何时候编辑auto_master时,都必须运行automount来重新配置autofs支持守护进程的映射。
autofs附着到auto_master中引用的所有挂载点。运行automount -L可以查看所有这些目录:
xxxxxxxxxx
# automount -L
/net -nobrowse,nosuid,intr -hosts
现在,使用映射-hosts在/net目录上挂载了一个autofs实例。由于BSD文件系统是可堆叠的,你可以在/net上挂载其他东西,但不建议这样做。
你可以直接在/etc中放置映射,或使用/etc/autofs中的特殊映射。
特殊映射是脚本文件。autofs在访问挂载点时运行脚本。不可执行文件几乎肯定是由系统管理员创建的自定义映射。autofs会像其他映射一样打开和解析这些文件。
FreeBSD附带的/etc/autofs目录中的所有映射都是特殊映射。
FreeBSD附带了四个特殊的映射:-hosts、-media、-noauto、-null。
还有一个特殊的映射可以从LDAP中读取映射信息,但这高度依赖于环境,这里不讨论。
你知道映射被归类为特殊,因为它在/etc/auto_master中的名称以破折号开头。
让我们尝试一下NFS的自动挂载功能。我的测试网络由两个NFS服务器,mail和www。我知道我的工作站可以访问这两个服务器上的共享,因为我之前已经手动挂载过它们。
要从服务器自动挂载,请在/net中查找以服务器命名的目录。在查找之前,该目录不存在,但无论如何都要查找。现在,我的工作站的/net目录是空的。要查找主机mail上的可用共享,请cd或ls /net/mail目录:
xxxxxxxxxx
# ls /net/mail
usr var
此时实际上什么也没有挂载:autofs只显示可用的共享。从好的方面来说,现在存在可用NFS共享的目录。
mail服务器通过NFS导出/var/log,autofs就会在该目录上挂载NFS共享。我有邮件服务器配置允许的任何访问权限,就像我的系统管理员为我挂载了这个共享一样。
如果NFS服务器消失,挂载请求仍可能挂起。这就是为什么autofs默认使用intr选项挂载NFS共享,这样用户就可以按CTRL-C键取回终端,而无需打扰系统管理员。
/etc/auto_master中的默认配置包括一行注释,用于在/media中自动挂载可移动驱动器。默认情况下未启用。虽然/media用于可移动驱动器,但许多系统管理员将其用于手动挂载介质。让自动挂载突然独占/media会违反最小惊奇原则(Principle of Least Astonishment)。
xxxxxxxxxx
/media -media -nosuid
此规则为自动挂载器保留/media目录。它应用特殊映射-media,并使用nosuid选项挂载所有内容。取消该行的注释,并以root身份运行automount以激活它。
你还需要一个devd.conf条目来刷新旧的自动挂载器缓存条目。在FreeBSD10.2及更高版本中,此条目出现在/etc/devd.conf中,但被注释掉了。创建一个包含以下内容的/usr/local/etc/devd/autofs.conf:
xxxxxxxxxx
# Discard autofs caches, useful for the -media special map.
notify 100 {
match "system" "GEOM";
match "subsystem" "DEV";
action "/usr/sbin/automount -c";
};
如果你的计算机中插入了可移动介质,那么/media中会突然出现新的目录:
xxxxxxxxxx
# ls /media
10_2_RELEASE_AMD64_CD
da0
da0p1
显然,这台机器里有一个我不知道的光驱。一定是某个小精灵在里面塞了一张FreeBSD 10.2-RELEASE CD。autofs找到了磁盘,并通过文件系统标签将其挂载。如果我进入/media/10_2_RELEASE_AMD64_CD,autofs将为我挂载CD。
我没有卸载磁盘的权限,但我可以运行成都control eject cd0,让驱动器将磁盘吐出来。自动挂载的文件系统将保持挂载状态,知道下一次autounmountd运行为止。
如果我稍后放了另外一张光盘进去,它会显示它的标签,旧标签还在:
xxxxxxxxxx
# ls /media
10_2_RELEASE_AMD64_CD
USENIX06_TECH_SESSIONS
da0
虽然现在CD驱动器里现在是Usenix2006程序光盘,但FreeBSD10.2光盘的目录仍然存在。即使是root用户也无法删除该目录。
noauto文件系统是/etc/fstab中列出的具有noauto选项的文件系统。noauto文件系统在主机上已经预配置。如果系统管理员预先配置了挂载并启用了-noauto特殊映射,则无特权用户可以挂载设备。
/etc/auto_master中有一个noauto文件系统的注释条目。取消注释并运行automout以激活它:
xxxxxxxxxx
/- -noauto
-noauto特殊映射没有挂载选项。系统管理员可能会在/etc/fstab中配置任意挂载选项。NFS共享的合理选项并不真正适用于CD驱动器。以下是文件系统表中可能出现的几个常见条目:
xxxxxxxxxx
/dev/cd0 /cdrom cd9660 ro,noauto 0 0
mail:/usr/ports /usr/ports nfs rw,tcp,soft,intr,noauto 0 0
第一个为第一个CD驱动器分配/cdrom挂载点。第二个NFS将主机mail中的/usr/ports挂载到本地主机的/usr/pports上。两者都不会在启动时自动挂载。当你运行automount时,autofs会被挂载到每个挂载点上。
autofs不必担心挂载点上的文件系统类型、挂载选项或其他任何事情。系统管理员已经完成了所有这些。autofs只需要在用户访问分区时挂载分区,并在超时后卸载分区。
-noauto映射可以与其他两个映射重叠。用户可以通过/net/media/usr/ports或/usr/ports访问相同的NFS共享。他可以访问/cdrom或/media子目录中的CD。此外,一些映射可能允许重叠访问。
因此某些用户或程序会使其成为问题,因为这就是用户和程序所做的。
适用-null特殊映射来阻止这些自动挂载交互。虽然阻止所有可能的CD驱动器是不切实际的,但阻止NFS挂载是简单的。
我的主机使用 -noauto 特殊映射从NFS服务器mail挂载/usr/ports。我还在/net中配置了NFS自动挂载。我想防止我的主机两次挂载/usr/ports共享。这里有一个-null映射来实现这一点:
xxxxxxxxxx
/net/mail/usr/ports -null
运行automount,你将在/net/mail/usr/ports上挂载一个新的autofs实例。去那里的用户会找到一个空目录。
在这四类特殊映射中,几乎不需要手动制作自动挂载映射。如果你不知道如何写映射,那么就没有理由获得这种很少使用的技能。
不过,如果你已经是手工制作的Solaris自动挂载映射的用户,FreeBSD将接受你的映射。
FreeBSD可以直接进入基于Solaris的基础架构,并接受配置管理系统分发的映射。
将FreeBSD于Solaris集成还会遇到其他问题,但自动挂载器不是其中之一。
自动挂载使用两个进程:automount——更新/etc/auto_master时运行;automountd——监视挂载点活动并进行挂载。
这两个进程都可以使用-v选项来增加详细程度。
automounter守护进程将使用-v生成的所有调试信息记录到带有daemon.debug的syslogd工具中,因此它不会出现在/var/log/messages中。
你需要一个调试日志或/etc/syslogd.conf中演示的包罗万象的all.log来捕获这些消息。或者,你可以停止主automountd服务,并在前台调试模式下使用-d运行automountd。这将所有调试信息直接发送到终端:
xxxxxxxxxx
# automountd -dv
你会得到一些启动信息,然后是类似以下的有用的行:
xxxxxxxxxx
automountd: executing "mount -t cd9660 -o ro,noauto,automounted /dev/cd0 /cdrom/" as pid 1230
automountd: "mount -t cd9660 -o ro,noauto,automounted /dev/cd0 /cdrom/", pid 1230, terminated gracefully
如果自动挂载请求失败,则会出现错误信息。
使用-v运行automount可以显示有关其活动的更多详细信息,包括它如何解析/etc/auto_master。在自动挂载工作工作尝试一下,看看正常输出是什么样子。
自动挂载很有帮助,但卸载文件系统呢?
非特权用户无法卸载自动挂载的文件系统。然而,autounmount守护进程监视自动挂载的文件系统。它每隔一段时间会尝试卸载文件系统——默认情况下,每10分钟一次。
如果正在使用自动挂载的文件系统,无论如何,autounmount都不会卸载它。即使目录中的空闲命令提示符也会阻止卸载,就像你在运行umount一样。
你可以调整autounmountd尝试卸载文件系统的频率。-t选项允许你设置自动挂载后autounmountd的首次尝试卸载的秒数,而-r设置重试前等待的秒数。这个rc.conf设置告诉autounmounted在挂载后三分钟尝试卸载文件系统,然后每60秒重试一次:
xxxxxxxxxx
autounmountd_flags="-t 150 –r 60"
可以使用-v增加autounmountd的冗长程度,并在前台使用-d运行它进行调试。与automountd完全一样,autounmountd使用syslog工具daemon.debug,因此你需要配置一个日志来捕获它。
系统管理员可以使用automount -u卸载所有自动挂载的文件系统:
xxxxxxxxxx
# automount –u
这会断开专门自动挂载的文件系统,但会保留通用的automount基础架构并使其正常工作。
你可以通过使用unmount卸载所有autofs文件系统来关闭自动挂载,同时保留守护进程。
如果/net突然变成空的,ls /media啥都没有,可运行automount命令恢复自动挂载。
自动计数可以帮助简化系统管理员的工作,而FUSE可以使一些困难的任务变得烦人。