이는 서로 다른 시스템 간의 논리 볼륨에 대한 매핑 장치의 섹터 크기 문제인 것 같습니다.
보다 구체적으로, 논리 볼륨에 해당하는 매핑된 장치의 섹터 크기를 구성하는지, 어떻게 구성하는지 알고 싶습니다.
다음은 두 시스템을 비교하여 문제에 대한 설명입니다.
기계 1
mytestlv
이름이 지정된 볼륨 그룹의 논리 볼륨에 전체 디스크 이미지가 있습니다 MyVolumeGroup
.
디스크 이미지에는 자체 파티션 테이블이 있습니다(이미지가 저장된 실제 디스크와 완전히 독립적).
예를 들어 fdisk /dev/mapper/MyVolumeGroup-mytestlv
다음을 보여주세요.
Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...
Device Start End Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1 2048 4095 2048 1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2 4096 4198399 4194304 2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127 28G Linux filesystem
해당 디스크 이미지의 특정 파티션에 있는 데이터에 액세스해야 하는 경우 kpartx
해당 파티션을 사용하고 마운트할 수 있습니다.
kpartx -a /dev/mapper/MyVolumeGroup-mytestlv
이 디스크 이미지 내에 파티션을 마운트하는 데 사용할 수 있는 장치 파일을 만듭니다. 예를 들면 다음과 같습니다.
/dev/mapper/MyVolumeGroup-mytestlvl
/dev/mapper/MyVolumeGroup-mytestlv2
/dev/mapper/MyVolumeGroup-mytestlv3
기계 2
이제 이를 다른 컴퓨터에 복사합니다(내용은 정확히 동일하고 체크섬은 /dev/mapper/MyVolumeGroup-mytestlv
둘 다 동일합니다).
fdisk /dev/mapper/MyVolumeGroup-mytestlv
아래와 같이 구성된 블록 크기를 사용합니다 .
/dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 7864320 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/mapper/MyVolumeGroup-mytestlv-part1 1 7864319 7864319 30G ee GPT
차이점
논리 섹터 크기는 머신 1에서는 512이지만 머신 2에서는 4096입니다.
머신 1에서는 blockdev --getss /dev/mapper/MyVolumeGroup-mytestlv
512가 반환됩니다.
머신 2에서는 blockdev --getss /dev/mapper/MyVolumeGroup-mytestlv
4096이 반환됩니다.
해결책
머신 2에서 섹터 크기를 512로 강제하면 fdisk
파티션 테이블을 올바르게 보는 데 도움이 됩니다.
fdisk --sector-size 512 /dev/mapper/MyVolumeGroup-mytestlv
Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...
Device Start End Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1 2048 4095 2048 1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2 4096 4198399 4194304 2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127 28G Linux filesystem
안타깝게도 다른 도구(예: sfdisk
또는 ) kpartx
에는 이러한 옵션이 없는 것 같습니다.
해당 LV에서 루프백 장치를 명시적으로 생성하면 루프백 장치의 섹터 크기는 512이고 모든 것이 잘 작동합니다. 실제로 losetup
장치 버전은 명시적인 섹터 크기 옵션을 갖기에는 너무 오래되지 않았습니다. 뒤쪽에 losetup --show -f /dev/mapper/MyVolumeGroup-mytestlv
:
blockdev --getss /dev/loop0
512를 반환kpartx -a /dev/loop0
만들다/dev/mapper/loop0p{1,2,3}
이 섹터 크기는 어디에 구성되어 있습니까?
나는 여분의 에 의존하지 fdisk
않고 사용할 수 있기를 원합니다 sfdisk
.kpartx
losetup
머신 2에서는 cat /sys/block/dm-2/queue/hw_sector_size
4096이 반환됩니다( /dev/mapper/MyVolumeGroup-mytestlv
실제로는 에 대한 소프트 링크 /dev/dm-2
). 를 사용하여 이 설정을 변경해 보았 echo 512 > /sys/block/dm-2/queue/hw_sector_size
으나 불가능한 것 같습니다.
해당 장치의 섹터 크기가 512가 되도록 LVM에 알릴 수 있는 방법이 있습니까
/dev/mapper/MyVolumeGroup-mytestlv
?이것이 그룹이나 시스템의 모든 논리 볼륨에 영향을 줍니까?
lvcreate
이와 관련된 옵션이 표시되지 않습니다 lvdisplay
.
답변1
내가 아는 한, 기본 섹터 크기는 기본 하드웨어에서 비롯됩니다.
따라서 머신 1에서는 기본 디스크가 명확하게 위치합니다.고급 포맷 512e머신 1의 디스크 컨트롤러 자체가 4k 섹터를 사용할 수 없기 때문일 수 있습니다. 또 다른 가능성은 머신 1에서 물리적 볼륨 중 하나가 MyVolumeGroup
4k 섹터 크기를 지원할 수 없으므로 전체 볼륨 그룹이 최소 용량 디스크가 지원할 수 있는 섹터 크기를 사용해야 한다는 것입니다.
반면, 머신 2와 모든 물리적 볼륨은 MyVolumeGroup
기본적으로 4k 섹터 크기를 완전히 사용할 수 있는 것으로 보입니다(고급 포맷 4Kn). 이전 512바이트 섹터 크기를 에뮬레이트하는 것보다 더 효율적이기 때문에 기본적으로 이 작업을 수행합니다.