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