Написал такой скрипт он вроде бы и все копирует…
#!/usr/bin/env bash
die() { echo "$*" 1>&2 ; exit 1; }
get_partition() {
df -P "$1" | awk 'END{print $1}'
}
dst=$1
src=${2:-.}
if [[ ! $dst ]]
then
die "dst required"
fi
src_partition=$(get_partition "$src")
dst_partition=$(get_partition "$dst")
echo "Copy From: $src_partition"
echo "Copy To: $dst_partition"
IFS=$'\n' targets=( $(findmnt -t btrfs -o TARGET "$src_partition" | tail -n +2) )
echo ${targets[@]}
for target in ${targets[@]}
do
snapshots_dir=$target/.snapshots
echo $snapshots_dir
# Ищем последний снимок
max=$(ls -A "$snapshots_dir" | sort -n | tail -1)
if [[ ! $max ]]
then
echo "Empty .snapshots"
continue
fi
latest_snapshot=$snapshots_dir/$max/snapshot
echo $latest_snapshot
if [[ ! -e $latest_snapshot ]]
then
echo "Snapshot does not exists"
continue
fi
uuid=$(cat /proc/sys/kernel/random/uuid)
# echo $uuid
mount_dir=$dst/$uuid
mkdir -p -m 755 $mount_dir
subvol=@$uuid
btrfs sub create "$subvol"
# Используем максимальное сжатие
mount -o noatime,compress=zlib:9,space_cache,subvol="$subvol" "$dst_partition" "$mount_dir"
btrfs send "$latest_snapshot" | btrfs receive "$mount_dir"
# umount $mount_dir
done
echo "Finished"
Но я не могу от этих ошибок избавиться:
$ sudo make-backup.sh /mnt/storage
[sudo] password for sergey:
Copy From: /dev/nvme0n1p5
Copy To: /dev/sda
/ /var /home
//.snapshots
//.snapshots/4/snapshot
Create subvolume './@990bccd2-5b90-4c60-a440-39693ec6df6e'
mount: /mnt/storage/990bccd2-5b90-4c60-a440-39693ec6df6e: mount(2) system call failed: No such file or directory.
At subvol //.snapshots/4/snapshot
At subvol snapshot
Я даже не уверен, что он монтируется правильно. Идея такая: есть snapper, он каждые 24 часа делает снимки системы и ради спортивного интереса хочу копировать снимок (воссаздать из него всю структуру) и разместить копию на флешке с максимальным сжатием.