Autodir HOWTO

Venkata Ramana Enaganti

2004-09-23

修订历史
修订版 1.042007-5-25修订者:VRE
小更新
修订版 1.032006-09-15修订者:GaMA
作者请求审查。
修订版 1.022004-12-25修订者:VRE
小更新
修订版 1.002004-09-23修订者:VRE
初始版本,由 TLDP 的 Rahul Sundaram 审查
修订版 0.322004-09-13修订者:VRE
新的章节,例如需求和其他章节。
修订版 0.102004-06-24修订者:VRE
第二稿
修订版 0.92004-06-11修订者:VRE
初稿

本 HOWTO 介绍与 Autodir 相关的安装、配置和其他问题。 Autodir 系统通常用于以简单的方式提供主目录。


目录
1. 简介
1.1. 版权和许可
1.2. 免责声明
1.3. 反馈
1.4. 本文档的新版本
1.5. 致谢 / 贡献者
2. 在深入细节之前...
3. 为什么不使用 pam_mkhomedir?
4. Autodir 可以在哪里使用?
5. Autodir 不是什么
6. Autodir 和 Autofs 之间的区别
7. 它是如何工作的
8. 一些定义
9. 真实基础目录中的目录组织
10. 虚拟目录过期
11. 备份支持
12. 备份程序要求
13. 模块选项
14. Autodir 要求
15. Autofs 内核模块
16. 导入用户和组帐户
17. 获取 Autodir
18. 管理主目录
18.1. autohome 的基础目录
18.2. 目录组织
18.3. autohome 的其他子选项
18.4. 示例
19. 管理组目录
20. Autodir 选项
21. 备份选项
22. 示例
23. RPM 特定
24. 更多信息

1. 简介

Autodir 提供了一种简单有效的方式来以透明的方式创建目录,例如主目录。 它依赖于 autofs 协议进行操作。

本文档解释了如何使用 Autodir 以应用程序透明的方式按需创建目录。 本文档还解释了使用 Autodir 实现的透明备份功能,无需因备份而导致系统停机; 这适用于 Autodir 管理的所有目录。


1.1. 版权和许可

本文档,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 的注册商标。


1.2. 免责声明

不对本文档的内容承担任何责任。 使用这些概念、示例和信息,风险自负。 可能存在错误和不准确之处,可能会损坏您的系统。 请谨慎行事,虽然这种情况不太可能发生,但作者不承担任何责任。

所有版权均由各自所有者持有,除非另有明确说明。 在本文档中使用某个术语不应被视为影响任何商标或服务标志的有效性。 命名特定产品或品牌不应被视为认可。


1.3. 反馈

非常欢迎您对此文档提出反馈意见。 请将您的添加、评论和批评发送到以下电子邮件地址:.


1.4. 本文档的新版本

本 HOWTO 的最新版本将从 http://www.intraperson.com/autodir/ 提供。


1.5. 致谢 / 贡献者

在本文档中,我很荣幸地感谢以下人员的语言和技术审查工作:


2. 在深入细节之前...

在发布 intraperson beta 之后,我开始编写一份管理指南,其中涉及 intraPerson 的管理方面。 有关更多详细信息,请查看 http://www.intraperson.com。 但我被一件简单的事情难住了。 在 LDAP 中创建用户很容易 - 至少我是这么认为的 - 但是如何在导入这些 LDAP 帐户的任何位置为 LDAP 中的这些用户创建主目录?

我找到了一些解决方案,但我不满意,因为每个解决方案都有严重的缺点。 在浏览了 Autofs 文档并进行了一些黑客攻击后,我得出的结论是,Autofs 协议可能为这一挑战提供更好的解决方案。

结果是基于 Autofs 协议的 Autodir


3. 为什么不使用 pam_mkhomedir?

PAM 模块pam_mkhomedir使用可插拔身份验证模块体系结构进行操作。 因此,它有一些相关的限制。 例如:

最后,Autodir 范围更广,并支持更多有趣的功能。


4. Autodir 可以在哪里使用?


5. Autodir 不是什么

Autodir 可以创建目录,但一旦从系统帐户数据库中删除用户和/或组条目,它不会删除它们。 使用 cron 中的自定义脚本来执行此操作。


6. Autodir 和 Autofs 之间的区别

当您已经在使用 Autofs 软件包,处理 (home) 目录的挂载时,就会出现问题。 让我们看看这两个软件包之间的区别:


另一个小的区别是 Autodir 是完全多线程的。 Autofs 预计在未来的版本中也将是多线程的。

7. 它是如何工作的

在任何时刻,只能向 Autodir 添加一个模块。 如果有两个模块,例如autohomeautogroup,那么应该创建两个 Autodir 进程,以便每个进程可以附加一个所需的模块。

为了进一步解释,我选择了autohome处理透明家目录创建的模块。

Note假设
 

  • autohome模块在需要时创建用户家目录,如果这些目录尚不存在。

  • 假定用户帐户存在,但相应的家目录不存在 - 要么是因为这些帐户是使用 useradd 命令的-M选项创建的,要么是因为这些帐户是从 LDAP、NIS 或其他外部数据库导入的,而这些帐户的家目录尚未创建。

  • 同样仅为了解释的目的,假定所有用户家目录都应位于/home目录下。

NoteKISS
 

保持简单:为了便于理解,一些细微的细节被有意忽略。

首先,autofs 文件系统由 Autodir 挂载到/home目录。 Linux 内核得知/home现在由用户空间应用程序 Autodir 管理。

NoteAutofs?
 

如果您不了解 autofs 文件系统,请不要太在意。 只要把它想象成一种特殊的文件系统,类似于基于内存的文件系统,但具有一些额外的特殊属性。

                                +----------------+
                                |  Linux Kernel  |
                                +----------------+
                                  /        \
                                 /          \
                                /            \
                               /              \
   +-------------+       +--------+       +------------+        +-----------------+
   | Application |------>| /home  |<----->|  Autodir   |<------>| autohome module |
   +-------------+       +--------+       +------------+        +-----------------+
                              \                                          /
                               \  +----------------+                    /
                                +-|   /autohome    |<------------------+
                                  +----------------+

每当应用程序或守护程序需要访问用户的家目录时,例如/home/userhome1,它们会直接进入/home/userhome1目录访问它。 内核注意到这一点,如果userhome1目录尚未存在于/home.

中,则通知 AutodirAutodir 反过来将此请求传递给autohome模块。 该autohome模块不触及/home目录。 相反,它在其他地方管理真实家目录,例如在实际主目录所在的真实基础目录(中,如上图所示。

autohome模块创建一个真实的家目录,如果它不存在于实际主目录所在的真实基础目录(目录中。 无论创建成功与否,autohome都会报告回 Autodir。 当目录创建任务成功完成时,会将真实家目录的路径提供给 Autodir

如果autohome模块报告成功,则 Autodiruserhome1下创建/home目录,并将来自实际主目录所在的真实基础目录(真实家目录挂载到该目录上。 在过程结束时,Autodir 通知内核整个操作是否成功。 相应地,内核允许应用程序进入该目录,或者,如果失败,则报告该目录不存在。


8. 一些定义

在继续之前,最好了解以下术语以简化解释。

虚拟目录

这些目录不存在于磁盘上。 相反,它们是在内存中按需创建和删除的。 如果系统重启,所有这些目录都会消失。 在上图中,/home下的所有目录都是虚拟目录

虚拟基本目录

这是保存所有虚拟目录的目录。 此目录确实存在于磁盘上,因此即使在重新启动后仍然存在。 在上图中,/home虚拟基本目录

真实目录

这些是实际驻留在磁盘上的目录。 即使在重新启动后,它们仍然完好无损。 在上图中,在实际主目录所在的真实基础目录(下创建的所有目录都是真实目录

真实基本目录

这是保存所有真实目录的目录。 在上图中,实际主目录所在的真实基础目录(真实基本目录

每个虚拟目录都映射到一个真实目录。 这意味着写入或修改虚拟目录的任何内容实际上都会发送到真实目录

在系统重新启动时,真实目录及其内容保持不变。 但是虚拟目录会再次按需创建,与之前完全一样。

如果虚拟目录在指定的时间段内未使用,则会被删除,并在必要时再次创建。 当虚拟目录被删除时,会在相应的真实目录上启动备份程序 - 如果配置了备份。

Important

应用程序应仅访问虚拟目录真实目录对应用程序是隐藏的。 只有 root 用户才能看到它们。 有一个例外:备份程序始终只访问真实目录


9. 真实基本目录中的目录组织

为什么在真实基本目录中应该有任何特殊的组织? 如果我们只是在一个真实基本目录中创建所有真实目录,那么当要创建大量真实目录时,可能会出现性能损失。 像 ext2/ext3 这样的文件系统没有针对这种扁平目录结构进行优化。

如果将真实基本目录划分为更多子目录,甚至将这些子目录再次划分为更多子目录,那就更好了。 实际的家目录保存在最终的子目录中。

有三种类型的目录组织

级别 0

实际上没有组织。 所有家目录都直接在真实基本目录下创建。

级别 1

真实基本目录被划分为更多子目录。 子目录名称源自要创建的最终目录的第一个字符。 例如,如果要创建user1目录,首先在真实基本目录下创建一个名为“u”的目录。 然后在该子目录中创建实际目录user1,如下所示:/<real_base_directory>/u/user1.

级别 2

与级别 1 组织相同,但在第一级子目录之后,创建第二级子目录。 此处的名称是要创建的最终目录的前两个字符。 例如,对于用户user1,如上例所示,创建/<real_base_directory>/u/us/user1目录。


10. 虚拟目录过期

当应用程序尝试访问虚拟基本目录中的虚拟目录时,如果该目录尚不存在,Autodir 会在其中创建虚拟目录,并将来自真实基本目录真实目录挂载到该目录上。 完成此操作后,会启动一个计时器。 如果在指定的时间段内,任何应用程序都没有从虚拟基本目录访问该虚拟目录,则该目录将被删除,并且真实基本目录中的相应真实目录将被标记为备份。

可以通过 Autodir命令行选项来设置过期等待时间。


11. 备份支持

当在一段不活动时间后删除虚拟目录时,Autodir 支持启动备份程序。 删除虚拟目录本身就保证了没有其他应用程序可以访问内容并修改它。

就像存在过期虚拟目录的等待时间一样,对于备份,Autodir 也会在虚拟目录过期后等待一段时间,然后才启动备份。 可以通过 Autodir命令行选项来配置此时间段。

按照设计,备份程序应该在真实目录上运行,而不是在虚拟目录上运行。 如果备份程序尝试访问虚拟目录,则 Autodir 会假定某些常规应用程序需要该目录,并且备份程序会被杀死,即使访问虚拟目录的进程是备份程序本身。

为每个真实目录使用单独的备份进程。 可以为备份程序提供要在其上运行的真实目录参数

Note

备份支持独立于正在使用的任何特定模块。 它适用于 Autodir 的所有模块。

Important备份 = 真实!
 

备份程序绝不应访问虚拟目录虚拟基本目录

Caution暂停
 

如果虚拟目录一直被应用程序访问,则备份功能用处不大。


12. 备份程序要求

Autodir 对正在使用的备份程序提出了一些额外的要求:当备份程序正在处理相应的已过期虚拟目录真实目录,并且在备份运行时应用程序再次请求该虚拟目录时,备份进程将被杀死。 首先发送一个SIGTERM以使其优雅地停止。 但如果它没有及时关闭 - 并且它有一秒钟的时间来执行此操作 - 将发送一个SIGKILL,这将保证停止备份。

Note只有当备份停止后,应用程序才能访问请求的虚拟目录

Important

无论使用什么备份,它都应该能够从这个信号中优雅地恢复,而不会造成不可恢复的副作用。

另一个重要的问题是备份运行的环境。 所有备份程序都以 root 身份运行。 但与此同时,所有不必要的 root 权限都使用 POSIX 功能被移除。 换句话说,这些备份程序可以读取系统上属于任何用户的任何文件或目录,仅此而已。 除此之外,备份进程的行为就像一个普通的用户级别进程。


13. 模块选项

可以传递给 Autodir 两种类型的选项。 在第一种类型中,选项用于 autodir 本身,并且无论使用哪个模块都是通用的。 另一种类型的选项是特定于正在使用的模块的。 这些选项称为子选项,并传递给正在使用的模块; 它们与主要的-o选项不同。 这类似于 mount 命令使用的子选项。

例如,可以按如下方式传递示例模块autohome的子选项:

-o 'realpath=/tmp/autohome,level=2,noskel'

在这里,realpath, levelnoskelautohome模块的子选项。


14. Autodir 要求


15. Autofs 内核模块

Autodir 使用 autofs 内核模块进行操作。 在启动 autodir 之前,必须加载内核模块autofs

可以使用 modprobe 命令以 root 用户身份执行此操作,如下所示:

# modprobe autofs

16. 导入用户和组帐户

如果用户和组帐户驻留在集中式数据库中,则必须在启动 Autodir 之前导入这些帐户。 如何执行此操作超出了本 HOWTO 的范围。 有许多文档以清晰的方式解释了如何执行此操作。


17. 获取 Autodir

目前 Autodir 以 tar 和 rpm 格式提供。 更多信息可以在 http://www.intraperson.com/autodir/ 找到。

下载源代码后,请按照以下简单步骤进行安装:

Note无法执行?
 

configure脚本检查所需的库。 如果这些库不存在,它将停止。


18. 管理家目录

本节将解释如何配置 Autodir,以便按需创建用户家目录。 为此,将使用autohome模块,该模块处理家目录创建的细节。

要使用 Autodir 加载autohome模块,请使用-m选项。 例如,-m /usr/lib/autodir/autohome.so.

Note用户/home 匹配
 

当应用程序尝试访问 home 目录时,该 home 目录会用来检查是否存在与被访问的目录名具有相同用户名的用户。如果存在该用户名,则创建 home 目录。 否则,将向应用程序报告 “没有该文件或目录” 消息。

Note用户帐户
 

Autohome不处理在本地系统、LDAP 或任何其他数据库上创建用户帐户。 它只处理在这些帐户存在并从 LDAP 和 NIS 等数据库导入到本地系统后创建 home 目录。

Important局限性
 

值得一提的是autohome模块的一个局限性。 它期望用户名和 home 目录彼此相关。 例如,对于用户user1home 目录应该是/home/user1/some/directory/name/user1但不是/some/directory/name/userhome1。 可以支持这一点,但这会给系统资源带来负担,因为必须从头到尾检查每个密码条目。

Note了解何时不使用 autohome
 

如果现有的用户密码数据库是这样的,即用户 home 目录分布在不同的基本目录下,例如/home/class1/user1, /home/class2/user2332,那么autohome配置会变得复杂,不建议使用。


18.1. 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.


18.2. 目录组织

有关此主题的详细说明,请参阅实际基本目录下的目录组织

autohome确实支持这种组织。 用于指定所需目录组织的子选项是level子选项,例如-o level=2.


18.3. autohome 的其他子选项

子选项skel如果骨架路径不是默认值/etc/skel: ,则可以使用.

子选项noskel-o skel=/some/other/dir-o可以与


18.4. 示例

首先,从集中式数据库(例如 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 是否正常工作。


19. 管理组目录

autogroup模块用于按需创建组目录,以方便公共组访问。 例如,它可以与 Samba 一起使用,以动态地为一组人员创建共享目录。

Note检查
 

autogroup模块在系统组数据库的有效组中检查请求的目录。

Tip使用 autogroup 创建 home 目录
 

autogroup模块也可用于创建 home 目录,前提是每个用户都存在用户私有组。 这样,所有组和 home 目录都可以在一个位置使用一个模块创建。 但是,不会复制任何骨架文件,并且autogroup子选项nopriv不应使用。

autogroup配置与autohome模块相同,但与autohome不同的是,虚拟基本目录可以放置在任何位置,并且可以为其指定任何名称。 它不受系统帐户的约束。

模块autogroup可以使用-m选项。 例如,-m /usr/lib/autodir/autogroup.so.

Autodirautogroup一起使用,管理 home 目录中解释的所有子选项对于skelnoskel都是相同的,除了autogroup,因为这些对于autogroup模块没有意义。 此外,还有其他特定于

nopriv

一些 Linux 安装使用用户私有组。 如果不想为这些组创建目录,请使用此子选项。


20. Autodir 选项

在本节中,将解释 Autodir 的一些选项。 备份选项在备份部分中解释。

-d

指定虚拟基本目录。 如果此路径不存在,将创建它。 此选项需要绝对路径。

-t

虚拟目录的过期超时。 有关更多详细信息,请参阅虚拟目录过期

-m

要与 Autodir 一起使用的模块。 目前autohomeautogroup可用。 需要模块的完整路径。

-o

要传递给模块的所有子选项都在此处给出。 此选项传递语法类似于 mount 命令及其-o选项的语法。 有关更多信息,请参阅特定模块部分。

-f

在前台运行并将所有消息记录到控制台。 用于调试目的并查看 Autodir 的工作方式。

-l

此选项需要一个文件名路径,Autodir 将在该文件中写入其进程 ID。

-h

有关 Autodir 支持的所有选项的帮助信息。

-v

有关 Autodir 的版本信息。


21. 备份选项

这些选项传递给 Autodir 以请求备份支持。

-b

这是指定备份程序路径及其参数的主要选项。 给定的路径应为绝对路径,否则 Autodir 不接受它。

-w

每当一段时间内未使用虚拟目录时,都假定它处于非活动状态并将其卸载。 卸载目录后,是立即启动备份还是等待更长时间由该选项决定。 它以秒为单位获取参数。 这是虚拟目录过期后启动备份之前要等待的最短时间。 它不应超过一天。

-p

这是要分配给备份进程的优先级。 该值在 1 到 40(包括 1 和 40)的范围内。 值越小,优先级越高,反之亦然。 默认值为 30。

-c

这限制了任何给定时间的最大备份进程数。 默认值为 150。

Caution使用引号
 

选项的参数包括绝对备份程序路径及其自身的参数。 因此,建议在此参数周围使用单引号。-b选项需要一个可执行文件的路径以及它的参数。 但是,参数会被解释为 %x 字符序列,并替换为预定义的字符串,如下所示:

-b%N

替换为虚拟目录名称。

%L

替换为实际目录的绝对路径。

%K

替换为主机名。

其他

其他字符被送入

strftime。 有关更多信息,请参见的手册页。。 有关更多信息,请参见22. 示例


23. RPM 特定

# 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 安装 Autodir,如下所示:

从 rpm 安装后,将提供两个启动脚本:

# rpm -ivh autodir-0.28-4.i386.rpm

/etc/rc.d/init.d/autohome/etc/rc.d/init.d/autogroup。 第一个用于启动具有模块的 Autodir,第二个用于启动具有autohomeAutodirautogroup模块的子选项。

脚本配置文件/etc/sysconfig/autohome/etc/sysconfig/autogroup可用于指定可以传递给 Autodir 的选项。


24. 更多信息