我有一台机器,上面有两个物理上相同的硬盘,目前已使用 LVM 将其设置为一个逻辑卷。最初的想法是尽可能多地利用“连续”空间来存储大量非常大的数据。随着时间的推移,机器的当前用途也发生了变化,所以现在我宁愿将两个磁盘设置为 RAID1,一方面是为了额外的安全性(是的,我无论如何都会进行备份),另一方面是因为我真的不再需要那么多空间了。主要问题是第二个磁盘上是否确实有数据,但我找不到任何方法来真正知道第二个磁盘上存储了多少数据身体的体积。
我正在尝试找出实现此目的的最佳方法,以及 LVM 为此提供了哪些功能。我是否必须从头开始重新安装,或者有什么方法可以“拆分” LVM 并创建 RAID1 阵列,同时将数据保留在 - 至少 - 第一个磁盘上(假设第二个磁盘上没有数据)?
非常感谢。
答案1
LVM 支持一些简单的 RAID 配置,包括镜像(RAID1)。
最好的选择是将 LV 缩小到可以放入单个磁盘的大小(使用resize2fs
-- 假设为 ext3/4 -- 和lvresize
),将 VG 迁移到单个 PV(pvmove
),然后将 LV 转换为镜像(lvconvert --mirror
)。
另外,您不必将 LV 转换为镜像,而是可以从 VG 中移除第二个磁盘(lvremove
),将其重新格式化为具有一个元素的 mdadm RAID1 阵列,将数据复制到那里,然后移除剩余的 LVM VG 并将其作为镜像添加到阵列中。
这应该是不言而喻的,但我还是要说:在尝试这两种方法之前,请确保您有最新的备份。有很多方法很容易搞砸事情并丢失数据。如果可能的话,在对您的实时系统进行任何更改之前,请设置一个临时阵列并对其进行测试(例如,使用一对 USB 拇指驱动器!)。
答案2
根据您的发行版/内核和工具的实际情况,有一些选项。
首先,您应该能够使用以下命令识别磁盘上使用了多少空间。
lvs -o +devices
或者
pvs -o+pv_used
然后您可能必须在缩小块设备之前缩小文件系统,因为可用空间将比以前更少。
请参阅手册页lvconvert
。应该可以将条带/线性卷转换为 RAID1。您还可以找到各种示例和良好的文档,以了解是否可以进行转换。
如果lvconvert
对您不起作用,您可以使用pvmove
和vgreduce
释放一个磁盘。您还必须先缩小文件系统。
然后,您就可以仅使用一个驱动器启动 RAID1。
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 missing
然后在 /dev/md0 上创建文件系统,挂载它并复制数据。然后卸载 LVM 并将第二个磁盘添加到 RAID1。先对 LVM 进行分区或清理。
mdadm --add /dev/md0 /dev/sdb1
请记住,在执行这些步骤之前最好先进行备份,因为一个小小的错误都可能会毁掉您的数据。