Acho que a opção busybox de que você precisa é -o shared
.
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
?
Acho que a opção busybox de que você precisa é -o shared
.
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