Last active
June 3, 2017 16:39
-
-
Save siers/a1af5efc03c96554b3fe8a92584f11bc to your computer and use it in GitHub Desktop.
Overlayfs example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
more="$@" | |
saved="$EUID" | |
if [ "$EUID" = "0" ]; then | |
echo "don't run as root" | |
exit | |
fi | |
m="/tmp/mount-point" | |
exec sudo unshare -m /bin/bash <<UNSHARED | |
mkdir -p "$m" | |
mount -t tmpfs tmpfs "$m" | |
cd "$m" | |
mkdir top merge work | |
mount -t overlay overlay -o lowerdir=/,upperdir=top,workdir=work merge | |
#bash < /dev/tty | |
chroot merge sh -c 'sudo -u "#$saved" sh -c "id; ls /proc -lR"' | |
UNSHARED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/zsh | |
set -eu | |
grep -q . /etc/gshadow # assert root | |
dir=/tmp/overlayfstest | |
create-dirs() { | |
(find "$dir" -type d | xargs umount 2> /dev/null) 2> /dev/null || : | |
rm -rf $dir | |
mkdir -p $dir/{main/{upper,lower,work,merged},tmp} | |
cd $dir/main | |
} | |
# seperate dirs, single shared file, one being on top | |
create-data-a() { | |
touch \ | |
upper/u$RANDOM \ | |
lower/l$RANDOM \ | |
nr=$RANDOM | |
echo upper > upper/both-$nr | |
echo lower > lower/both-$nr | |
} | |
# touch upper/upper/upper, lower/lower/lower. | |
# Where will touch lower/lower/new | |
create-data-b() { | |
mkdir upper/upper lower/lower | |
touch upper/upper/upper lower/lower/lower | |
} | |
create-data-c() { | |
mkdir lower/directory | |
touch lower/directory/deletable | |
} | |
showcast() { | |
# data-a | |
ls merged | |
touch merged/new | |
touch lower | |
# data-b | |
touch lower/lower/should-be-lower | |
# data-c | |
find -type c | sort > $dir/tmp/1 | |
rm merged/directory/deletable | |
rm merged/lower/lower | |
find -type c | sort > $dir/tmp/2 | |
diff $dir/tmp/{1,2} || : # TWO `rm`S, BUT ONLY ONE MARK OF IT! | |
ls -l upper/directory/deletable | |
# show the results | |
tree -a; echo; cat merged/both-$nr | |
} | |
create-dirs | |
create-data-a # basic expose | |
create-data-b # find out where will files go when written to lowerdirs | |
create-data-c # touch a file to delete | |
mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged | |
(set -x; showcast) # outputs `tree'(1). | |
umount merged | |
exit | |
" | |
code/gists/overlayfs-showcast.sh master % sudo ./overlayfs-showcast.zsh | |
+./overlayfs-showcast.zsh:67> showcast | |
+showcast:2> ls merged | |
b24170 directory l17395 lower u1629 upper | |
+showcast:4> touch merged/new | |
+showcast:5> touch lower | |
+showcast:8> touch lower/lower/should-be-lower | |
+showcast:11> find -type c | |
+showcast:11> sort | |
+showcast:12> rm merged/directory/deletable | |
+showcast:13> rm merged/lower/lower | |
+showcast:14> find -type c | |
+showcast:14> sort | |
+showcast:15> diff /tmp/overlayfstest/tmp/1 /tmp/overlayfstest/tmp/2 | |
0a1,2 | |
> ./upper/directory/deletable | |
> ./upper/lower/lower | |
+showcast:15> : | |
+showcast:16> ls -l upper/directory/deletable | |
c--------- 1 root root 0, 0 Mar 19 16:54 upper/directory/deletable | |
+showcast:19> tree -a | |
. | |
├── lower | |
│ ├── b24170 | |
│ ├── directory | |
│ │ └── deletable | |
│ ├── l17395 | |
│ └── lower | |
│ ├── lower | |
│ └── should-be-lower | |
├── merged | |
│ ├── b24170 | |
│ ├── directory | |
│ ├── l17395 | |
│ ├── lower | |
│ │ └── should-be-lower | |
│ ├── new | |
│ ├── u1629 | |
│ └── upper | |
│ └── upper | |
├── upper | |
│ ├── b24170 | |
│ ├── directory | |
│ │ └── deletable | |
│ ├── lower | |
│ │ └── lower | |
│ ├── new | |
│ ├── u1629 | |
│ └── upper | |
│ └── upper | |
└── work | |
└── work | |
13 directories, 17 files | |
+showcast:19> echo | |
+showcast:19> cat merged/b24170 | |
upper |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment