chroot 시스템 마운트를 호스트와 공유하는 방법은 무엇입니까?

chroot 시스템 마운트를 호스트와 공유하는 방법은 무엇입니까?

호스트 의 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) 를 수신하고 호스트에 설치된 후 새 설치를 환경에 바인딩합니다 .chrootmountchroot

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

관련 정보