天天看点

chatgpt 生成的基于 btrfs snap 功能的自动备份

作者:rixaahf

能懒则懒,不想写代码了

me

在 bash 环境下,创建一个 btrfs 快照功能的备份脚本 btrfs_backup.sh, 使用的方式为: btrfs_backup.sh day src dest; day 表示最大的备份天数, src 表示 btrfs 的源目录, dest 表示 snapshots 的目录, 如果 snapshots 目录不存在,则创建它, 每个快照均以 day-%d 的格式存放,如果快照超过了传入的最大备份参数,则删除最老的快照

ChatGPT

下面是一个示例的 bash 脚本 btrfs_backup.sh,实现了创建 btrfs 快照的备份功能:

#!/bin/bash

# 获取输入参数
day=$1
src=$2
dest=$3

# 检查snapshots目录是否存在,如果不存在则创建它
if [[ ! -d "$dest" ]]; then
  mkdir -p "$dest"
fi

# 创建当前日期的快照
snapshot_name="day-$(date +'%d')"
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"

# 删除超过最大备份天数的快照
snapshots=("$dest"/day-*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
  num_to_delete=$((num_snapshots - day))
  for ((i=0; i < num_to_delete; i++)); do
    oldest_snapshot="${snapshots[$i]}"
    btrfs subvolume delete "$oldest_snapshot"
  done
fi           

你可以将上述脚本保存为 btrfs_backup.sh 文件,并赋予执行权限:

然后,你可以使用以下方式来调用脚本,指定最大备份天数、源目录和快照目录:

./btrfs_backup.sh 7 /path/to/src /path/to/snapshots           

上述示例中,脚本会将源目录 /path/to/src 创建为只读的 btrfs 快照,并存储在 /path/to/snapshots 目录中。如果 /path/to/snapshots 目录不存在,脚本会自动创建它。同时,脚本会检查是否存在超过最大备份天数的快照,并删除最老的快照。

请注意,使用该脚本前,请确保你具有足够的权限执行 btrfs 相关命令,并对脚本中的路径进行正确配置。此外,该脚本仅提供了一个基本的备份功能示例,你可以根据实际需求进行修改和扩展。

me

snapshot_name 应该是 yyyy-mm-dd 的格式

ChatGPT

如果你想要以 yyyy-mm-dd 的格式命名快照,可以按照以下方式修改脚本中的 snapshot_name 部分:

# 创建当前日期的快照
snapshot_name=$(date +'%Y-%m-%d')
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"           

在上述示例中,使用 $(date +’%Y-%m-%d’) 获取当前日期,并将其作为快照的名称。这样就会按照 yyyy-mm-dd 的格式命名快照。

记住,根据你的需求,你可能还需要在删除过期快照的部分进行相应的修改,以适应新的快照名称格式。

ChatGPT

如果要根据新的快照名称格式 yyyy-mm-dd 删除过期的快照,你可以按照以下方式修改删除过期快照的部分:

# 删除超过最大备份天数的快照
snapshots=("$dest"/*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
  num_to_delete=$((num_snapshots - day))
  for ((i=0; i < num_to_delete; i++)); do
    oldest_snapshot="${snapshots[$i]}"
    oldest_snapshot_date=$(basename "$oldest_snapshot")
    oldest_snapshot_date=${oldest_snapshot_date#"day-"}  # 移除前缀 "day-"

    # 检查快照日期是否超过最大备份天数
    snapshot_date=$(date -d "$oldest_snapshot_date" +%s)
    max_date=$(date -d "-$day days" +%s)
    if [[ $snapshot_date -lt $max_date ]]; then
      btrfs subvolume delete "$oldest_snapshot"
    fi
  done
fi           

在上述示例中,我们将快照名称中的日期部分提取出来,并将其转换为 Unix 时间戳,以便进行比较。然后,我们计算最大备份日期(即当前日期减去最大备份天数),并将其转换为 Unix 时间戳。最后,我们比较快照日期和最大备份日期,并根据需要删除过期的快照。

请注意,上述示例假定快照名称的日期部分是符合 yyyy-mm-dd 格式的。如果你的日期格式有所不同,你需要相应地调整 oldest_snapshot_date 和日期格式化的部分。

通过以上修改,你应该可以根据新的快照名称格式删除过期的快照。记得在使用脚本之前,确保对 btrfs 相关命令拥有足够的权限,并根据实际路径配置脚本中的路径。

ChatGPT

以下是修改后的完整脚本 btrfs_backup.sh,实现了按照 yyyy-mm-dd 格式创建和删除过期快照的功能:

#!/bin/bash

# 获取输入参数
day=$1
src=$2
dest=$3

# 检查snapshots目录是否存在,如果不存在则创建它
if [[ ! -d "$dest" ]]; then
  mkdir -p "$dest"
fi

# 创建当前日期的快照
snapshot_name=$(date +'%Y-%m-%d')
btrfs subvolume snapshot -r "$src" "$dest/$snapshot_name"

# 删除超过最大备份天数的快照
snapshots=("$dest"/*)
num_snapshots=${#snapshots[@]}
if [[ $num_snapshots -gt $day ]]; then
  num_to_delete=$((num_snapshots - day))
  for ((i=0; i < num_to_delete; i++)); do
    oldest_snapshot="${snapshots[$i]}"
    oldest_snapshot_date=$(basename "$oldest_snapshot")
    oldest_snapshot_date=${oldest_snapshot_date#"day-"}  # 移除前缀 "day-"

    # 检查快照日期是否超过最大备份天数
    snapshot_date=$(date -d "$oldest_snapshot_date" +%s)
    max_date=$(date -d "-$day days" +%s)
    if [[ $snapshot_date -lt $max_date ]]; then
      btrfs subvolume delete "$oldest_snapshot"
    fi
  done
fi           

你可以将上述脚本保存为 btrfs_backup.sh 文件,并赋予执行权限:

然后,你可以使用以下方式来调用脚本,指定最大备份天数、源目录和快照目录:

./btrfs_backup.sh 7 /path/to/src /path/to/snapshots           

脚本会将源目录 /path/to/src 创建为只读的 btrfs 快照,并存储在 /path/to/snapshots 目录中。如果 /path/to/snapshots 目录不存在,脚本会自动创建它。脚本还会检查是否存在超过最大备份天数的快照,并删除最老的快照。

请注意,使用该脚本前,请确保你具有足够的权限执行 btrfs 相关命令,并对脚本中的路径进行正确配置。此外,根据实际需求,你可能需要根据日期格式进行调整和修改。

继续阅读