가상 머신 블록 장치 문제

가상 머신 블록 장치 문제

내 호스트 컴퓨터에 두 개의 블록 장치가 있고 이를 가상 컴퓨터 게스트에 전달하려고 합니다. 하나는 완벽하게 작동하고 다른 하나는 그렇지 않습니다. 유일한 차이점은 하나는 내부 드라이브의 논리 볼륨이고 다른 하나는 외부 Thunderbolt 드라이브에 구축된 소프트웨어 RAID에 있다는 것입니다. 호스트와 게스트가 필요한 위치에 파티션 테이블이 있는지 확인하는 작업을 더 잘 수행해야 하는지 궁금합니다.

게스트와 호스트 모두 최신 Arch Linux를 실행하고 있습니다. 호스트의 첫 번째 장치는 /dev/nvme0n1p3Intel NUC13 마더보드에 직접 연결된 LVM 볼륨 그룹의 논리 볼륨에 있습니다.

# fdisk -l /dev/HomeServerNUC13VM/HomeServerNUC13Storage 
Disk /dev/HomeServerNUC13VM/HomeServerNUC13Storage: 16 GiB, 17179869184 bytes, 33554432 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CAEF53EA-821B-4A57-9FFB-E62CE5174E16

Device                                           Start      End  Sectors Size Type
/dev/HomeServerNUC13VM/HomeServerNUC13Storage1    2048  2099199  2097152   1G EFI System
/dev/HomeServerNUC13VM/HomeServerNUC13Storage2 2099200 33552383 31453184  15G Linux filesystem

/dev/md127p1두 번째는 소프트웨어 RAID 5 어레이가 있는 다른 LVM 볼륨 그룹의 논리 볼륨입니다 /dev/nvme{1,2,3,4}n1p1. 이러한 물리적 드라이브는 모두 인클로저에 있으며 Thunderbolt를 통해 NUC에 연결됩니다.

# fdisk -l /dev/HomeStorageOWC/HomeServerNUC13Storage 
Disk /dev/HomeStorageOWC/HomeServerNUC13Storage: 2 TiB, 2199023255552 bytes, 536870912 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: DBF9C573-63AF-417B-ADE6-F6560D0702D9

Device                                      Start       End   Sectors Size Type
/dev/HomeStorageOWC/HomeServerNUC13Storage1   256 536870655 536870400   2T Linux filesystem

호스트 시스템의 두 블록 장치에 있는 파티션에 액세스하고 kpartx -a문제 없이 마운트할 수 있습니다. 장치를 가상 머신 게스트에 전달할 때 문제가 발생합니다

   <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
      <source dev='/dev/HomeServerNUC13VM/HomeServerNUC13Storage'/>
      <target dev='sda' bus='sata'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='block' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
      <source dev='/dev/HomeStorageOWC/HomeServerNUC13Storage'/>
      <target dev='sdb' bus='sata'/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>

게스트에서는 제대로 /dev/HomeServerNUC13VM표시 /dev/sda되고 작동하지만 /dev/HomeStorageOWC/HomeServerNUC13Storage게스트 에서는 /dev/sdb엉망인 것으로 나타납니다. Disklabel type있으니 참고하세요dos

# fdisk -l /dev/sdb
GPT PMBR size mismatch (536870911 != 4294967295) will be corrected by write.
Disk /dev/sdb: 2 TiB, 2199023255552 bytes, 4294967296 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start        End    Sectors Size Id Type
/dev/sdb1           1 4294967295 4294967295   2T ee GPT

게스트에서 파티션 테이블과 파티션을 다시 생성하면 게스트에서는 모든 것이 정상입니다.

# fdisk -l /dev/sdb
Disk /dev/sdb: 2 TiB, 2199023255552 bytes, 4294967296 sectors
Disk model: QEMU HARDDISK   
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00B06790-6D3B-4694-B435-6E9E6E9E12CB

Device     Start        End    Sectors Size Type
/dev/sdb1   2048 4294965247 4294963200   2T Linux filesystem

하지만 콘솔로 돌아가자 상황이 엉망이 되었습니다. Disklabel type네, 또요 dos.

# fdisk -l /dev/HomeStorageOWC/HomeServerNUC13Storage 
Disk /dev/HomeStorageOWC/HomeServerNUC13Storage: 2 TiB, 2199023255552 bytes, 536870912 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device                                      Boot Start        End    Sectors Size Id Type
/dev/HomeStorageOWC/HomeServerNUC13Storage1          1 4294967295 4294967295  16T ee GPT

Partition 1 does not start on physical sector boundary.

RAID 5를 삭제하고 /dev/nvme{1,2,3,4}n1LVM을 직접 배치하는 동안 /dev/md127(즉, 파티션 없음) 직접 다시 만든 다음 LV를 256GB로 설정했지만 여전히 동일한 문제가 발생합니다.

답변1

대답은 거짓말libvirt 문서, 특히 다음 줄에서:

blockio logical_block_size='512' physical_block_size='4096'
discard_granularity='4096'

QEMU에는 다음과 같은 옵션도 있습니다.

- 장치 scsi-hd, 버스=scsi1.0, 드라이브=drive-virtio-disk1, id=virtio-scsi-pci1,물리적 블록 크기 = 4096, 논리적 블록 크기 = 512

답변2

/dev/nvme0n1내가 놓친 것은 콘솔에 있던 것이었습니다.

Sector size (logical/physical): 512 bytes / 512 bytes

그리고 /dev/nvme{1,2,3,4}n1호스트에는

Sector size (logical/physical): 4096 bytes / 4096 bytes

게스트에서 문제의 장치는 다음과 같이 나타납니다.

Sector size (logical/physical): 512 bytes / 512 bytes

섹터 크기의 불일치로 인해 파티션 테이블이 엉망이 된 것 같습니다. 가상 SATA 장치의 섹터 크기를 설정할 수 없는 것 같지만 virtio 장치의 blockio 매개변수를 사용할 수 있습니다.

<disk type='block' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
  <source dev='/dev/HomeStorageOWC/HomeServerNUC13Web'/>
  <target dev='vda' bus='virtio'/>
  <blockio logical_block_size='4096' physical_block_size='4096'/>
  <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</disk>

관련 정보