我有一个在启动时运行的脚本,但它不会在 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 服务器未启动。在框运行时运行脚本可以正常工作并启动 lighttpd。这是一个运行 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
更新。:好吧,总结一下我在对该答案的评论中所建议的所有内容:
mount --bind
将您的父系统库放入 chroot 的库目录中 — 至少测试一下它是否能正常工作- 使用 ld 的标志
LD_DEBUG=files
来找出某些库可能具有的依赖项,因为它们也会影响预加载目标的整体失败
答案3
您可以为 lighttpd 创建初始化脚本,然后在命令行执行时传递 LD_LIBRARY_PATH,这样您就不必关心 .profile 等。语法,例如
# LD_LIBRARY_PATH=/lib/:/usr/local/lib/ myCommand
您也可以使用“ldd”命令来检查链接库。