Como ter uma montagem do sistema chroot compartilhada com seu host?

2

Digamos que eu chroot ed em ~/myroot com seu /mnt sendo montado por ligação a partir do /mnt do host. Agora (de dentro do ambiente chroot ) eu quero, por exemplo mount /dev/something /mnt/something de forma que não apenas o ~/myroot/mnt/something do host, mas também seu /mnt/something contenha essa montagem. Como isso pode ser alcançado?

Infelizmente, o comando mount de busybox parece não implementar --make-shared mencionado aqui , o que deve fazer mount --make-shared --bind /mnt ~/myroot/mnt executar no host fazer esse trabalho (não testado!), então como isso pode ser alcançado com busybox ?

    
por Tobias Kienzler 12.11.2013 / 17:06

2 respostas

1

Acho que a opção busybox de que você precisa é -o shared .

    
por 12.11.2013 / 18:57
1

Protótipo!

Uma maneira de fazer isso seria o seguinte script em execução no host:

#!/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

Ele ouve um canal nomeado ( ~/myroot/mnt/.mounts.cmd ), ao qual o chroot ed mount gravará, em vez de executar uma montagem real e, após a montagem no host, ligará a nova montagem ao chroot -ambiente.

O chroot ed mount é substituído por:

#!/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
    
por 13.11.2013 / 09:44