ホストの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
元気!
1つの方法は、ホストシステムで次のスクリプトを実行することです。
#!/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