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值, 修改需要数秒来完成。