#!/bin/bash mount_count=128 function print_usage() { if [ -n "$2" ]; then echo "Error: $2" echo fi echo "Usage: $1 [seed]" echo "(If no seed is given, it will be randomly generated.)" } scratch_dir=$1 if [ -z "$scratch_dir" ]; then print_usage "$0" 'No scratch dir given' >&2 exit 1 fi if [ ! -d "$scratch_dir" ]; then print_usage "$0" "$scratch_dir is not a directory" >&2 exit 1 fi seed=$2 if [ -z "$seed" ]; then seed=$RANDOM fi RANDOM=$seed echo "Seed: $seed" set -e shopt -s nullglob cd "$scratch_dir" if [ -d share ]; then echo 'Error: This directory seems to be in use already' >&2 exit 1 fi for ((i = 0; i < $mount_count; i++)); do printf "Setting up fs %i/%i...\r" "$((i + 1))" "$mount_count" rm -f fs$i.img truncate -s 512M fs$i.img mkfs.xfs -q fs$i.img devs[i]=$(sudo losetup -f --show fs$i.img) done echo top_level_mounts=$((RANDOM % mount_count + 1)) mkdir -p share echo 'root' > share/some-file for ((i = 0; i < $top_level_mounts; i++)); do printf "Mounting fs %i/%i...\r" "$((i + 1))" "$mount_count" mkdir -p share/mnt$i touch share/mnt$i/not-mounted sudo mount "${devs[i]}" share/mnt$i sudo chown "$(id -u):$(id -g)" share/mnt$i pushd share/mnt$i >/dev/null path=mnt$i nesting=$((RANDOM % 4)) for ((j = 0; j < $nesting; j++)); do cat > some-file < some-file </dev/null done for ((; i < $mount_count; i++)); do printf "Mounting fs %i/%i...\r" "$((i + 1))" "$mount_count" mp_i=$((i % top_level_mounts)) pushd share/mnt$mp_i >/dev/null path=mnt$mp_i while true; do sub_mp="$(echo mnt*)" if cd sub 2>/dev/null; then path="$path/sub" elif [ -n "$sub_mp" ] && cd "$sub_mp" 2>/dev/null; then path="$path/$sub_mp" else break fi done mkdir mnt$i touch mnt$i/not-mounted sudo mount "${devs[i]}" mnt$i sudo chown "$(id -u):$(id -g)" mnt$i cd mnt$i path="$path/mnt$i" nesting=$((RANDOM % 4)) for ((j = 0; j < $nesting; j++)); do cat > some-file < some-file </dev/null done echo echo 'Done.'