介绍

介绍

我有一个使用设备而不是分区的 Raid 5 设置。我最近将 md 设备上的 ext4 fs 转换为 btrfs。我最初对 btrfs 很满意,但简而言之,它正在消耗 CPU 周期,我想回去。不幸的是,我已经删除了最初的 ext4 快照,因此无法恢复。幸运的是,数据使用的 md 设备明显少于一半。我已成功将 btrfs 缩小到总空间的一半以下,但我在实用程序正确查看 /dev/md/5 时遇到问题。 fdisk 显示它没有正确的分区表,而 gparted (我对此更满意)在收缩后只能看到 /dev/md/5 ,但它显示它不可读,并且还消耗了整个设备。

您现在可能已经猜到我想要做的是将 btrfs 缩小到总空间的一半以下,在旁边创建一个 ext4 fs,然后复制数据。完成此操作后,我可以删除 btrfs 并扩展 ext4 fs 以填充设备。

这可能吗?看来直接对 md 设备进行 fs 可能是一个坏主意(在这种情况下)。

我真的很感激任何帮助。我真的不想花钱购买外部驱动器只是为了恢复我的文件系统。

提前致谢!

答案1

这是可能的重新整理磁盘上的数据以达到您想要的效果,但这是一个专家程序,需要很多步骤,即使对于经验丰富的人来说,也有很多犯错误的机会。没有安全网,也没有宽恕。如果你犯了一个错误,你将要丢失您的数据。就我个人而言,如果没有可用的备份,我不愿意尝试此操作。 (如果您有良好的备份,您可能还可以重新格式化整个数据并从备份中恢复。)不过,这是您的决定,您将根据数据的价值、您可以花费的时间等因素做出决定对此等...

首先,评论一下:你提到/dev/md/5不包含分区表,但这是很正常的。 MD 设备通常用于以下两种配置之一:(1) 像您所做的那样将文件系统直接放在 MD 设备上,或者 (2) 将 MD 设备用作 LVM 物理卷 (PV),然后该物理卷是某个卷的成员。卷组 (VG),然后您可以在其中创建任意数量的逻辑卷 (LV),用于文件系统、交换设备、VM 映像等...后者听起来像很多堆叠层,但实际上只是正常的LVM架构。在MD设备上放置分区表是我从未见过的。它可以让您将 MD 设备分成多个部分,就像创建多个 LV 一样,但您也可以只使用 LVM。另外,我什至不确定将分区表直接放在 MD 设备上是否会自动工作:您可能需要使用类似的工具kpartx才能使其工作,该工具使用设备映射器技术,就像 LVM 一样,因此,您可能会也可以直接使用LVM。

介绍

由于您实际上使用的可用大小不到一半/dev/md/5,因此该过程包括将设备分成两半,将数据从前半部分移动到后半部分,在前半部分创建您想要的新型文件系统,将数据回到上半场,然后摆脱分成两半的局面。

最后,您将获得前半部分的数据,采用您想要的格式。最后,您可以将这一半扩大到占据整个设备。

我们将使用设备映射器创建两个虚拟块设备,分别代表大设备的一半/dev/md/5

device-mapper 与 LVM 用于将物理卷 (PV) 的不同块和片段映射为逻辑卷 (LV) 的技术相同。对于线性映射类型,这是通过指定源设备、源偏移量和目标长度来完成的。 (device-mapper 也有其他类型的映射,我们不会讨论。)不同之处在于 LVM 自动管理和跟踪这些映射,并将它们持久存储在元数据中,元数据作为标头存储在 PV 上。它还自动且透明地选择放置信息(偏移量和大小、多个块……)。这里我们不能使用 LVM 来完成这项工作,因为我们需要手动严格控制偏移量和大小,而且因为我们在开头没有空间/dev/md/5插入 PV 元数据标头。所以我们就直接通过dmsetup命令来使用device-mapper。

免责声明

我还没有尝试过这个过程。原则上应该可行,但我可能犯了一个错误。如果我犯了错误或者您犯了错误,那么您将丢失您的数据。

程序

  1. 调整 Btrfs 文件系统的大小/dev/md/5,使其占用的设备不超过一半。使用blockdev --getsize64 /dev/md/5来找出确切地设备包含多少字节,并使 Btrfs 文件系统小于一半。宁可让它变小,也不要让它变大。如果它占用的空间大大低于设备的一半,那还可以,但如果超过 1 个字节,那就不行了。

    btrfs filesystem resize <devid>:<half>
    

    <devid>是要调整大小的 Btrfs 成员设备的 ID。您可以使用 来查看 devids btrfs filesystem show /mountpoint。我预计,在此过程中,您使用的是仅具有一个成员设备的 Btrfs 文件系统。

    half是 报告的字节数的一半blockdev --getsize64 /dev/md/5。为了确定起见,向下舍入并减去更多。

    该命令需要时间。我不确定它是否会立即返回并在后台运行,或者是否会在前台运行。我的 Btrfs 经验表明它将在前台运行。无论哪种方式,请检查内核日志以查看是否有指示操作已完成。

  2. 仔细检查 Btrfs 文件系统的大小

    btrfs filesystem show /mountpoint
    

    确保size小于 的一半/dev/md/5。该命令可能会显示以 GB 为单位的大小,仅保留 2 位小数,我不确定它是向下舍入还是向上舍入,所以这就是为什么您要在上一步中减去一些边距,以便真正确定此处显示的值小于设备尺寸的一半。

  3. 现在我们有以下情况:

    |*********---------| /dev/md/5
    

    其中*是已使用空间,-是未使用空间,并|--|显示块设备的跨度。

    计算设备后半部分第一个扇区的编号。

    从输出开始blockdev --getsize64 /dev/md/5并除以 512,因为设备映射器扇区是 512 字节。这是 中的扇区数/dev/md/5

    将该数字除以 2。向下舍入。拨打这个号码<half>

    创建虚拟块设备分别映射前半部分和后半部分:

    dmsetup create half2 --table '0 <half> linear /dev/md/5 <half>'
    

    现在你有这个:

    |*********---------| /dev/md/5
              |--------| /dev/mapper/half2
    
  4. 在 /dev/mapper/half2 上创建临时文件系统

    mkdir /mnt/tmp
    mkfs.ext4 /dev/mapper/half2
    mount /dev/mapper/half2 /mnt/tmp
    
  5. 复制所有内容

    rsync -avXSH /btrfs-mountpoint/ /mnt/tmp
    

    (使用您最喜欢的复制工具。普通cp也可以。)

  6. 现在是时候摆脱 Btrfs 文件系统了

    umount /btrfs-mountpoint
    
  7. 创建另一个设备映射器映射

    dmsetup create half1 --table '0 <half> linear /dev/md/5 0'
    

    现在你有这个:

    |---------*********| /dev/md/5
    |--------|           /dev/mapper/half1
              |********| /dev/mapper/half2
    

    其中*是已使用的空间,-是之前使用过的空间,但我们只是通过将其移动到后半部分来释放它,我们即将覆盖它。

  8. 创建您想要的最终配置/dev/mapper/half1。您可以直接创建 ext4 文件系统,但我推荐 LVM。

    直接的:

    mkfs -t ext4 /dev/mapper/half1
    

    LVM:

    pvcreate /dev/mapper/half1
    vgcreate volume-group-name /dev/mapper/half1
    lvcreate -n logical-volume-name -L<size> volume-group-name
    mkfs -t ext4 /dev/volume-group-name/logical-volume-name
    
  9. 安装它并复制所有内容

    mount /dev/volume-group-name/logical-volume-name /new-mountpoint
    # or
    mount /dev/mapper/half1 /new-mountpoint
    
    rsync -avXSH /mnt/tmp/ /new-mountpoint
    
  10. 摆脱所有临时的东西

    umount /mnt/tmp
    dmsetup clear /dev/mapper/half2
    umount /new-mountpoint
    
    # If using LVM
    lvchange -a n /dev/volume-group-name/logical-volume-name
    vgchange -a n volume-group-name
    
    dmsetup clear /dev/mapper/half1
    

    如果设备映射器映射无法清除,那么您可以修复问题或重新启动。

    你又回到了这个:

    |*********---------| /dev/md/5
    
  11. 现在使用完整/dev/md/5设备重新安装

    # If using LVM
    vgscan
    mount /dev/volume-group-name/logical-volume-name /new-mountpoint
    
    # otherwise
    mount /dev/md/5 /new-mountpoint
    
  12. 现在您可以将其扩展为完整的设备:

    # If using LVM
    pvresize /dev/md/5
    # Optionally, enlarge the LV
    
    # otherwise
    resize2fs /dev/md/5
    

哇!

相关内容