用于自动执行多个分区的 luksHeaderBackup 的脚本

用于自动执行多个分区的 luksHeaderBackup 的脚本

我有几台服务器,每台服务器至少有六个 dm-crypt 分区。我希望有一种自动化的方法来确保我始终将 luks 标头备份存储在安全的地方。到目前为止我一直在手动进行标头备份。我的问题是,当我必须更换硬盘或进行其他系统更改时,我往往会忘记进行新的 luks 标头备份。

我正在寻找一个现有脚本,该脚本将检查 luks 标头备份是否存在,如果不存在,则创建一个。我必须假设有人已经编写了这样的脚本。 (它的必要性似乎是显而易见的。)

如果不存在,我将尝试为此目的制作一个 bash 脚本。

我的手动命令如下所示:

cryptsetup luksHeaderBackup /dev/sdXN --header-backup-file /path/to/backup/$mountpoint_luksHeader_$devUUID.img

我希望在头映像文件的文件名中包含挂载点和设备 UUID。

关于入门,我唯一的线索是我需要遍历所有设备并找到 type 的分区crypt,然后找到相应的挂载点和 UUID。我知道大部分信息都存在于 lsblk 和 blkid 中。我不确定如何提取它以在脚本中使用。

编辑:我的目标是根据安装点智能地命名文件。

每个 crypto_LUKS 设备都包含一个或多个 BTRFS 子卷。例如,crypto_LUKS 设备sysluks包含四个 btrfs 子卷,它们是:

  • @根
  • @var_log
  • @root_snapshots
  • @var_log_snapshots

该命令lsblk给出如下输出,其中只有最后一个要安装的子卷显示为安装点:

NAME         MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda            8:0    0  1.8T  0 disk  
└─sda2         8:2    0  1.8T  0 part  
└─sysluks  254:0    0  1.8T  0 crypt /var/log/.snapshots

用作/var/log/.snapshots包含根设备备份的文件的名称并不理想。

该命令findmnt -t btrfs将显示给定源(例如 /dev/mapper/sysluks)的所有挂载点。运行一些本地测试,findmnt似乎总是在系统启动时返回按安装顺序排序的列表。从该列表中选择第一个安装点将有助于我命名文件的目的,但选择最后一个安装点也是如此lsblk,它永远不会理想。

答案1

cd  /path/to/backup/
lsblk --fs --output FSTYPE,UUID | grep crypto_LUKS | tr -s ' ' | cut -d ' ' -f2 | \
while read uuid; do 
    mntpoint=$(lsblk /dev/disk/by-uuid/$uuid --output MOUNTPOINT | sed 1,1d | head -n 1)
    name="${mntpoint}_luksHeader_$uuid.img"
    if [[ ! -e "$name" ]]; then     
        cryptsetup luksHeaderBackup /dev/disk/by-uuid/$uuid --header-backup-file $name
    fi
done

更改您的备份路径,应该就可以了。只需知道,如果设备的挂载点发生更改,它将产生多个标头备份。否则,它将忽略已经备份的设备。

答案2

您可以循环调用此脚本:

https://github.com/stanclai/luks_backup

并将其添加到 cron.

一些注释/想法:

  1. 如果您的脚本不自动轮换,请考虑将备份日期添加到路径:/path/to/backup/$(date +%y%m%d)/$mountpoint_luksHeader_$devUUID.img,前面是mkdir -p /path/to/backup/$(date +%y%m%d)
  2. /path/to/backup/应位于不同的卷上,最好位于网络位置上:您不希望备份驻留在正在备份的同一磁盘/卷/服务器上,因为如果发生故障,您将无法访问。
  3. 在这两种情况下,请考虑使用有机备份系统来备份生成的文件。

干杯:)

相关内容