#!/bin/sh . sami/btrfs-functions.sh . sami/var.sh disable_stdout() { exec 3>&1; exec >&2; } enable_stdout() { exec >&3; } with_stdout() { enable_stdout; "$@"; disable_stdout; } create_layer_filesystem() { [ ! -e "$layer_file" ] || return ! mountpoint "$mountpoint" || return mkdir -p "$mountpoint" && sex dd if=/dev/zero of="$layer_file" bs=1M count="$layer_size" && sex mount -o subvol=/,compress "$seed_file" "$mountpoint" && layer_dev=$(losetup -f --show "$layer_file") && sex btrfs device add "$layer_dev" "$mountpoint" && mount -o rw,remount "$mountpoint" } finish() { local subv_id sex mv "$mountpoint"/ROOT "$mountpoint"/ROOT.old || return sex btrfs subvolume snapshot "$mountpoint"/"$receive_subv" "$mountpoint"/ROOT || return subv_id=$(btrfs_show_subvolume_id "$mountpoint"/ROOT) || return sex btrfs subvolume set-default "$subv_id" "$mountpoint" || return sex btrfs subvolume delete "$mountpoint"/ROOT.old || return umount "$mountpoint" || return sex btrfstune -S1 "$layer_file" || return losetup -d "$layer_dev" } set -e disable_stdout receive_dest=$1 receive_subv=$2 [ "$receive_subv" ] [ "$receive_dest" ] mountpoint=$(realpath -m --relative-base=. "$receive_dest") seed_file=sami/debian-live-8.4.0-amd64-standard.btrfs layer_file_FINAL=sami/debian-live-8.4.0-amd64-standard.layer.$receive_subv.btrfs layer_file=$layer_file_FINAL.part layer_size=1000 create_layer_filesystem with_stdout sex btrfs receive "$mountpoint" finish mv "$layer_file" "$layer_file_FINAL"