启动时使用 Chroot

启动时使用 Chroot

我有一个在启动时运行的脚本,但它不会在 chroot 中启动应用程序。

#!/bin/sh 
/usr/sbin/chroot /root/chrootdir/ /bin/sh -c "lighttpd -f /etc/lighttpd.conf -m /lib" 
echo "script activated" >> /log/www.log

日志文件在启动时写入/附加,但 lighttpd 服务器未启动。在框运行时运行脚本可以正常工作并启动 lig​​httpd。这是一个运行 Linux 内核和 busybox 的嵌入式系统。inittab 触发 /etc/init.d/rcS,然后运行我的 start_www 脚本。start_www 脚本是 rcS 启动的最后一个脚本。

更新:

/bin/sh:加载共享库时出错:libm.so.6:无法打开共享对象文件:没有此文件或目录

但是 libm.so.6 位于 /root/chrootdir/lib/libm.so.6 现在该怎么办?如何指定 libm.so 路径?尝试了命令“export LD_LIBRARY_PATH=/lib; lighttpd -f /etc/lighttpd.conf -m /lib”,但没有成功。

更新 2: .当我运行命令时:

chroot /root/chrootdir/ /sbin/lighttpd -f /etc/lighttpd.conf -m /lib

它启动网络服务器时没有任何警告或错误。但是当我在启动过程中启动相同的脚本时,该脚本突然无法找到库。在我的 chrootdir 中,我得到了一个 .profile 文件,其中包含:

导出 LD_LIBRARY_PATH=/lib

我的猜测是 .profile 设置文件在启动期间未使用,我该如何设置库路径?

答案1

您能用它重建 glibc 吗?

./configure --prefix=/usr --enable-add-ons --libexecdir=/lib

答案2

不要chroot尝试/bin/sh -c "lighttpd -f /etc/lighttpd.conf -m /lib"在 chroot 中的 shell-script 中运行相同的命令,有点像:

/sbin/chroot /root/chrootdir/ /start_it_up.sh

更新。好吧,总结一下我在对该答案的评论中所建议的所有内容:

  1. mount --bind将您的父系统库放入 chroot 的库目录中 — 至少测试一下它是否能正常工作
  2. 使用 ld 的标志LD_DEBUG=files来找出某些库可能具有的依赖项,因为它们也会影响预加载目标的整体失败

答案3

您可以为 lighttpd 创建初始化脚本,然后在命令行执行时传递 LD_LIBRARY_PATH,这样您就不必关心 .profile 等。语法,例如

# LD_LIBRARY_PATH=/lib/:/usr/local/lib/ myCommand

您也可以使用“ldd”命令来检查链接库。

相关内容