我刚刚在 Gentoo 上第一次安装 Apache。当我从另一个操作系统(在本例中为 Microknoppix)chroot 到 Gentoo 并尝试启动 Apache(使用/etc/init.d/apache2 start
)时,出现错误WARNING: apache2 is already starting
。如果我试图阻止它,我就会得到ERROR: apache2 stopped by something else
。当我在 Gentoo 下运行 Apache 时,它可以正常运行,无需 chroot。
我可能可以从 Gentoo 本身运行 Apache 并完全跳过 chroot,但我很好奇。为什么会发生这种情况?我可以修复它吗?
我之前和一个人聊过,他认为可能是:
- 多个程序尝试使用同一 pid 文件的问题 或者
- Gentoo 处理 chroot 的方式有问题。
但我对这两个问题的了解都不够,无法连贯地讨论这些主题。
编辑:以下是我用来 chroot 到 Gentoo 的命令,抄自Gentoo 手册中的安装说明:
sudo mount --bind /etc/resolv.conf /mnt/gentoo/etc/resolv.conf sudo mount -t proc proc /mnt/gentoo/proc sudo mount --rbind /sys /mnt/gentoo/sys sudo mount --rbind /dev /mnt/gentoo/dev sudo chroot /mnt/gentoo /bin/bash env-update && source /etc/profile export PS1="(chroot) $PS1"
答案1
当 Gentoo 在 chroot 中运行时,Gentoo 初始化脚本不能很好地工作。 Gentoo 通常具有相互依赖性,其中 apache 在“net”启动之前不会启动,等等,并且由于这些都不会在启动时运行(因为 Gentoo 不是主机系统),所以事情通常会被破坏。在最坏的情况下,Gentoo 可能会弄乱您的网络设置,或者认为您的硬盘尚未安装而运行 fsck。
此外,初始化脚本需要以 root 身份运行。如果您不以 root 身份运行它,它将无权修改跟踪服务状态的文件。如果您仍然以 root 身份运行,请注意 root 可以很容易地转义 chroot。
我建议跳过 init 脚本,并在 chroot 中启动时向 apache 传递一个自定义配置文件。就像是:
chroot /path/to/gentoo /usr/sbin/apache2 -f /etc/apache2/httpd.conf
perp
我还建议使用主管程序(例如orrunit
或 )在外部系统中运行此命令s6
。看http://skarnet.org/software/s6/why.html
您也可能需要将 /proc 安装在 chroot 中。请注意,如果 proc 挂载在 chroot 中,则 chroot 中的内容将能够从主机系统获取进程列表,这可能会很糟糕。我假设您这样做是因为您不信任将从 apache 提供的脚本?