我目前正在cp -aR
将数据从我的(99% 已满)1TB ext4 格式的磁盘复制到新的 LVM-with-ext4-on-it 磁盘。这花了很长时间。
有什么方法可以尝试“转换”磁盘吗?我在 EC2 上,所以备份需要几分钟。
cp
或者,有没有比直接将 ext4 文件系统复制到 LVM 磁盘更快的方法?
答案1
我写块(原名 lvmify)可就地执行此转换。它的工作原理是稍微缩小文件系统,将文件系统的开头移动到分区的末尾,并在其位置复制 LVM 超级块(已预先配置正确的 PV/LV/VG)。
答案2
手动 lvmify:
- 将文件系统缩小 8 MiB(如果长度是 4 MiB 的倍数,则缩小 4 MiB 就足够了;如果不确定,再缩小一点,并在步骤 7 之后将文件系统扩展至最大大小)或将分区的大小增加为 4 MiB 的倍数,并在末尾保留 1 个可用的 4 MiB 块。
- 将前 4 MiB 复制到最后 4 MiB 对齐块的位置,例如,使用 12 MiB 的 17 MiB 磁盘(为简单起见,这是一个玩具示例,参见下图)。
- 使用以下方式创建 PV
--dataalignment 4M
- 创建 VG
- 使用 创建 LV
--extents 1
,-Zn
PV 规范/dev/sdX:1234
为sdX
您的磁盘(如果使用则添加分区号)和1234
最后一个扩展区号,即可用扩展区数 - 1。在示例中,我们有 3 个扩展区(4 MiB 标头、12 MiB 可用空间、1 MiB 尾随空间),最后一个扩展区的索引为 2。 - 将 LV (
lvextend
) 增大到最大大小,例如使用-l+100%FREE
- 检查新 LV 中数据的合理性。移除 LV 后,可以使用更正后的数字重复步骤 5+6。(假设没有日志重放损坏数据。)
插图(带有 17 MiB 磁盘的玩具示例):
Meta| PV usable | trailing data
+---+---+---+---+-+
| 0 | 1 | 2 | 3 | |
+---+---+---+---+-+
| ^
\----------/ copy
Shrinking filesystem to 3 extents (12 MiB).
LV extents: 0 (was 3), 1, 2
在接触重要数据之前测试此方法的想法:
- 创建一个稀疏文件和一个循环设备(或使用虚拟机),用随机数据(或连续的块号)填充前 20 MiB 和后 20 MiB 左右,获取相关数据的 md5sum(不包括我们在步骤 2 中覆盖的区域和尾随数据),按照步骤检查 LV 内容的 md5sum 是否与之前的 md5sum 匹配
- 创建设备快照(100 MiB 后备存储应该足够了,可以放在 tmpfs 上),例如https://gist.github.com/jowagner/b36024636140ddf453c12eaf6e590b5d,并对可写快照进行测试。
如果您像我一样不能 100% 确定dd seek=
第 2 步的操作是否正确,这里有我使用的几行 Python 代码:
dev_name = 'dev/sdX'
dev_size = 24000272007168 # put size in bytes here
pe_size = 4096 * 1024
n_extents = dev_size // pe_size
f = open(dev_name, 'r+b')
f.seek(0)
block = f.read(pe_size)
assert len(block) == pe_size
f.seek(pe_size*(n_extents-1))
f.write(block)
f.close()
答案3
我不确定如何实时转换磁盘,但我认为 rsync 是更好、更安全的复制数据的方法。如果传输停止,它可以让您恢复并保持数据完好无损。
我确实发现有人完成了类似的过程,将外部驱动器作为 LVM 添加到本地系统。信息不多,但我认为足以让您入门:
“所以今天我发现了 LVM 的神奇之处。安装 Debian 时,我选择了“LVM - 使用整个磁盘”。但主驱动器是一个速度慢且小的 5200rpm 笔记本电脑驱动器。今天我插入了备用的 1.5TB 驱动器并启动。希望将系统放在这个更大更快的驱动器上。
LVM 方法:将 /dev/sdc 添加到卷组,然后运行“pvmove /dev/sda”。这会将所有数据从 sda 移动到其他驱动器(只有 sdc 可用)。无需重新启动,无需卸载。在我写这篇文章的时候,数据正在被移动。
稍后,执行“vgreduce megatron /dev/sda”从卷组中删除慢速驱动器,然后就好了。数据已移动。(megatron 是卷组和我的计算机的名称)。对很多人来说,这可能是旧闻,但我认为这真的很酷 :)”
虽然这是在本地完成的,但我认为通过进一步研究,你也许能够做到这一点。
答案4
目前还不存在任何方法可以“动态”地进行这样的 LVM 转换。
LVM 实际上驻留在您的文件系统下,以便将其扩展到多个物理设备,或者对其进行条带化或镜像等。创建逻辑卷的最后一步是在其上放置文件系统。以下是示例来自 RHEL6。
您需要做的是备份或存档该设备上的数据,然后销毁现有文件系统,创建逻辑卷,并在其上重新铺设文件系统。如果这是 Linux 操作系统上的根文件系统,请考虑重新安装。这样可能会更快。
为了更快地复制,我喜欢dd
,但我不经常使用它。使用 犯错dd
很危险。您可以尝试的一件事是 ,tar czv <source fs> | (cd <destination fs>; tar x)
它将即时传输压缩的 tar 文件。
祝你好运!