處理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
Theme Stack designed by Jimmy