호스트 의 chroot
.Now ( from~/myroot
/mnt
/mnt
이내에환경 chroot
) mount /dev/something /mnt/something
예를 들어 호스트뿐만 ~/myroot/mnt/something
아니라그것은 /mnt/something
이 마운트가 포함되어 있습니다. 이것이 어떻게 달성될 수 있습니까?
불행하게도 mount
이 명령은 언급된 내용을 busybox
구현하지 않는 것 같습니다.--make-shared
여기, mount --make-shared --bind /mnt ~/myroot/mnt
호스트 시스템에서 실행 중인 경우 이 작업을 수행해야 합니다(테스트되지는 않았지만!). 그러면 어떻게 사용합니까 busybox
?
답변1
내 생각에 당신에게 필요한 busybox 옵션은 입니다 -o shared
.
답변2
원기!
한 가지 방법은 호스트 시스템에서 다음 스크립트를 실행하는 것입니다.
#!/bin/bash
# host: bind-mount
PREFIX="~/myroot"
MNT="/mnt"
MNT=${MNT#/}
CMD=$PREFIX/$MNT/.mounts.cmd
OUT=$PREFIX/$MNT/.mounts.out
ERR=$OUT
#ERR=$PREFIX/$MNT/.mounts.err
echo "Using prefix $PREFIX"
if ! [ -d $PREFIX/$MNT ]; then
mkdir -p $PREFIX/$MNT
echo "Created $PREFIX/mnt"
fi
for i in $CMD $OUT $ERR; do
if ! [ -e $i ]; then
mkfifo $i
echo "Created $i"
fi
done
trap "exit 0" SIGINT
while true; do
( # subshell for better output redirection
line=$(cat $CMD)
# FIXME there's a problem if this script doesn't react fast
# enough such that .mounts.cmd contains more than one line...
# This is a VERY primitive parser of arguments that will fail
# in many situations, hence PROTOTYPE
if [ "$line" == "QUIT" ]; then
exit 254;
fi
isopttype=false
for para in $line; do
if $isopttype; then
switches="$switches$para "
isopttype=false
else
case $para in
-a)
echo "mount -a not supported!" >&2
exit 253
;;
-o|-O|-t)
isopttype=true
switches="$switches$para "
;;
-*)
switches="$switches$para "
;;
*)
if [ -z "$src" ]; then
src=$para
elif [ -z "$dest" ]; then
dest=$para
else
echo "Confused by $para after src=$src and dest=$dest" >&2
exit 252
fi
;;
esac
fi
done
if [ -z "$src" ] || [ -z "$dest" ]; then
echo "Please provide both mount source and destination!" >&2
exit 251
fi
mount $PREFIX/${src#/} $dest $switches && mount --bind $dest $PREFIX/${dest#/}
) >>$OUT 2>>$ERR
[[ $? == 254 ]] && exit 0
done
for i in $CMD $OUT $ERR; do
rm $i
done
실제 설치를 수행하는 대신 ed 가 기록할 명명된 파이프( ~/myroot/mnt/.mounts.cmd
) 를 수신하고 호스트에 설치된 후 새 설치를 환경에 바인딩합니다 .chroot
mount
chroot
ed는 다음으로 대체 chroot
됩니다 mount
.
#!/bin/bash
# chroot: talk to hosts mount-listener
MNT="/mnt"
CMD=$MNT/.mounts.cmd
OUT=$MNT/.mounts.out
ERR=$OUT
#ERR=$MNT/.mounts.err
echo "$@" > $CMD
cat < $OUT # TODO output $ERR to stderr