我需要将 CentOS 安装从使用 LVM 分区的 1TB 磁盘克隆到几台相同的机器上。磁盘大部分是空的,因为只安装和配置了操作系统和一些软件。
如果不使用 LVM,我将复制整个分区表,然后使用 partclone 逐个克隆分区:
sfdisk -d /dev/sda | sed -e 's/sda/sdb/' | sfdisk /dev/sdb
partclone.ext4 -c -s /dev/sda# -o - | partclone.ext4 -r -s - -o /dev/sdb#
然而我认为它不适用于 LVM。
当然我也可以用来dd
克隆整个磁盘:
dd if=/dev/sda of=/dev/sdb
但与 partclone 相比,它花费的时间太多了。
有没有办法更快地克隆 LVM 分区?我认为一个可能的解决方案是使用 dd 将 LVM 分区克隆到另一个磁盘中的常规分区,然后使用 partclone 将新磁盘克隆到其他机器。但我不知道这样的方法是否可行:
dd if=/dev/mapper/vg_node07-lv_root of=/dev/sdb1
可以吗?你能告诉我其他解决方案吗?
答案1
是的,您可以dd
按照描述使用。
我要做的是使用尽可能小的分区创建源映像,克隆它们,然后扩大目标上的逻辑卷和文件系统。您的克隆过程将变成如下形式:
# <attach target for cloning, say, /dev/sdc>
# CURRENT_LE=2000 (get exact "Current LE" value from lvdisplay)
# NEW_SIZE="20G"
# parted -a optimal /dev/sdc mklabel gpt mkpart p1 ext4 0% 100%
# pvcreate /dev/sdc1
# vgcreate nodexx /dev/sdc1
# lvcreate -n lv_root -l $CURRENT_LE nodexx
# dd if=/dev/node07/lv_root of=/dev/nodexx/lv_root bs=4M
# lvresize /dev/vg_nodexx/lv_root -L $NEW_SIZE
# fsck.ext4 -f -y /dev/vg_nodexx/lv_root
# resize2fs /dev/vg_nodexx/lv_root
您可能想要预订 LVM 和文件系统工具,但这对于 shell 脚本来说是一个很好的选择。
答案2
losetup
您可以使用以下选项回送挂载 LVM 逻辑卷--partscan
:
losetup --partscan --read-only --show --find /path/to/my/lv
这将返回已绑定 LVM 逻辑卷的环回设备的路径(类似于/dev/loop0
)。借助该--partscan
选项,分区也将可访问(即/dev/loop0p1
,,/dev/loop0p2
...)。您可以直接对它们进行部分克隆。
完成后,你可以使用以下命令释放循环设备:
losetup -d /dev/loop0
确保指定与第一次调用losetup
返回的相同的循环设备(它可能是一个不同于 0 的数字)。
答案3
您可以执行几乎与 VMware p2v 软件相同的操作。它所做的就是在新系统上完全按照您的需要创建新的文件系统,然后将文件系统执行 tar 操作传输到另一台服务器。这样,您将获得完全相同的所有内容,并且您只复制当前正在使用的文件和空间。然后您必须执行 grub 操作以确保其可启动。
答案4
LVM 可以做很多事情,比仅仅使用简单分区的简单磁盘要复杂得多......因此......克隆是一个更加复杂的过程。
事实上,您最好手动(或编写脚本)创建 lvm 卷,然后简单地使用 sfdisk/partclone 进程将实际数据克隆到新的 LVM。
这还可以为您带来额外的好处,即能够将 RAID-1 系统克隆到跨更多磁盘的 RAID-5 设置...因为分区不会受到影响。