答案1
概述
查看了 的来源后blocks
,它的作用是:
- Shrink the LV's filesystem 缩小一个LVM PE
- 将 LV 本身缩小 1 个 LVM PE(这保证了 1 个空闲 PE 用于
bcache
标头) - 编辑 VG 配置,插入大小为 1 的新第一段,即上一步中释放的 PE
--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_extent
s 加 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