2004-09-23
修订历史 | ||
---|---|---|
修订版 1.04 | 2007-5-25 | 修订者:VRE |
小更新 | ||
修订版 1.03 | 2006-09-15 | 修订者:GaMA |
作者请求审查。 | ||
修订版 1.02 | 2004-12-25 | 修订者:VRE |
小更新 | ||
修订版 1.00 | 2004-09-23 | 修订者:VRE |
初始版本,由 TLDP 的 Rahul Sundaram 审查 | ||
修订版 0.32 | 2004-09-13 | 修订者:VRE |
新的章节,例如需求和其他章节。 | ||
修订版 0.10 | 2004-06-24 | 修订者:VRE |
第二稿 | ||
修订版 0.9 | 2004-06-11 | 修订者:VRE |
初稿 |
Autodir 提供了一种简单有效的方式来以透明的方式创建目录,例如主目录。 它依赖于 autofs 协议进行操作。
本文档解释了如何使用 Autodir 以应用程序透明的方式按需创建目录。 本文档还解释了使用 Autodir 实现的透明备份功能,无需因备份而导致系统停机; 这适用于 Autodir 管理的所有目录。
本文档,Autodir HOWTO,版权所有 (c) 2004,属于 Venkata Ramana Enaganti。 本作品已获得 Creative Commons Attribution 许可。 要查看此许可证的副本,请访问 http://creativecommons.org/licenses/by/2.0/ 或写信至 Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA。
Linux 是 Linus Torvalds 的注册商标。
在发布 intraperson beta 之后,我开始编写一份管理指南,其中涉及 intraPerson 的管理方面。 有关更多详细信息,请查看 http://www.intraperson.com。 但我被一件简单的事情难住了。 在 LDAP 中创建用户很容易 - 至少我是这么认为的 - 但是如何在导入这些 LDAP 帐户的任何位置为 LDAP 中的这些用户创建主目录?
我找到了一些解决方案,但我不满意,因为每个解决方案都有严重的缺点。 在浏览了 Autofs 文档并进行了一些黑客攻击后,我得出的结论是,Autofs 协议可能为这一挑战提供更好的解决方案。
结果是基于 Autofs 协议的 Autodir。
PAM 模块pam_mkhomedir使用可插拔身份验证模块体系结构进行操作。 因此,它有一些相关的限制。 例如:
某些服务器可能不会对用户进行身份验证,但他们可能希望用户目录存在。 这意味着它们不使用 PAM,反过来,pam_mkhomedir没有机会创建主目录。 一个臭名昭著的例子是在电子邮件服务器上。
PAM 始终是身份验证的可选组件。 某些服务可能根本不使用 PAM,而是使用不同的方法对用户进行身份验证。 在这种情况下,pam_mkhomedir永远不会被使用。
一般来说,/home归 root 所有,只有 root 用户才能在其中创建主目录。 因此,希望通过 PAM 创建主目录的服务必须以 root 身份运行,否则主目录必须具有与例如,/tmp.
最后,Autodir 范围更广,并支持更多有趣的功能。
用户帐户位于集中式数据库中,例如 LDAP、SQL、NIS、NIS+ 或其他数据库,用户和组从这些数据库导入到其他系统。 例如,在这些从集中式数据库按需导入这些帐户的系统中创建主目录、组目录。
利用其透明备份功能,适用于 24*7 在线系统。
即使帐户在本地系统中,也可以使用它,在某种程度上隐藏/home目录中存在的帐户,例如。
当您已经在使用 Autofs 软件包,处理 (home) 目录的挂载时,就会出现问题。 让我们看看这两个软件包之间的区别:
autofs 的主要目的是按需处理网络挂载,而不是同时挂载所有挂载,这样可以节省系统资源。 虽然 autofs 软件包中提供了一些按需挂载主目录的支持,但要求是这些主目录必须已经存在。
另一方面,Autodir 仅专门用于本地目录创建和按需挂载它们。
Autodir 还可以创建磁盘文件系统中的真实目录,这些目录不位于一个单独的扁平基础目录中。 这就是像 useradd 这样的实用程序默认创建的方式。 在标准文件系统设置中,所有主目录都位于基础/home目录中。 对于像 ext2 和 ext3 这样的文件系统,如果大量主目录存在于一个单独的基础目录中,性能将会下降。
对于访问这些目录的应用程序,Autodir 按需在 单个 autofs 挂载的虚拟基础目录中为它们呈现所有目录; 实际目录是在其他目录的子目录中以分层样式创建的。
例如,具有用户名user1的真实 home 将被创建为/autohome/u/us/user1如果这样配置,但会挂载到/home按需为访问/home/user1.
中的主目录的应用程序。实际主目录所在的真实基础目录(/autohome实际主目录所在的真实基础目录(在上面的示例中)的权限以这种方式保存,即
除了 root 之外,任何人无法访问。
这种按需挂载和卸载目录提供了一个有趣的机会:能够判断目录是否正在使用。 如果目录没有被使用,则可以在目录被卸载时安全地启动诸如备份应用程序之类的程序。
Autodir 通过在目录变为未使用时启动命令行中提到的备份来利用此功能。如果您是阅读本文档的管理员,则还需要提出一个更重要的问题。 Autodir 不会像 autofs 软件包那样调用外部程序 mount 和 umount; 相反,它直接使用系统调用。 作为一个副作用,它更快、更可靠,但是mtab
文件未更新。 我觉得这没有必要,因为所有的挂载和卸载都是本地目录。
在任何时刻,只能向 Autodir 添加一个模块。 如果有两个模块,例如autohome和autogroup,那么应该创建两个 Autodir 进程,以便每个进程可以附加一个所需的模块。
为了进一步解释,我选择了autohome处理透明家目录创建的模块。
![]() | 假设 |
---|---|
|
![]() | KISS |
---|---|
保持简单:为了便于理解,一些细微的细节被有意忽略。 |
首先,autofs 文件系统由 Autodir 挂载到/home目录。 Linux 内核得知/home现在由用户空间应用程序 Autodir 管理。
![]() | Autofs? |
---|---|
如果您不了解 autofs 文件系统,请不要太在意。 只要把它想象成一种特殊的文件系统,类似于基于内存的文件系统,但具有一些额外的特殊属性。 |
+----------------+ | Linux Kernel | +----------------+ / \ / \ / \ / \ +-------------+ +--------+ +------------+ +-----------------+ | Application |------>| /home |<----->| Autodir |<------>| autohome module | +-------------+ +--------+ +------------+ +-----------------+ \ / \ +----------------+ / +-| /autohome |<------------------+ +----------------+ |
每当应用程序或守护程序需要访问用户的家目录时,例如/home/userhome1,它们会直接进入/home/userhome1目录访问它。 内核注意到这一点,如果userhome1目录尚未存在于/home.
中,则通知 Autodir。 Autodir 反过来将此请求传递给autohome模块。 该autohome模块不触及/home目录。 相反,它在其他地方管理真实家目录,例如在实际主目录所在的真实基础目录(中,如上图所示。
该autohome模块创建一个真实的家目录,如果它不存在于实际主目录所在的真实基础目录(目录中。 无论创建成功与否,autohome都会报告回 Autodir。 当目录创建任务成功完成时,会将真实家目录的路径提供给 Autodir。
如果autohome模块报告成功,则 Autodir 在userhome1下创建/home目录,并将来自实际主目录所在的真实基础目录(的真实家目录挂载到该目录上。 在过程结束时,Autodir 通知内核整个操作是否成功。 相应地,内核允许应用程序进入该目录,或者,如果失败,则报告该目录不存在。
在继续之前,最好了解以下术语以简化解释。
这些目录不存在于磁盘上。 相反,它们是在内存中按需创建和删除的。 如果系统重启,所有这些目录都会消失。 在上图中,/home下的所有目录都是虚拟目录。
这是保存所有虚拟目录的目录。 此目录确实存在于磁盘上,因此即使在重新启动后仍然存在。 在上图中,/home是虚拟基本目录。
这些是实际驻留在磁盘上的目录。 即使在重新启动后,它们仍然完好无损。 在上图中,在实际主目录所在的真实基础目录(下创建的所有目录都是真实目录。
这是保存所有真实目录的目录。 在上图中,实际主目录所在的真实基础目录(是真实基本目录。
每个虚拟目录都映射到一个真实目录。 这意味着写入或修改虚拟目录的任何内容实际上都会发送到真实目录。
在系统重新启动时,真实目录及其内容保持不变。 但是虚拟目录会再次按需创建,与之前完全一样。
如果虚拟目录在指定的时间段内未使用,则会被删除,并在必要时再次创建。 当虚拟目录被删除时,会在相应的真实目录上启动备份程序 - 如果配置了备份。
![]() | 应用程序应仅访问虚拟目录。 真实目录对应用程序是隐藏的。 只有 root 用户才能看到它们。 有一个例外:备份程序始终只访问真实目录。 |
为什么在真实基本目录中应该有任何特殊的组织? 如果我们只是在一个真实基本目录中创建所有真实目录,那么当要创建大量真实目录时,可能会出现性能损失。 像 ext2/ext3 这样的文件系统没有针对这种扁平目录结构进行优化。
如果将真实基本目录划分为更多子目录,甚至将这些子目录再次划分为更多子目录,那就更好了。 实际的家目录保存在最终的子目录中。
有三种类型的目录组织
实际上没有组织。 所有家目录都直接在真实基本目录下创建。
真实基本目录被划分为更多子目录。 子目录名称源自要创建的最终目录的第一个字符。 例如,如果要创建user1目录,首先在真实基本目录下创建一个名为“u”的目录。 然后在该子目录中创建实际目录user1,如下所示:/<real_base_directory>/u/user1.
与级别 1 组织相同,但在第一级子目录之后,创建第二级子目录。 此处的名称是要创建的最终目录的前两个字符。 例如,对于用户user1,如上例所示,创建/<real_base_directory>/u/us/user1目录。
当应用程序尝试访问虚拟基本目录中的虚拟目录时,如果该目录尚不存在,Autodir 会在其中创建虚拟目录,并将来自真实基本目录的真实目录挂载到该目录上。 完成此操作后,会启动一个计时器。 如果在指定的时间段内,任何应用程序都没有从虚拟基本目录访问该虚拟目录,则该目录将被删除,并且真实基本目录中的相应真实目录将被标记为备份。
可以通过 Autodir 的命令行选项来设置过期等待时间。
当在一段不活动时间后删除虚拟目录时,Autodir 支持启动备份程序。 删除虚拟目录本身就保证了没有其他应用程序可以访问内容并修改它。
就像存在过期虚拟目录的等待时间一样,对于备份,Autodir 也会在虚拟目录过期后等待一段时间,然后才启动备份。 可以通过 Autodir 的命令行选项来配置此时间段。
按照设计,备份程序应该在真实目录上运行,而不是在虚拟目录上运行。 如果备份程序尝试访问虚拟目录,则 Autodir 会假定某些常规应用程序需要该目录,并且备份程序会被杀死,即使访问虚拟目录的进程是备份程序本身。
为每个真实目录使用单独的备份进程。 可以为备份程序提供要在其上运行的真实目录的参数。
![]() | 备份支持独立于正在使用的任何特定模块。 它适用于 Autodir 的所有模块。 |
![]() | 备份 = 真实! |
---|---|
备份程序绝不应访问虚拟目录或虚拟基本目录。 |
![]() | 暂停 |
---|---|
如果虚拟目录一直被应用程序访问,则备份功能用处不大。 |
Autodir 对正在使用的备份程序提出了一些额外的要求:当备份程序正在处理相应的已过期虚拟目录的真实目录,并且在备份运行时应用程序再次请求该虚拟目录时,备份进程将被杀死。 首先发送一个SIGTERM以使其优雅地停止。 但如果它没有及时关闭 - 并且它有一秒钟的时间来执行此操作 - 将发送一个SIGKILL,这将保证停止备份。
![]() | 只有当备份停止后,应用程序才能访问请求的虚拟目录。 |
![]() | 无论使用什么备份,它都应该能够从这个信号中优雅地恢复,而不会造成不可恢复的副作用。 |
另一个重要的问题是备份运行的环境。 所有备份程序都以 root 身份运行。 但与此同时,所有不必要的 root 权限都使用 POSIX 功能被移除。 换句话说,这些备份程序可以读取系统上属于任何用户的任何文件或目录,仅此而已。 除此之外,备份进程的行为就像一个普通的用户级别进程。
可以传递给 Autodir 两种类型的选项。 在第一种类型中,选项用于 autodir 本身,并且无论使用哪个模块都是通用的。 另一种类型的选项是特定于正在使用的模块的。 这些选项称为子选项,并传递给正在使用的模块; 它们与主要的-o选项不同。 这类似于 mount 命令使用的子选项。
例如,可以按如下方式传递示例模块autohome的子选项:
-o 'realpath=/tmp/autohome,level=2,noskel' |
在这里,realpath, level和noskel是autohome模块的子选项。
您需要一个等于或晚于版本 2.4 的 Linux 内核。 这些内核版本支持在一个目录上挂载另一个目录。 目前 Autodir 尚未移植到其他 Unix 系统,但这将来可能会发生变化。
Autodir 需要基于协议版本 4 的 autofs 内核模块。 但它不需要 autofs 用户级别软件包。 autofs 内核模块非常标准,几乎所有发行版都包含它。
Autodir 使用 autofs 内核模块进行操作。 在启动 autodir 之前,必须加载内核模块autofs。
可以使用 modprobe 命令以 root 用户身份执行此操作,如下所示:
# modprobe autofs |
如果用户和组帐户驻留在集中式数据库中,则必须在启动 Autodir 之前导入这些帐户。 如何执行此操作超出了本 HOWTO 的范围。 有许多文档以清晰的方式解释了如何执行此操作。
目前 Autodir 以 tar 和 rpm 格式提供。 更多信息可以在 http://www.intraperson.com/autodir/ 找到。
下载源代码后,请按照以下简单步骤进行安装:
解压缩源代码。
$ tar zxvf <tar file name>
移动到展开的目录并执行以下命令:
$ ./configure
$ make
# make install
![]() | 无法执行? |
---|---|
该configure脚本检查所需的库。 如果这些库不存在,它将停止。 |
本节将解释如何配置 Autodir,以便按需创建用户家目录。 为此,将使用autohome模块,该模块处理家目录创建的细节。
要使用 Autodir 加载autohome模块,请使用-m选项。 例如,-m /usr/lib/autodir/autohome.so.
![]() | 用户/home 匹配 |
---|---|
当应用程序尝试访问 home 目录时,该 home 目录会用来检查是否存在与被访问的目录名具有相同用户名的用户。如果存在该用户名,则创建 home 目录。 否则,将向应用程序报告 “没有该文件或目录” 消息。 |
![]() | 用户帐户 |
---|---|
Autohome不处理在本地系统、LDAP 或任何其他数据库上创建用户帐户。 它只处理在这些帐户存在并从 LDAP 和 NIS 等数据库导入到本地系统后创建 home 目录。 |
![]() | 局限性 |
---|---|
值得一提的是autohome模块的一个局限性。 它期望用户名和 home 目录彼此相关。 例如,对于用户user1home 目录应该是/home/user1或/some/directory/name/user1但不是/some/directory/name/userhome1。 可以支持这一点,但这会给系统资源带来负担,因为必须从头到尾检查每个密码条目。 |
![]() | 了解何时不使用 autohome |
---|---|
如果现有的用户密码数据库是这样的,即用户 home 目录分布在不同的基本目录下,例如/home/class1/user1, /home/class2/user2332,那么autohome配置会变得复杂,不建议使用。 |
设置过程的下一步是确定用于创建 home 目录的虚拟基本目录和实际基本目录的位置。
什么是autohome模块上下文中的虚拟基本目录和实际基本目录?
这完全取决于如何创建用户帐户。 如果为用户名为 user1 的用户创建一个用户帐户,其 home 目录为/home/user1,那么/home 将成为虚拟基本目录。.
那么什么是实际基本目录? 这可以是任何目录。 您需要记住的唯一一件事是应该有足够的空间,因为所有实际文件都存储在这里,而不是存储在虚拟基本目录中。
在大多数服务器配置中/home是一个单独的分区。 但如果/home是虚拟基本目录,那么文件不会存储在该目录中! 解决方案不是在/home上挂载分区,而是将其挂载在其他位置并使其成为实际基本目录。
Autodir 选项-d用于指定虚拟基本目录。 例如autodir -d /home假设/home是虚拟基本目录。
指定实际基本目录有点棘手。 实际基本目录由autohome模块管理,因此必须通过模块子选项将此选项传递给该模块。 如果实际基本目录是/var/autohome,那么可以使用选项-o指定为-o realpath=/var/autohome.
首先,从集中式数据库(例如 LDAP)导入用户帐户。
接下来,必须将autofs内核模块加载到 Linux 内核中。 这可以通过autofs 内核模块部分中的描述来完成。
如果/home将用于 home 目录,那么/home将成为虚拟目录; 这可以使用-d /home选项指定给 autodir。
假设autohome模块位于/usr/lib/autodir/autohome.so,可以使用 autodir 按以下方式加载该模块:-m /usr/lib/autodir/autohome.so。 请注意,给出了模块的完整路径。
实际 home 目录的位置使用realpath子选项给出。 如果它是实际主目录所在的真实基础目录(,则该位置可以指定为realpath=/autohome.
使用所有这些选项,可以按以下方式启动 autodir:
# autodir -d /home \ -m /usr/lib/autodir/autohome.so \ -o 'realpath=/autohome' \ |
一旦启动 Autodir,最初/home目录将为空。 可以通过将目录更改为其中一个 home 目录(以 root 用户或 home 目录的所有者身份)来测试 Autodir 是否正常工作。
该autogroup模块用于按需创建组目录,以方便公共组访问。 例如,它可以与 Samba 一起使用,以动态地为一组人员创建共享目录。
![]() | 检查 |
---|---|
该autogroup模块在系统组数据库的有效组中检查请求的目录。 |
![]() | 使用 autogroup 创建 home 目录 |
---|---|
该autogroup模块也可用于创建 home 目录,前提是每个用户都存在用户私有组。 这样,所有组和 home 目录都可以在一个位置使用一个模块创建。 但是,不会复制任何骨架文件,并且autogroup子选项nopriv不应使用。 |
该autogroup配置与autohome模块相同,但与autohome不同的是,虚拟基本目录可以放置在任何位置,并且可以为其指定任何名称。 它不受系统帐户的约束。
模块autogroup可以使用-m选项。 例如,-m /usr/lib/autodir/autogroup.so.
将 Autodir 与autogroup一起使用,管理 home 目录中解释的所有子选项对于skel和noskel都是相同的,除了autogroup,因为这些对于autogroup模块没有意义。 此外,还有其他特定于
一些 Linux 安装使用用户私有组。 如果不想为这些组创建目录,请使用此子选项。
在本节中,将解释 Autodir 的一些选项。 备份选项在备份部分中解释。
指定虚拟基本目录。 如果此路径不存在,将创建它。 此选项需要绝对路径。
虚拟目录的过期超时。 有关更多详细信息,请参阅虚拟目录过期。
要与 Autodir 一起使用的模块。 目前autohome和autogroup可用。 需要模块的完整路径。
要传递给模块的所有子选项都在此处给出。 此选项传递语法类似于 mount 命令及其-o选项的语法。 有关更多信息,请参阅特定模块部分。
在前台运行并将所有消息记录到控制台。 用于调试目的并查看 Autodir 的工作方式。
此选项需要一个文件名路径,Autodir 将在该文件中写入其进程 ID。
有关 Autodir 支持的所有选项的帮助信息。
有关 Autodir 的版本信息。
这些选项传递给 Autodir 以请求备份支持。
这是指定备份程序路径及其参数的主要选项。 给定的路径应为绝对路径,否则 Autodir 不接受它。
每当一段时间内未使用虚拟目录时,都假定它处于非活动状态并将其卸载。 卸载目录后,是立即启动备份还是等待更长时间由该选项决定。 它以秒为单位获取参数。 这是虚拟目录过期后启动备份之前要等待的最短时间。 它不应超过一天。
这是要分配给备份进程的优先级。 该值在 1 到 40(包括 1 和 40)的范围内。 值越小,优先级越高,反之亦然。 默认值为 30。
这限制了任何给定时间的最大备份进程数。 默认值为 150。
![]() | 使用引号 |
---|---|
选项的参数包括绝对备份程序路径及其自身的参数。 因此,建议在此参数周围使用单引号。-b选项需要一个可执行文件的路径以及它的参数。 但是,参数会被解释为 %x 字符序列,并替换为预定义的字符串,如下所示: |
该-b%N
# autodir -d /home \ -m /usr/lib/autodir/autohome.so \ -t 1000 \ -f \ -o 'realpath=/autohome,level=1,skel=/etc/skel' \ -l /var/run/autodir.pid |
# autodir -d /home \ -m /usr/lib/autodir/autohome.so \ -t 300 \ -b '/bin/tar cf /tmp/%N%F.tar %L' \ -w 600 \ -o 'realpath=/tmp/autohome,level=2,noskel' \ -l /var/run/autodir.pid |
# autodir -d /var/abase/ \ -m /usr/lib/autodir/autogroup.so \ -t 300 \ -b '/bin/tar cf /tmp/%N%F.tar %L' \ -w 86400 \ -o 'nopriv,nosetgid,realpath=/var/realbase,level=0' |
从 rpm 安装后,将提供两个启动脚本:
# rpm -ivh autodir-0.28-4.i386.rpm |
/etc/rc.d/init.d/autohome/etc/rc.d/init.d/autogroup和。 第一个用于启动具有模块的 Autodir,第二个用于启动具有autohome的 Autodir。autogroup模块的子选项。
脚本配置文件/etc/sysconfig/autohome和/etc/sysconfig/autogroup可用于指定可以传递给 Autodir 的选项。
autodir 的邮件列表http://lists.sourceforge.net/mailman/listinfo/intraperson-autodir。
Autofs 邮件列表http://linux.kernel.org/mailman/listinfo/autofs。
Automount HOWTO 可以在http://www.tldp.org找到
Autofs Hacking http://www.goop.org/~jeremy/autofs。