From 59df1261e0dc123c22dde588ced5c3abbf8300ca Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Fri, 22 Apr 2016 16:03:26 -0400 Subject: updated btrfs send/recv code; script to put layered seed on iso --- btrfs-functions.sh | 42 +++++++++++++++++++++++++++++++++--------- btrfs-receive-root.sh | 45 ++++++++++++++++++++++++++++----------------- btrfs-send-root.sh | 4 +++- xorriso-layer.sh | 23 +++++++++++++++++++++++ 4 files changed, 87 insertions(+), 27 deletions(-) create mode 100755 xorriso-layer.sh diff --git a/btrfs-functions.sh b/btrfs-functions.sh index 3648c24..b83b94d 100644 --- a/btrfs-functions.sh +++ b/btrfs-functions.sh @@ -100,28 +100,52 @@ btrfs_show_default_path() mp=$(btrfs_get_mountpoint "$mp") || die # TODO: fix caller? btrfs_mountpoint "$mp" || die "not a mountpoint: $mp" path=$(btrfs subvolume get-default "$mp"/|sed -n -e 's/.* path //p') - printf '%s\n' "$mp/$path" + if [ "$path" ]; then + printf '%s\n' "$mp/$path" + else + printf '%s\n' "$mp" + fi +} + +btrfs_show_default_id() +{ + $(ARGS_NE mp) + local id + mp=$(btrfs_get_mountpoint "$mp") || die # TODO: fix caller? + btrfs_mountpoint "$mp" || die "not a mountpoint: $mp" + id=$(btrfs subvolume get-default "$mp"/|sed -n -e 's/^ID \([^ ]*\) .*/\1/p') + [ "$id" ] || return + echo $id } btrfs_replace_default_subvolume_with() { $(ARGS_NE new_default) - local old_default subvol_id - old_default=$(btrfs_show_default_path "$new_default") || die + local old_default old_default_id new_default_id + old_default_id=$(btrfs_show_default_id "$new_default") || die + new_default_id=$(btrfs_show_subvolume_id "$new_default") || die + + [ "$new_default_id" = "$old_default_id" ] && return + + if [ "$old_default_id" != 5 ]; then + old_default=$(btrfs_show_default_path "$new_default") || die + else + old_default= + fi - [ "$new_default" = "$old_default" ] && return + btrfs subvolume set-default "$new_default_id" "$new_default" || die - subvol_id=$(btrfs_show_subvolume_id "$new_default") || die - btrfs subvolume set-default "$subvol_id" "$new_default" || die - btrfs subvolume delete "$old_default" - sex mv "$new_default" "$old_default" + if [ "$old_default" ]; then + btrfs subvolume delete "$old_default" + sex mv "$new_default" "$old_default" + fi } btrfs_show_subvolume_id() { $(ARGS_NE path) local result - result=$(btrfs subvolume show "$path" | sed -n -e 's/^[ \t]*Subvolume ID:[ \t]*//p') + result=$(btrfs subvolume show "$path" | sed -n -e 's/^[ \t]*Subvolume ID:[ \t]*//p; s/.*is toplevel subvolume/5/p') if [ "$result" ] then printf '%s\n' "$result" else false diff --git a/btrfs-receive-root.sh b/btrfs-receive-root.sh index 178fd64..175dd49 100644 --- a/btrfs-receive-root.sh +++ b/btrfs-receive-root.sh @@ -1,10 +1,7 @@ #!/bin/sh -layer_dir=/home/d/sami -seed_file=debian-live-8.4.0-amd64-standard.btrfs -layer_file=debian-live-8.4.0-amd64-standard.layer.$$.btrfs -layer_size=1000 -mountpoint=layer_dest.$$ +. sami/btrfs-functions.sh +. sami/var.sh disable_stdout() { exec 3>&1; exec >&2; } enable_stdout() { exec >&3; } @@ -14,24 +11,38 @@ with_stdout() { enable_stdout; "$@"; disable_stdout; } create_layer_filesystem() { [ ! -e "$layer_file" ] || return - mkdir -p "$mountpoint" && - dd if=/dev/zero of="$layer_file" bs=1M count="$layer_size" && - mount -o subvol=/,compress "$seed_file" "$mountpoint" && - layer_dev=$(losetup -f --show "$layer_file") && - btrfs device add "$layer_dev" "$mountpoint" && + ! 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() { - umount "$mountpoint" && - btrfstune -S1 "$layer_file" + btrfs_replace_default_subvolume_with "$mountpoint"/"$receive_subv" && + umount "$mountpoint" && + sex btrfstune -S1 "$layer_file" && + losetup -d "$layer_dev" } -set -ex +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=sami/debian-live-8.4.0-amd64-standard.layer.$receive_subv.btrfs +layer_size=1000 -cd "$layer_dir" && -disable_stdout && -create_layer_filesystem && -with_stdout btrfs receive "$mountpoint" && +create_layer_filesystem +with_stdout sex btrfs receive "$mountpoint" finish diff --git a/btrfs-send-root.sh b/btrfs-send-root.sh index 6152db8..25e60f2 100644 --- a/btrfs-send-root.sh +++ b/btrfs-send-root.sh @@ -10,7 +10,8 @@ rootfs_uuid () remote_btrfs_receiver() { # ssh "$BTRFS_RECEIVE_DESTINATION_HOST" -- "sudo btrfs receive $(shellescape "$BTRFS_RECEIVE_DESTINATION_PATH")" - ssh "$BTRFS_RECEIVE_DESTINATION_HOST" -- "sudo sh sami/btrfs-receive-root.sh" + ssh "$BTRFS_RECEIVE_DESTINATION_HOST" -- \ + "sudo sh sami/btrfs-receive-root.sh $(shellescape "$BTRFS_RECEIVE_DESTINATION_PATH") $(shellescape "$BTRFS_RECEIVE_SUBVOLUME_NAME")" } dummy_receiver() @@ -32,6 +33,7 @@ push_remote() esac local BTRFS_RECEIVE_DESTINATION_PATH="${ssh_dst#*:}" local BTRFS_RECEIVE_DESTINATION_HOST="${ssh_dst%%:*}" + local BTRFS_RECEIVE_SUBVOLUME_NAME="${snap_dir#$mnt/}" push_helper false "$snap_dir" "$prev_dir" "$src" remote_btrfs_receiver } diff --git a/xorriso-layer.sh b/xorriso-layer.sh new file mode 100755 index 0000000..1afb9f8 --- /dev/null +++ b/xorriso-layer.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +outdev=debian-live-8.4.0-amd64-standard.btrfs.layered.iso +indev=debian-live-8.4.0-amd64-standard.btrfs.iso +volid=SamizdatLive +btrfs_layer_iso_path=live/layer.btrfs +btrfs_layer_filesystem=debian-live-8.4.0-amd64-standard.layer.snapshot.2016-04-22.154447.btrfs + +die() { printf '%s\n' "$*"; exit 1; } + +set -ex + +cp --reflink "$indev" "$outdev"~ +time xorriso \ + -drive_class clear_list all \ + -outdev "$outdev"~ -indev "$outdev"~ \ + -report_about mishap \ + -volid "$volid" \ + -return_with sorry 0 \ + -pathspecs on -overwrite on \ + -add_plainly any \ + "${btrfs_layer_iso_path}=${btrfs_layer_filesystem}" +mv -f "$outdev"~ "$outdev" -- cgit v1.2.3