2023-05-15 22:34:57 +03:00
|
|
|
source ../common.sh
|
|
|
|
|
|
|
|
requireEnvironment () {
|
2023-05-16 06:00:18 +03:00
|
|
|
requireSandboxSupport
|
|
|
|
[[ $busybox =~ busybox ]] || skipTest "no busybox"
|
|
|
|
if [[ $(uname) != Linux ]]; then skipTest "Need Linux for overlayfs"; fi
|
|
|
|
needLocalStore "The test uses --store always so we would just be bypassing the daemon"
|
2023-05-15 22:34:57 +03:00
|
|
|
}
|
|
|
|
|
2023-07-25 15:30:21 +03:00
|
|
|
addConfig () {
|
|
|
|
echo "$1" >> "$NIX_CONF_DIR/nix.conf"
|
|
|
|
}
|
|
|
|
|
2023-05-15 22:34:57 +03:00
|
|
|
setupConfig () {
|
2023-07-25 15:30:21 +03:00
|
|
|
addConfig "require-drop-supplementary-groups = false"
|
|
|
|
addConfig "build-users-group = "
|
2023-05-15 22:34:57 +03:00
|
|
|
}
|
|
|
|
|
2023-08-03 03:30:42 +03:00
|
|
|
enableFeatures "local-overlay-store"
|
2023-07-20 12:27:11 +03:00
|
|
|
|
2023-05-15 22:34:57 +03:00
|
|
|
storeDirs () {
|
2023-07-20 12:27:11 +03:00
|
|
|
# Attempt to create store dirs on tmpfs volume.
|
|
|
|
# This ensures lowerdir, upperdir and workdir will be on
|
|
|
|
# a consistent filesystem that fully supports OverlayFS.
|
|
|
|
storeVolume="$TEST_ROOT/stores"
|
|
|
|
mkdir -p "$storeVolume"
|
|
|
|
mount -t tmpfs tmpfs "$storeVolume" || true # But continue anyway if that fails.
|
|
|
|
|
|
|
|
storeA="$storeVolume/store-a"
|
|
|
|
storeBTop="$storeVolume/store-b"
|
2023-07-20 13:03:14 +03:00
|
|
|
storeBRoot="$storeVolume/merged-store"
|
|
|
|
storeB="local-overlay?root=$storeBRoot&lower-store=$storeA&upper-layer=$storeBTop"
|
2023-05-16 06:00:18 +03:00
|
|
|
# Creating testing directories
|
2023-07-20 12:27:11 +03:00
|
|
|
mkdir -p "$storeVolume"/{store-a/nix/store,store-b,merged-store/nix/store,workdir}
|
2023-05-15 22:34:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
# Mounting Overlay Store
|
|
|
|
mountOverlayfs () {
|
|
|
|
mount -t overlay overlay \
|
|
|
|
-o lowerdir="$storeA/nix/store" \
|
|
|
|
-o upperdir="$storeBTop" \
|
2023-07-20 12:27:11 +03:00
|
|
|
-o workdir="$storeVolume/workdir" \
|
2023-07-20 13:03:14 +03:00
|
|
|
"$storeBRoot/nix/store" \
|
2023-05-15 22:34:57 +03:00
|
|
|
|| skipTest "overlayfs is not supported"
|
|
|
|
|
|
|
|
cleanupOverlay () {
|
2023-07-20 13:03:14 +03:00
|
|
|
umount "$storeBRoot/nix/store"
|
2023-07-20 12:27:11 +03:00
|
|
|
rm -r $storeVolume/workdir
|
2023-05-15 22:34:57 +03:00
|
|
|
}
|
|
|
|
trap cleanupOverlay EXIT
|
|
|
|
}
|
|
|
|
|
2023-07-19 13:23:54 +03:00
|
|
|
remountOverlayfs () {
|
2023-07-20 13:03:14 +03:00
|
|
|
mount -o remount "$storeBRoot/nix/store"
|
2023-07-19 13:23:54 +03:00
|
|
|
}
|
|
|
|
|
2023-05-15 22:34:57 +03:00
|
|
|
toRealPath () {
|
|
|
|
storeDir=$1; shift
|
|
|
|
storePath=$1; shift
|
2023-07-20 12:27:35 +03:00
|
|
|
echo $storeDir$(echo $storePath | sed "s^${NIX_STORE_DIR:-/nix/store}^^")
|
2023-05-15 22:34:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
initLowerStore () {
|
|
|
|
# Init lower store with some stuff
|
|
|
|
nix-store --store "$storeA" --add ../dummy
|
|
|
|
|
|
|
|
# Build something in lower store
|
|
|
|
drvPath=$(nix-instantiate --store $storeA ../hermetic.nix --arg busybox "$busybox" --arg seed 1)
|
|
|
|
path=$(nix-store --store "$storeA" --realise $drvPath)
|
|
|
|
}
|
2023-05-16 06:00:18 +03:00
|
|
|
|
|
|
|
execUnshare () {
|
2023-07-19 15:25:37 +03:00
|
|
|
exec unshare --mount --map-root-user "$SHELL" "$@"
|
2023-05-16 06:00:18 +03:00
|
|
|
}
|
2023-07-19 17:09:58 +03:00
|
|
|
|
|
|
|
addTextToStore() {
|
|
|
|
storeDir=$1; shift
|
|
|
|
filename=$1; shift
|
|
|
|
content=$1; shift
|
|
|
|
filePath="$TEST_HOME/$filename"
|
|
|
|
echo "$content" > "$filePath"
|
|
|
|
nix-store --store "$storeDir" --add "$filePath"
|
|
|
|
}
|