Skip to content

Instantly share code, notes, and snippets.

@siers
Last active June 3, 2017 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save siers/a1af5efc03c96554b3fe8a92584f11bc to your computer and use it in GitHub Desktop.
Save siers/a1af5efc03c96554b3fe8a92584f11bc to your computer and use it in GitHub Desktop.
Overlayfs example
#!/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
#!/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