使用 Linux,我有几个备份级别。其中之一是定期将dd
笔记本电脑硬盘逐扇区复制到外部 USB 磁盘(使用)。是的,我还有其他备份,例如远程 rsync。
dd
在克隆没有 LVM 卷的 HDD 时,这种方法(磁盘)是可行的,因为我可以随时插入外部磁盘并简单地挂载分区/dev/sdb*
,而不是挂载/dev/sda*
。简单又方便。
今天我把所有硬盘(包括/boot
)都移到了 LVM。一切正常。我会对它进行几天的测试,然后逐个扇区地复制到我的外部硬盘上。
我想,现在我遇到一个问题了。
如果将来我插入外部 USB HDD 来恢复任何文件,操作系统将检测到重复的 LVM 配置,具有相同的名称和相同的 UUID。即使执行vgrename
(哪个 LVM 将被重命名,内部 HDD 还是外部 HDD?),克隆出来的UUID不会改变。有没有命令可以更改名称和 UUID?理想情况下,我会克隆 HDD,然后更改 LVM 组名及其 UUID,但我不知道如何操作。
另一个相关问题是......
过去,我使用外部磁盘启动笔记本电脑,使用 BIOS 启动菜单并手动更改 GRUB 条目以从 启动,/dev/sdb
而不是/dev/sda
。但现在我当前的 GRUB 配置直接从 LVM 逻辑卷启动,类似于:set root='(LVM-root)'
在我的grub.cfg
。所以...重复的卷将会发生什么情况?
有什么建议吗?
我想我可以重新分区我的外部硬盘并将备份策略从更改为dd
,rsync
但此磁盘也安装了 Windows,我真的希望拥有一个物理的“真实”副本。
答案1
我同意前面的一个答案——在整个磁盘上运行 dd 并不是一个好的解决方案。如果您使用 dd 的原因与备份另一个操作系统有关,那么您可以只对其他操作系统分区使用 dd,对 Linux 分区使用 rsync。
部分问题在于,如果您在启动并挂载文件系统的情况下对整个磁盘运行 dd,则无法确保备份的一致性。它可能 10 次中有 9 次都能正常工作,但在任何负载下,生成的备份都可能损坏。确保不会发生这种情况的唯一方法是卸载所有文件系统并在 dd 运行的整个时间内停用所有卷组。如果您的 / 是从 LVM 挂载的,则不太方便。
无论如何,如果您坚持使用这种方法,您要寻找的用于重命名重复 vg 的工具称为“vgimportclone”。它旨在用于设备级快照,但它也可以与 dd 一起使用。
答案2
一年后,这个问题终于解决了。我把答案写在了我的个人网站。我希望它对其他人有用。
我使用多种级别的备份,从 rsync 到外部磁盘,再到通过远程计算机进行 rsync+ZFS。我执行的备份之一是 - 不时 - 从我的笔记本电脑硬盘“dd”到连接的外部 USB(仅在备份过程期间连接)。例如,我在带着笔记本电脑旅行之前会这样做。
此过程运行良好。直到我开始在笔记本电脑上使用 LVM。
如果您在计算机上使用 LVM,使用
dd
(从 LiveCD 启动)复制硬盘,并在计算机正常运行时插入外部硬盘,那么稍后您将损坏数据,甚至丢失所有文件系统并且无法修复!!!。为什么?因为当您插入外部硬盘时,操作系统会在两个磁盘中看到相同的 LVM 配置,并会天真地认为两个磁盘是相同的,可以通过多路径链接访问,因此它会在两个磁盘之间传播读写操作,从而不可挽回地损坏两者。您将丢弃实时数据和备份!
这种情况我遇到过一次。我丢失了数据。几天前我还有其他备份,所以我没有丢失任何非常重要的东西,但这很烦人,暴露了我的备份策略的一个缺陷。
解决方案:确保备份磁盘中的 LVM 配置不同。问题是……该怎么办?
我在 superuser.com (Stack Exchange) 上发布了这个问题,但没有得到任何好的答案。所以我开发了自己的程序,经过一年多的实战测试,我在这里发布了它并关闭了原始问题:
确保如果出现问题,您的计算机不会自动启动。就我的情况而言,如果电源关闭并再次打开,我的笔记本电脑不会自动启动。此外,硬盘已加密,因此它会要求输入密码。
这是必要的,因为如果在完成该过程之前使用连接的备份磁盘重新启动,则可能会损坏两个磁盘。
从 Live CD 启动。如果您希望恢复数据,则不能从活动分区执行“dd”:-)。
将来可以尝试使用 LVM 快照,以便在使用计算机时进行备份,但这样一来,我就会遇到重复的 LVM 问题,而这正是我试图避免的问题。另一种选择是重新配置 LVM,将数据实时镜像到外部硬盘,并在同步完成后中断镜像。但这听起来很危险,而且不会备份我的 Windows 分区或我没有保存在 LVM 卷中的数据。
启动 LiveCD 后,插入外部 USB 硬盘。
以“root”身份登录并执行
vgchange -a n
。此命令将禁用两个磁盘中的 LVM。为了确保万无一失,我执行了几次该命令。确保
/dev/sda
是源(内置硬盘)和/dev/sdb
目标(USB 外置硬盘)。例如,执行dd if=/dev/sdb of=/dev/null
并检查哪个硬盘 LED 闪烁。当您确定哪个磁盘是哪个磁盘时,您可以使用 进行复制
dd if=/dev/sda of=/dev/sdb bs=65536
。按照我的配置,备份需要四个小时。我的内置硬盘是 500GB,我的 USB 以 35MB/s 的速度复制。我晚上睡觉时这样做。您的外部 USB 硬盘必须至少与您的内置硬盘一样大。这很明显,不是吗?
完成此复制后,您将获得内部硬盘的精确克隆。备份已完成。但现在,如果您在使用内部硬盘时将此硬盘插入计算机,就会出现问题,如前所述。我们需要更改 LVM 配置。
现在,“dd”完成后,执行“sync”并拔下外部 UDB 硬盘。
您执行
pvchange --uuid /dev/sda*
。此命令将更改内部硬盘中所有物理卷的 UUID。即使您有非 LVM 物理卷的分区,此命令也是安全的,因为它们将被自动安全地跳过。系统知道哪些分区是物理卷,因为分区类型以及您在创建 LVM 时执行了“pvcreate”。
您执行
vgchange -u LVM
。此命令将更改 LVM 卷组的 UUID。顺便说一下,我的卷组名为“LVM”。您执行
vgscan
。此命令将扫描内部硬盘(当前唯一连接的硬盘)并在那里找到您的 LVM 卷组。执行
vgrename LVM LVM2
,可以更改卷组的名称。现在插入外部 USB 硬盘。
再次“vgscan”,这次是为了找到外部 USB 硬盘中的卷组。现在您将拥有两个卷组。一个在您的内部硬盘中称为“LVM2”,另一个在您的 USB 外部硬盘中称为“LVM”。
使用 重命名外部 USB 硬盘中的卷组
vgrename LVM LVM_BACKUP
。并将内置硬盘中的卷组重命名为原来的名称:
vgrename LVM2 LVM
。您已完成。您可以使用 来查看情况
vgdisplay -v
。您将看到两个卷组中的逻辑卷 UUID 是相同的,但这似乎不会造成任何问题,而且我不知道如何更改它们。
拔下外部 USB 硬盘,将其存放在安全的地方,重新启动计算机,弹出 LiveCD 并恢复工作。
答案3
仔细研究这个问题,我认为正确的做法是:
插入外置高清硬盘。
取消第二个 HD 的 LVM 管理:“vgchange -an /dev/LVM2”。
使用“dd”克隆硬盘。
对于每个物理卷,使用“pvchange -u /dev/hdb*”为克隆磁盘生成新的 UUID。
使用“vgchange -u LVM”更改 VG UUID。这将更改其中一个 VG 的 UUID,可能是原始 VG 或克隆 VG。没关系。不同就足够了。
使用“vgrename”将克隆磁盘的 VG 名称从“LVM”更改为“LVM2”。我不知道如果没有先前的“vgscan”来“发现”新的 VG,这是否会起作用。
这有用吗?
答案4
出于多种原因,我并不认为 dd 在大多数情况下是备份的最佳选择。有人提到的一种选择是使用 LVM 的镜像。您可以断开外部驱动器的连接,重新连接时它将重新同步,而不必像 dd 那样复制 100% 的所有内容(包括空扇区)。但我个人认为更好/更简单的方法是使用 rsync 复制到您的外部驱动器。这不仅是最快的,而且您的备份也可以立即使用,无需任何额外的步骤。将它与外部驱动器上的 LVM 快照相结合,您将获得多个时间点副本,所有这些副本都可以随时使用,无需任何额外的技巧。