LFS构建遇阻:chroot无法执行/bin/bash问题求助
LFS构建中chroot无法运行/bin/bash的问题解决
在LFS(Linux From Scratch)构建过程中,chroot无法正常工作,执行测试脚本尝试在chroot环境运行/bin/bash时,报错:chroot: failed to run command ‘/bin/bash’: No such file or directory
原测试脚本如下:
#!/bin/bash _place="$(pwd)/jail" # Clear before do something for _x in dev/shm run sys proc dev/pts dev; do sudo umount ${_place}/${_x} >& /dev/null done for _x in dev/pts dev run sys proc; do sudo rmdir ${_place}/${_x} >& /dev/null done sudo rm -rf ${_place}/bin >& /dev/null sudo rmdir ${_place} >& /dev/null # Run with "go" to mount actually if (test "${1}" = "go"); then sudo mkdir -p ${_place}/{dev/pts,proc,sys,run} || exit 1 sudo mount --bind /dev ${_place}/dev || exit 1 sudo mount -t devpts devpts -o gid=5,mode=0620 ${_place}/dev/pts || exit 1 sudo mount -t proc proc ${_place}/proc || exit 1 sudo mount -t sysfs sysfs ${_place}/sys || exit 1 sudo mount -t tmpfs tmpfs ${_place}/run || exit 1 if (test -h ${_place}/dev/shm); then sudo install -v -d -m 1777 ${_place}$(realpath /dev/shm) || exit 1 else sudo mount -t tmpfs -o nosuid,nodev tmpfs ${_place}/dev/shm || exit 1 fi sudo mkdir -p ${_place}/bin || exit 1 sudo cp -f /bin/bash ${_place}/bin/ || exit 1 sudo chroot ${_place} fi
问题原因
报错提示的“文件不存在”并非/bin/bash真的缺失,而是动态链接的bash依赖的系统库没有被复制到chroot环境中。现代Linux系统中的bash几乎都是动态链接版本,需要依赖libc、ld-linux等核心库才能启动。
修改后的脚本
#!/bin/bash _place="$(pwd)/jail" # 清理之前的环境 for _x in dev/shm run sys proc dev/pts dev; do sudo umount "${_place}/${_x}" >& /dev/null done for _x in dev/pts dev run sys proc; do sudo rmdir "${_place}/${_x}" >& /dev/null done sudo rm -rf "${_place}/bin" "${_place}/lib" "${_place}/lib64" >& /dev/null sudo rmdir "${_place}" >& /dev/null # 执行构建与chroot if [ "${1}" = "go" ]; then # 创建必要的目录结构 sudo mkdir -p "${_place}/{dev/pts,proc,sys,run,bin,lib,lib64}" || exit 1 # 挂载虚拟文件系统 sudo mount --bind /dev "${_place}/dev" || exit 1 sudo mount -t devpts devpts -o gid=5,mode=0620 "${_place}/dev/pts" || exit 1 sudo mount -t proc proc "${_place}/proc" || exit 1 sudo mount -t sysfs sysfs "${_place}/sys" || exit 1 sudo mount -t tmpfs tmpfs "${_place}/run" || exit 1 if [ -h "${_place}/dev/shm" ]; then sudo install -v -d -m 1777 "${_place}$(realpath /dev/shm)" || exit 1 else sudo mount -t tmpfs -o nosuid,nodev tmpfs "${_place}/dev/shm" || exit 1 fi # 复制bash到chroot环境 sudo cp -f /bin/bash "${_place}/bin/" || exit 1 # 复制bash依赖的动态链接库 # 用ldd获取依赖库列表,逐个复制到对应路径 ldd /bin/bash | awk '/=>/ {print $3}' | while read -r lib; do sudo cp -f "$lib" "${_place}$(dirname "$lib")/" || exit 1 done # 进入chroot环境 sudo chroot "${_place}" /bin/bash fi
关键修改点
- 添加lib/lib64目录:创建动态链接库需要的存放目录
- 复制依赖库:通过
ldd命令解析bash的依赖库,自动复制到chroot环境的对应路径 - 显式指定bash路径:chroot时明确指定
/bin/bash作为启动命令,避免依赖默认shell设置
内容的提问来源于stack exchange,提问作者user11140649
相关产品推荐
相关产品推荐

