vm0 と vm1 を作成した時に vm1 側で AHCI タイムアウトが発生し OS が起動しない
vm1でFreeBSDを起動したときは、boot:プロンプトが表示された。
AHCI controller at a0.0, iobase f7c00000, irq 255 Searching bootorder for: /pci@i0cf8/pci-bridge@1c,7/*@0/drive@1/disk@0 AHCI/1: registering: "AHCI/1: Hitachi HDS721032CLA362 ATA-8 Hard-Disk (298 GiBytes)" Scan for option roms Searching bootorder for: HALT drive 0x000f28e0: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=625142448 Space available for UMB: c0000-ee000, f0000-f28e0 Returned 57344 bytes of ZoneHigh e820 map has 6 items: 0: 0000000000000000 - 000000000009fc00 = 1 RAM 1: 000000000009fc00 - 00000000000a0000 = 2 RESERVED 2: 00000000000f0000 - 0000000000100000 = 2 RESERVED 3: 0000000000100000 - 0000000045a3e000 = 1 RAM 4: 0000000045a3e000 - 0000000045a40000 = 2 RESERVED 5: 00000000fffc0000 - 0000000100000000 = 2 RESERVED Unable to lock ram - bridge not found enter handle_19: NULL Booting from Hard Disk... Booting from 0000:7c00 | FreeBSD/x86 boot Default: 0:ad(0p2)��⡘��$���.ϯ�O���@7h�� boot:
次の組み合わせでも、vm1でAHCIのタイムアウトが発生した。
VMM のパラメータで指定していた vm0.boot_int18 を vm0.boot_drive=81 に変更したところ、vm1 側で発生していた AHCI タイムアウトが発生しなくなった。
推測だが、この PC の BIOS では INT18 を発行すると、vm1 に割り当てた AHCI までアクセスしてしまうと考えられる。
vm0.boot_drive=81 にしても、次の組み合わせでは vm1 側で AHCI タイムアウトが発生した。
AHCI controller at a0.0, iobase f7c00000, irq 255 Searching bootorder for: /pci@i0cf8/pci-bridge@1c,7/*@0/drive@1/disk@0 AHCI/1: registering: "AHCI/1: ST3320820AS ATA-7 Hard-Disk (298 GiBytes)" Scan for option roms Searching bootorder for: HALT drive 0x000f28e0: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=625142448 Space available for UMB: c0000-ee000, f0000-f28e0 Returned 57344 bytes of ZoneHigh e820 map has 6 items: 0: 0000000000000000 - 000000000009fc00 = 1 RAM 1: 000000000009fc00 - 00000000000a0000 = 2 RESERVED 2: 00000000000f0000 - 0000000000100000 = 2 RESERVED 3: 0000000000100000 - 0000000045a3e000 = 1 RAM 4: 0000000045a3e000 - 0000000045a40000 = 2 RESERVED 5: 00000000fffc0000 - 0000000100000000 = 2 RESERVED Unable to lock ram - bridge not found enter handle_19: NULL Booting from Hard Disk... Booting from 0000:7c00 GRUB loading. WARNING - Timeout at ahci_command:172! WARNING - Timeout at ahci_command:172! WARNING - Timeout at ahci_command:172!
vm0 も「Drive reset failed.」というメッセージが出力されて、FreeBSD のブートローダが読み込まれませんでした。
yuichi_xy への返信
vm0.boot_drive=81 にしても、次の組み合わせでは vm1 側で AHCI タイムアウトが発生した。 vm0: FreeBSD 9.1-RELEASE (amd64版)
vm1: Debian GNU/Linux 7.0 (amd64版)
次の組み合わせでも、vm1 側で AHCI タイムアウトが発生した。
AHCI/1: registering: "AHCI/1: Hitachi HDS721032CLA362 ATA-8 Hard-Disk (298 GiBytes)" Scan for option roms Searching bootorder for: HALT drive 0x000f28e0: PCHS=16383/16/63 translation=lba LCHS=1024/255/63 s=625142448 Space available for UMB: c0000-ee000, f0000-f28e0 Returned 57344 bytes of ZoneHigh e820 map has 6 items: 0: 0000000000000000 - 000000000009fc00 = 1 RAM 1: 000000000009fc00 - 00000000000a0000 = 2 RESERVED 2: 00000000000f0000 - 0000000000100000 = 2 RESERVED 3: 0000000000100000 - 0000000045a3e000 = 1 RAM 4: 0000000045a3e000 - 0000000045a40000 = 2 RESERVED 5: 00000000fffc0000 - 0000000100000000 = 2 RESERVED Unable to lock ram - bridge not found enter handle_19: NULL Booting from Hard Disk... Booting from 0000:7c00 WARNING - Timeout at ahci_command:172! WARNING - Timeout at ahci_command:172! WARNING - Timeout at ahci_command:172!
よく考えると、vm1に割り当てたデバイスのメモリマップマップトレジスタやIOマップトレジスタに、vm0のBIOSからアクセスできてしまう仕組みになっていた。
そこで、vm1に割り当てたAHCIのメモリマップマップトレジスタやIOマップトレジスタに、vm0のBIOSからアクセスできないようにして実験したところ、AHCIのタイムアウトが発生しなくなった。
Index: vmm/core/gmm_ident.c =================================================================== --- vmm/core/gmm_ident.c (リビジョン 107) +++ vmm/core/gmm_ident.c (作業コピー) @@ -56,6 +56,8 @@ if (phys_in_vmm (gp)) { r = GMM_NO_MAPPING; + } else if (gp >= 0xf7c00000 && gp <= 0xf7c001ff) { + r = GMM_NO_MAPPING; } else { r = gp; } Index: vmm/core/io_iopass.c =================================================================== --- vmm/core/io_iopass.c (リビジョン 107) +++ vmm/core/io_iopass.c (作業コピー) @@ -90,6 +90,9 @@ if (cpu_is_bsp()) { for (i = 0; i < NUM_OF_IOPORT; i++) { + if (i >= 0xd000 && i <= 0xdfff) { + continue; + } set_iofunc(i, do_io_pass); } } else {
r108 で vm1 に割り当てたデバイスに対し、vm0 の BIOS/OS から I/O アクセスやメモリアクセスができないようにしました。 その結果、以下の組み合わせで、vm0 と vm1 の OS が起動することを確認しました。
vm0.boot_int18
vm0: Debian GNU/Linux 7.0 (amd64版)
vm1: FreeBSD 9.1-RELEASE (amd64版)
vm0.boot_int18
vm0: Debian GNU/Linux 7.0 (amd64版)
vm1: Debian GNU/Linux 7.0 (amd64版)
vm0.boot_int18
vm0: FreeBSD 9.1-RELEASE (amd64版)
vm1: Debian GNU/Linux 7.0 (amd64版)
vm0とvm1を同時起動すると、vm1でGRUBが起動したのち、AHCIタイムアウトが発生する。
IvyBridge世代のマシンで発生。
OSは次の通り。
vm1: Debian GNU/Linux 7.0 (amd64版)
障害発生リビジョン: r107