将现有 LVM LV 转换为 bcache 支持设备

将现有 LVM LV 转换为 bcache 支持设备

如何将现有 LVM LV 转换为bcache支持设备?

用于将现有设备转换为的官方工具bcacheblocks,但自 2014 年 12 月以来就没有更新过。

至少有问题1336防止它与 maintboot 和 btrfs 一起使用。

如何手动将 LVM 转换为 LV bcache

答案1

概述

查看了 的来源后blocks,它的作用是:

  1. Shrink the LV's filesystem 缩小一个LVM PE
  2. 将 LV 本身缩小 1 个 LVM PE(这保证了 1 个空闲 PE 用于bcache标头)
  3. 编辑 VG 配置,插入大小为 1 的新第一段,即上一步中释放的 PE
  4. --data-offset创建一个大小相当于一个 LVM PE 的bcache 支持设备。

收集资料;缩小LV;备份VG配置

首先获取VG的PE大小(通常为4MiB):

sudo vgdisplay /dev/mapper/VG | grep 'PE Size'

将 LV 的文件系统缩小此量(特定于文件系统)。注意不要将 4MiB 与 4MB 混淆。

然后缩小 LV 本身。lvresize使用 ^2 单位,因此 4M=4MiB:

sudo lvresize -L -4M /dev/mapper/VG-LV

接下来,找到Start新未分配的PE:

sudo pvs --segments -o +lv_name,seg_start_pe,seg_size_pe,seg_pe_ranges,seg_le_ranges

在我的(非常非常丑陋)分配中,想要的Start列数字是177406

  PV         VG  Fmt  Attr PSize    PFree Start  SSize  LV     Start  SSize  PE Ranges               LE Ranges
  /dev/sdb1  2TB lvm2 a--  <693.00g 4.00m      0 177406 backup 299499 177406 /dev/sdb1:0-177405      /dev/sdb1:0-177405
  /dev/sdb1  2TB lvm2 a--  <693.00g 4.00m 177406      1             0      1
  /dev/sdb2  2TB lvm2 a--  <662.96g    0       0 149749 backup 149750 149749 /dev/sdb2:0-149748      /dev/sdb2:0-149748
  /dev/sdb2  2TB lvm2 a--  <662.96g    0  149749  19968 backup 129782  19968 /dev/sdb2:149749-169716 /dev/sdb2:149749-169716
  /dev/sdb3  2TB lvm2 a--   506.96g    0       0 129782 backup      0 129782 /dev/sdb3:0-129781      /dev/sdb3:0-129781

另请注意,该177406值比我的 LV 的最高LE Ranges编号(名为 )大 1 backup

禁用 VG,因为它即将被编辑:

sudo vgchange -an VG

转储 VG 的配置:

sudo vgcfgbackup --file vg-config VG
sudo chown $USER vg-config

在此刻进行备份配置的。

编辑VG配置;插入新释放的 PE 作为第一个 LE

logical_volumes在配置文件部分找到LV 。

增量segment_count以允许使用新释放的范围创建新段。

增加所有现有段(例如旧的segment1变为segment2

创建一个新的第一个段,其中包含由 释放的单个逻辑范围lvresize

        segment1 {
            start_extent = 0
            extent_count = 1

            type = "striped"
            stripe_count = 1    # linear

            stripes = [
                "pv2", 177406
            ]
        }

该数字177406是通过缩小上面的 LV 释放的 PE。确保它旁边的内容与配置文件部分pv#中的正确物理设备相匹配。physical_volumes

对于segment2 及以后,仅将start_extents 加 1。这说明了我们在 中插入的新逻辑范围segment1。 (提示:使用 ^A 以vi避免人为错误)(最后一段extent_count已经正确,因为备份是在 LV 缩小后进行的)。

你可以看我的VG配置的补丁这里

检查新的VG配置

将新配置写入 VG 元数据:

sudo vgcfgrestore --file vg-config

重新启用 VG:

sudo vgchange -ay VG

使用单个 PE 偏移环回安装 LV,以检查是否没有出现任何问题:

sudo losetup --find --show --offset 4M --read-only /dev/mapper/VG-LV

(上面我们使用PE大小为4MiB的示例)

fsck 全部VG 中的文件系统,以检查段映射中是否没有出现任何问题。

如果出现问题,请参阅回滚部分(如下)。别的,sudo losetup --detach /dev/loop#

写入bcache标头

使bcache设备具有适当的块大小和数据偏移量以匹配一个 LVM PE:

获取扇区中的数据偏移量:

sudo vgdisplay --units s 2TB | grep 'PE Size'

对于通常的 4MiB PE 大小,这将为 8192。

写入bcache 8KiB标头:

dev=/dev/mapper/VG-LV
make-bcache --bdev --data-offset 8192 --block "$(blockdev --getpbsz "$dev")" "$dev" # --writeback --cset-uuid # see `make-bcache --help`

将新设置的支持设备附加到缓存设备。

fsck仅 LV 的文件系统(其他 VG 文件系统自上次以来没有更改fsck

值得自豪的是,这只fsck需要以前运行时间的一小部分:)

回滚

如果fsck抱怨并且您无法找出 VG 配置文件中的错误,您可以恢复您进行的备份:

sudo vgcfgrestore -f vg-config.orig

相关内容