Отключение overlayfs вызывает нестабильность в usystem linux
Я пытаюсь использовать overlayfs для создания очень легкого контейнера в качестве тестовой среды (не предназначенной для защиты от взлома).
Я создал два сценария в качестве доказательства концепции: для создания тестовой среды и один для разборки среды.
Построение окружения, кажется, работает, хотя при этом создается множество монтировок, которые отображаются в окружении, а это не то, что я хотел, и, вероятно, именно они вызывают мои проблемы.
Затем у меня есть другой сценарий, чтобы раскрутить среду (т.е. удалить все монтирования, указывающие на мою среду), и тогда возникают проблемы. Просто выдача umounts для всех монтировок говорит мне, что устройства заняты, но umount с '-l' кажется в порядке, но через некоторое время (возможно, когда umounts действительно срабатывает) я обнаружил, что он говорит мне, что не может открыть какие-либо терминалы, и мне нужно перезагрузить систему, чтобы вернуть ее в рабочее состояние.
#!/bin/bash
#
# Create test environment
is_su()
{
id=`id -u`
if [ $id -ne 0 ]
then
echo >&2 $0: Must run under superuser - you do not have superuser authority.
exit 1
fi
}
#
# Check we are running with superuser authority (sudo)
is_su
#
# Temprarily set our test directory - later this will be a command parameter
base=$HOME/Dev/parden/test/t1
#
# Test we have a directory for local data and a union mount point
for dir in local mount
do
if [ ! -d "$base/$dir" ]
then
echo >&2 "$0: Directory '$base/$dir' missing."
exit 1
fi
done
#
# What is the non-super user we with to run under
usr=`users`
grp=( `groups` )
echo path=$PWD
ug=$usr:$grp
echo user=$ug
#
# Now create the union file system over the root
unionfs-fuse -o cow -o allow_other "/=ro:$base/local=rw" "$base/mount"
#
# Mount /dev and /tmp so we can still access real devices
mount --rbind /dev "$base/mount/dev"
mount --rbind /dev "$base/mount/tmp"
#
# Now place ourselves in jail until we want to get out
cd "$base/mount/$base"
chroot --userspec=$ug "$base/mount"
#!/bin/bash
#
# Unwind test environment
is_su()
{
id=`id -u`
if [ $id -ne 0 ]
then
echo >&2 $0: Must run under superuser - you do not have superuser authority.
exit 1
fi
}
umount_maps()
{
base=$1
#
# Collect list of mounts that mention test environment
mnt=$(mount -l | grep "$base" | sed -e "s/.* on //" -e "s/ .*//" | tr "\n", " ")
echo $(echo "$mnt" | wc -w) mounts found
if [ $(echo "$mnt" | wc -w) -eq 0 ]
then
return 1
fi
for m in $mnt
do
echo Dismounting $m
#
# Dismount using '-l' to stop a lot of looping to wait for device to become dismounted
umount -l $m
done
return 0
}
#
# Check we are running with superuser authority (sudo)
is_su
#
# Temprarily set our test directory - later this will be a command parameter
base=$HOME/Dev/parden/test/t1
#
# Dismount every device mapped to our test environment
umount_maps $base
#
# Wait a short while and try and run a sudo program and yo get
#
# --> sudo: no tty present and no askpass program specified
#
# and are unable to open more terminal sessions.
Я использую Ununtu 18.04.