处理Vgextend失败时的错误"Devices have inconsistent logical block sizes"

Vgextend失败 "Devices have inconsistent logical block sizes" 的处理方法

Devices have inconsistent logical block sizes 出现的原因

问题在于Vgextend新加到的磁盘的逻辑块大小和VG中原有的磁盘的逻辑块大小不同而导致的. 比如说原来的VG都构建在512大小的逻辑块的磁盘设备上, 但是在Vgextend时新加的设备是4K大小的逻辑块,就会出现这个问题.

解决办法1: 在lvm.conf中启用allow_mixed_block_sizes=1

打开 /etc/lvm/lvm.conf文件, 修改其中allow_mixed_block_sizes=1

但是这种方式,同一个 LV 上混合块大小是安全的吗? https://serverfault.com/questions/1150643/is-it-safe-to-use-allow-mixed-block-sizes-1-in-lvm-when-using-ext4-with-4k-blo

解决办法2: 修改 其中一些硬盘的 logical block sizes, 使全部硬盘保持一致

查看硬盘的logical block sizes

lsblk

1
2
3
4
5
6
7
$ lsblk -td
NAME    ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED       RQ-SIZE  RA WSAME
sda             0   8192   8192    4096     512    0 mq-deadline     256 128    0B
sdb             0   4096      0    4096     512    0 mq-deadline     256 128    0B
sdc             0   4096      0    4096     512    1 mq-deadline     256 128    0B
nvme1n1         0    512      0     512     512    0 none           1023 128    0B
nvme0n1         0    512      0     512     512    0 none           1023 128    0B

PHY-SEC 显示了物理扇区大小,LOG-SEC 显示了逻辑扇区大小。

sysfs

1
2
3
4
$ cat /sys/class/block/sda/queue/physical_block_size
4096
$ cat /sys/class/block/sda/queue/logical_block_size
512

sda为设备名

fdisk

1
2
3
4
5
6
$ sudo fdisk -l /dev/sda
Disk /dev/sda: 745.22 GiB, 800176914432 bytes, 1562845536 sectors
Disk model: P1635N08CLAR800 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 8192 bytes / 8192 bytes

Sector size physical 显示了物理扇区大小,Sector size logical 显示了逻辑扇区大小。

smartctl

1
2
3
4
5
6
7
$ sudo smartctl -a /dev/nvme0n1
...
Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         2
 1 -    4096       0         1
...

查看 Supported LBA Sizes, 支持的 LBA, +部分为当前选择的LBA Size

修改 修改扇区 LBA 大小

警告: 修改硬盘的扇区大小将不可恢复地抹除所有数据。

部分 NVMe 和“企业级”SATA 硬盘分别支持通过标准的 NVMe(NVMe 命令集标准 1.0 或以上的 Format NVM)或 ATA(ATA 命令集 - 4 或以上的 SET SECTOR CONFIGURATION EXT)命令修改它们汇报的扇区大小。对于机械硬盘而言,这一操作通过修改它们的逻辑扇区大小到与物理扇区大小一致,优化了硬盘性能。而对于 NVMe 固态硬盘而言,逻辑扇区和物理扇区的大小都受到更改。

SATA 固态硬盘通常不支持修改扇区大小。部分 Intel SATA SSD 仅可以被修改汇报的物理扇区大小,无法修改逻辑扇区大小。 修改扇区大小包含了一系列复杂的操作,其中涉及到了低级格式化。作为替代,你可以在硬盘上创建文件系统时手动指定扇区大小来优化性能。

修改 机械硬盘

使用 hdparm 工具确定硬盘的扇区大小是否可被更改:

不支持修改逻辑扇区大小的硬盘将只会汇报当前扇区大小。

1
2
3
4
$ sudo hdparm -I /dev/sda | grep 'Sector size:'
        Logical/Physical Sector size:           512 bytes
$ sudo hdparm -I /dev/sdb | grep 'Sector size:'
        Logical/Physical Sector size:           512 bytes

支持修改逻辑扇区大小的硬盘

1
2
3
4
5
6
$ sudo hdparm -I /dev/sdc | grep 'Sector size:'
        Logical  Sector size:                   512 bytes [ Supported: 2048 256 ]
        Physical Sector size:                  4096 bytes
$ sudo hdparm -I /dev/sdk | grep 'Sector size:'
        Logical  Sector size:                   512 bytes [ Supported: 2048 256 ]
        Physical Sector size:                  4096 bytes
使用 hdparm 工具修改机械硬盘的扇区大小

如果你的 SATA 机械硬盘支持多个逻辑扇区大小和可选的 SET SECTOR CONFIGURATION EXT ATA 命令(例如希捷宣传带有 FastFormat 功能的硬盘),你可以使用 hdparm 来在支持的不同逻辑扇区大小间进行切换。可使用以下命令将其设为 4096 字节(即 4Kn):

1
# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sdX

修改之后 hdparm 应汇报逻辑扇区大小为 4096 字节:

1
2
3
# hdparm -I /dev/sdX | grep 'Sector size:'
        Logical  Sector size:                  4096 bytes [ Supported: 512 4096 ]
        Physical Sector size:                  4096 bytes

修改 NVMe 固态硬盘

虽然固态硬盘(SSD)经常使用较大的物理块(通常为 4 KiB,8 KiB,有时会更大),它们通常还是将自己的逻辑块大小汇报为 512 字节。 可以通过 nvme-cli包 使用 Identify Namespace 命令来查看 NVMe 硬盘的格式化后逻辑块地址大小(Formatted Logical Block Address Size, FLBAS):

1
2
3
$ sudo nvme id-ns -H /dev/nvme0n1 | grep "Relative Performance"
LBA Format  0 : Metadata Size: 0   bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use)
LBA Format  1 : Metadata Size: 0   bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better 

Metadata Size 是每个逻辑块地址(Logical Block Address, LBA)的额外元数据字节大小。这一功能在 Linux 上尚无完善支持,所以最好是使用该值为 0 的格式。 Relative Performance 代表各类格式所提供的性能级别(包括 degraded,good,better 和 best)。

smartctl 也可以显示设备支持的逻辑块地址大小

1
2
3
4
5
6
# smartctl -c /dev/nvme0n1
...
Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         2
 1 -    4096       0         1

可以使用 –lbaf 参数向 nvme format 命令传入目标值来修改逻辑块地址大小:

1
2
3
4
5
6
7
8
# nvme format --lbaf=1 /dev/nvme0n1
You are about to format nvme0n1, namespace 0x1.
WARNING: Format may irrevocably delete this device's data.
You have 10 seconds to press Ctrl-C to cancel this operation.

Use the force [--force] option to suppress this warning.
Sending format operation ... 
Success formatting namespace:1

lbaf对应id值, 修改需要数秒来完成。

记录并分享
Built with Hugo
主题 StackJimmy 设计