下一步 上一页 目录

13. 常见问题解答

问题 1. 我创建了 sendmail.init 和 syslogd.init。我将它们放在 /usr/local/bin 中并尝试运行,但遇到了错误。

答案 1. 这些文件被称为 init 脚本。它们在您的计算机启动时由 init 程序运行。它们不应放在 /usr/local 二进制文件目录下。请查阅 Linux 系统管理员指南或 Linux 入门指南,以获取有关如何使用 init 脚本系统的信息。

问题 2. 我将这些行放入 /etc/sendmail.cf

divert(0)
VERSIONID(`tcpproto.mc')                        
OSTYPE(linux)
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(local)
MAILER(smtp)

然后我得到了非常奇怪的输出。为什么?

答案 2. 您不应直接将这些行放入 /etc/sendmail.cf 中。sendmail.cf 文件的编写目的是为了方便 sendmail 理解,但对人类来说难以阅读。因此,为了使其易于配置,我们使用名为 m4 的程序及其宏功能来创建 sendmail.cf 文件。FEATURE 行实际上是扩展为 sendmail 配置语句的宏。请参阅 sendmail 文档,了解如何通过此方法配置 sendmail。另请注意,您需要创建一个主 /etc/sendmail.cf 文件,然后 virtfs 脚本会将其复制到 /virtual/domain1.com/etc/sendmail.cf。然后您编辑该 sendmail.cf 文件,使其响应您的域名。

问题 3. 我在哪里可以获取 virtuald,它是什么,以及我如何使用它?

答案 3. Virtuald 是我编写的用于运行虚拟服务的 C 源代码。它包含在本指南中。您可以像编译普通的 C 程序一样编译它 make virtuald 。生成的二进制文件将被放置在 /usr/local/bin 中。将使用 virtuald 作为普通网络服务器程序包装器的行添加到 /etc/inetd.conf 中。

问题 4. 我的系统上没有安装 dialog?

答案 4. Dialog 是一个允许您在 shell 脚本中放置对话框弹出窗口的程序。我的虚拟 shell 脚本示例需要它才能工作。您可以在 sunsite 获取 dialog 的副本。它编译非常容易,应该没有安装问题。

问题 5. 我如何知道虚拟 syslogd 是否正在工作?

答案 5. 当 virtuald 运行时,它应该将以下消息输出到 syslogd (/var/log/messages)

Nov 19 17:21:07 virtual virtuald[10223]: Virtuald Starting: $Revision: 1.49 $
Nov 19 17:21:07 virtual virtuald[10223]: Incoming ip: 204.249.11.136
Nov 19 17:21:07 virtual virtuald[10223]: Chroot dir: /virtual/domain1.com

Chroot 目录消息是在执行 chroot 系统调用后由 virtuald 发送的。如果出现此消息,则虚拟 syslogd 正在工作。如果您的虚拟化服务将消息记录到 syslogd,并且您看到了这些消息,这也表明虚拟 syslogd 设置正确。

请注意,如果您没有启用编译时选项 VERBOSELOG,则 virtuald 将根本不进行日志记录。那时,判断虚拟 syslogd 是否正在工作的唯一方法是您虚拟化的守护程序是否独立地向 syslogd 记录了某些内容。

问题 6. 我如何在虚拟文件系统之间设置配额?

答案 6. 您可以像平常一样设置配额。请参阅 配额迷你指南 (Quota mini-HOWTO)。但是,您必须确保跨域没有 uid 冲突。如果存在冲突,您将有用户共享配额。预留一个您知道将启用配额的 uid 范围,并告知您的域,除了已注册要拥有配额的用户外,他们不能拥有该范围内的任何用户。

问题 7. inetd.conf 条目中的 \ 符号是什么意思?

答案 7. 这只是一种将配置文件分成两行的方法。我这样做是为了使该行在适当的位置自动换行。您可以忽略 \ 并将这两行重新连接在一起。

问题 8. 当我运行 passwd 或其他登录程序时,我收到 permission denied (权限被拒绝)。当我运行 FTP 或 su 时,我收到 no modules loaded for service XXX (没有为服务 XXX 加载模块)。为什么?

答案 8. 这些是 PAM 错误消息。我在 PAM 出现之前编写了这些脚本。我的 virtfs 脚本不会复制 /etc/pam.d、/usr/lib/cracklib_dict.*、/lib/security 或 PAM 所需的任何其他文件。PAM 需要这些文件才能正常工作。如果您编辑我的 virtfs 脚本以复制这些文件,问题就会消失。

问题 9. virtuald 可以与 tcpd hosts.allow 和 hosts.deny 文件一起工作吗?

答案 9. 是的,经过一些修改就可以。

首先,必须在两个地方更改源代码。

必须在检查参数的位置插入此代码。

        if (!argv[3])
        {
                syslog(LOG_ERR,"invalid arguments: no program to run");
                exit(0);
        }

exec 行必须从

        if (execvp(argv[2],argv+2)<0)

更改为

        if (execvp(argv[2],argv+3)<0)

其次,inetd.conf 行必须从

ftp stream tcp nowait root /usr/local/bin/virtuald \
        virtuald /virtual/conf.ftp wu.ftpd -l -a

更改为

ftp stream tcp nowait root /usr/local/bin/virtuald \
        virtuald /virtual/conf.ftp tcpd wu.ftpd -l -a

第三,相应地编辑 /virtual/domain1.com/etc/hosts.allow 和 /virtual/domain1.com/etc/hosts.deny 文件。

问题 10. 我的虚拟主机可以运行 CGI 吗?

答案 10. 是的,它们可以,但我建议将 /cgi-bin 放在 chroot 之外的位置,只有您可以访问。例如,/var/www/cgi-bin/domain1.com。允许客户端访问 /cgi-bin 会给他们机会在您的服务器上运行程序。这是一个很大的安全漏洞。要小心。我不会让任何我没有亲自检查过错误的 cgi 在我的系统上运行。

问题 11. 我的配置文件与您的示例不同。我该怎么办?

答案 11. 有两种基本配置风格:SystemV 和 BSD。本指南中提供的示例基于 SystemV 风格的配置文件。虚拟服务在任何一种系统上都能同样良好地工作。有关 BSD 风格配置文件的信息,请查阅您的发行版的来源或最近的 LDP 站点。

问题 12. 我给您发送了邮件,但没有收到您的回复,或者您的回复花了很长时间。为什么?

答案 12. 可能是因为您没有在邮件主题行中添加 VIRTSERVICES HOWTO。请记住,我是一名网络管理员,在我每天 20 小时的工作中,我还管理我自己的虚拟主机以及我客户的虚拟主机。正确寻址的邮件总是在两三天内回复。不正确寻址的邮件不会被过滤到我的 VIRTSERVICES 邮箱中,可能会被忽略数天或数周。

问题 13. virtuald 在 100Mbit 网络下工作吗?

答案 13 网络卡的速度与 virtuald 是否工作无关。尝试确保您的服务器在 10Mbit 网络下工作正常,并且您的 100Mbit 网络卡在没有虚拟服务器的情况下工作正常。

问题 14. 我应该使用 sendmail 的 virthost 表吗?

答案 14. 不应该。那是 sendmail 接受多个域信息的特性。Virtuald 为每个 sendmail 提供自己独立的 chroot 环境。安装 virtuald,然后像平常一样为每个域配置 sendmail。

问题 15. 我可以在我的机器上设置虚拟 telnet 吗?创建虚拟 root 帐户以便客户可以管理他们自己的域呢?

答案 15. 这些问题我经常收到,老实说,我已经有点厌烦了。正如文档中多次声明的那样,答案是通过 inetd 运行的任何服务都可以使用 virtuald 进行虚拟化,因此没有什么可以阻止您执行上述任何一项操作。除了常识。您可能从允许 telnet 获得的任何好处,都远远不及对虚拟主机(以及您应该以负责任的方式托管的站点)在安全性方面的成本。以下仅是涉及的一些问题:

最重要的是,允许在虚拟主机上登录是一个非常糟糕的主意。如果允许,则托管在该机器上的每个站点都处于风险之中。如果您想允许站点所有者管理用户,那么建议您编写(而不是脚本)必要的代码来运行虚拟进程,这些进程允许他们在通过 ssh 登录时添加、删除或修改用户。这应该是完全菜单驱动的,永远不应允许控制台,并且不应以 root 身份运行。为了实现这一点,您必须将相关文件的所有权从 root 更改为其他用户。如果以这种方式完成,则将其合并到虚拟机中是稍微安全的。永远没有可以接受的时间来允许 root 登录,无论是通过 telnet 还是 ssh。这样做简直是自找灾难。如果有一个压倒性的理由来运行 telnet,那么该站点应该托管在专用机器上,在那里唯一的风险是针对单个站点。任何负责任的管理员都不会这样做,因此我不会在这个问题上浪费更多时间。

问题 16. 是否有与 virtuald 和虚拟服务指南 (Virtual-Services HOWTO) 相关的 rpm、tar、网站、邮件列表等?

答案 16. 目前还没有这样的东西可用。本指南是关于我所做的与此项目有关的一切信息的唯一来源。我发现本指南相当完整,使得对其他信息的需求变得多余。

问题 17. 当我尝试以普通用户身份运行 virtexec 时,我收到 chroot: operation not permitted (chroot:操作不允许)。为什么?

答案 17. Chroot 是一个 root 受限的系统调用。只有超级用户才能执行它。virtexec 脚本运行 chroot 程序,这就是为什么您需要以 root 身份才能运行它的原因。

问题 18. 我设置了 pop 和 sendmail,但弹出邮件似乎不起作用。为什么?

答案 18. 一些 pop 程序将 /usr/spool/mail 作为其邮件文件的位置。我知道 qpop 必须手动编辑才能修复此问题。要么重新编译程序的源代码,要么将 /virtual/domain1.com/usr/spool 符号链接到 /virtual/domain1.com/var/spool。

问题 19. 我没有使用您的指南中提到的程序,我使用了程序 XXX。它不起作用。为什么?

答案 19. 我试图确保在我的示例中使用最通用的每个服务器。但是,我知道每个人都有他们最喜欢的每个服务器版本。请尽可能多地发送信息给我,我会尝试找出如何解决您的问题并在 FAQ 中记录下来。发送给我的最重要的信息是获取您正在运行的软件版本的地址(以 ftp://ftp.domain1.com/subdir/subdir/file.tgz 形式)。

问题 20. 当我运行 virtexec 时,它说 symlink not a virt function (符号链接不是一个 virt 函数)。这是什么意思,我该如何修复它?

答案 20. Virtexec 是一个程序,它将获取其零参数,剥离前四个字符,并在虚拟环境中运行剩余的名称。例如,virtpasswd 运行 passwd。如果它剥离的前四个字符不是 virt ,它会抱怨并输出该错误消息。Virtexec 是用 shell 脚本编写的,应该很容易理解。有关 shell 脚本编程的问题,请参阅 bash 或您运行的任何 shell 的手册页。

问题 21. 我有一个关于 Qmail、SAMBA、Apache 等的问题,它与 virtuald 设置或软件包如何与 virtuald 接口无关。

答案 21. 这里描述的所有软件包都有完整的文档。有些甚至有专门为它们服务的完整网站,例如 www.packagename.org。请查阅它们,了解与软件包的虚拟主机功能无关的问题。

问题 22. 我有几个指向 domain1.com 的域名别名,但来自别名的邮件一直被退回。为什么?

答案 22. Virtmaildelivery 依赖于传递给它的环境变量来确定要投递到哪个 /virtual/domain1.com 目录。它不执行任何 DNS 查找来确定邮件的地址。但是,如果地址是 submail.mail.domain1.com,virtmaildelivery 将首先尝试该地址,然后是 mail.domain1.com,然后是 domain1.com,然后是 com,按此顺序直到找到匹配项或没有域名剩余。

但是,如果您的域名别名不是彼此的子域,则必须创建如下所示的符号链接

cd /virtual
ln -s domain1.com domain1alias.com

这样,virtmaildelivery 将被欺骗地认为两个目录都存在,即使其中一个是符号链接,并且邮件将能够投递到 user@domain1.com 或 user@domain1alias.com。请注意,当您运行 virtexec 时,virtexec 将在对话框中列出两个域。您可以选择其中任何一个,因为它们将是相同的文件系统。


下一步 上一页 目录