PT2をPCIパススルーしてKVMのWindowsXPゲストで使う

もうだいぶの前ことなんだけど、忘れないうちにメモ。

必要なもの

  • VT-d Enableなマシン
  • PT2
  • SCR3310-NTTCom

カードリーダーはWindowsで使えればなんでもいいと思う。
BonCasProxyとかでもいいんじゃないかな。

ホスト(Fedora 14)でロードされている不要なドライバをアンロードする。

ゲストで使うPCIバイスにホスト側でドライバがロードされているとゲスト側で認識できてもうまく動作しません。
最近のカーネルだとDVB版のPT2ドライバがカーネルに統合されてます。
ゲストで使うには邪魔なのでrmmodします。


ここで注意点がひとつ。
PT2はPCIのカードなので最近のマザーだとPCIe-PCIブリッジの下にぶら下がっています。
私の使っているマザーだと以下のような感じ。

lspci -tv
 -[0000:00]-+-00.0  Intel Corporation 82Q35 Express DRAM Controller
            +-02.0  Intel Corporation 82Q35 Express Integrated Graphics Controller
            +-1a.0  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4
            +-1a.1  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5
            +-1a.7  Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2
            +-1b.0  Intel Corporation 82801I (ICH9 Family) HD Audio Controller
            +-1c.0-[05]----00.0  Adaptec AAC-RAID
            +-1c.4-[0d]----00.0  Intel Corporation 82573V Gigabit Ethernet Controller (Copper)
            +-1c.5-[0f]----00.0  Intel Corporation 82573L Gigabit Ethernet Controller
            +-1d.0  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1
            +-1d.1  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2
            +-1d.2  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3
            +-1d.3  Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6
            +-1d.7  Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1
            +-1e.0-[11]--+-08.0  Integrated Technology Express, Inc. IT8213 IDE Controller
            |            \-09.0  Xilinx Corporation Device 222a
            +-1f.0  Intel Corporation 82801IR (ICH9R) LPC Interface Controller
            +-1f.2  Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA AHCI Controller
            +-1f.3  Intel Corporation 82801I (ICH9 Family) SMBus Controller
            \-1f.6  Intel Corporation 82801I (ICH9 Family) Thermal Subsystem

"Xilinx Corporation Device 222a"がPT2です。11:09.0がゲスト起動時に指定するIDです。
ツリー形式で見るとIT8213というIDEコントローラが同じブリッジにぶら下がっているのがわかります。
こいつのドライバもアンロードしてやらないと使えません。


で、何をアンロードするかを見ます。

lspci -vv -s 11:08.0
11:08.0 IDE interface: Integrated Technology Express, Inc. IT8213 IDE Controller (prog-if 85 [Master SecO PriO])
        Subsystem: Integrated Technology Express, Inc. IT8213 IDE Controller
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 

ata_generic, pata_acpi, pata_it8213が該当のドライバになるのでこいつらもrmmodしてやります。
ここは使っているマザーによりけりなので該当するものをアンロードしてやってください。


しかし起動時に毎回読まれてしまうものなので毎度rmmodするのも面倒ですしblacklistに追加。
/etc/modprobe.d/blacklist.conf

blacklist pata_it8213
blacklist pata_acpi
blacklist ata_generic
blacklist earth-pt1

ただし、この手のIDEコントローラーのドライバはinitrdに含まれているのでinitrdを作り直してやらないと起動時に毎回読まれてしまいます。
ちなみにblacklistに追加した後であればカーネルの更新時には勝手にinitrdからは削除してくれます。


以上でPT2の準備は終わり。

ICカードリーダーの準備

まずpcscdが動いていたら止めます。

/etc/init.d/pcscd stop
chkconfig pcscd off

これをやっておかないとゲスト起動時にホスト側でpcscdのエラーが大量に吐かれて/varがものすごい勢いで埋まります。


USBデバイスの確認

lsusb
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 003: ID 04e6:511a SCM Microsystems, Inc.
Bus 007 Device 002: ID 046d:c041 Logitech, Inc. G5 Laser Mouse
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

"SCM Microsystems, Inc."がSCR3310-NTTComです。
04e6:511aがゲスト起動時に指定するIDになります。

ゲスト起動

/usr/bin/qemu-kvm -enable-kvm -rtc base=localtime -name recpt2 -cpu qemu32 -smp 1,sockets=1,cores=1,threads=1 -m 1024 -drive file=/kvmfs/recpt2/recpt2.raw,if=none,id=drive-virtio-disk0,format=raw,cache=none,boot=on -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0 -drive file=/kvmfs/recpt2/recdata.raw,if=none,id=drive-virtio-disk1,format=raw,cache=none -device virtio-blk-pci,bus=pci.0,addr=0x8,drive=drive-virtio-disk1,id=virtio-disk1 -device virtio-net-pci,vlan=20,id=net0,mac=52:54:00:ff:00:01,bus=pci.0,addr=0x3 -net tap,vlan=20,ifname=tap01,name=hostnet0,vhost=on -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 -drive if=none,media=cdrom,id=drive-ide0-1-0,readonly=on,format=raw -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -k ja -chardev pty,id=serial0 -device isa-serial,chardev=serial0 -vga qxl -spice port=5901,disable-ticketing -device virtio-serial,bus=pci.0,addr=0x7 -device spicevmc,subtype=vdagent -device AC97,id=sound0,bus=pci.0,addr=0x5 -boot c -daemonize -chardev socket,id=monitor,host=127.0.0.1,port=4001,server,nowait -mon chardev=monitor,mode=readline -pidfile /var/run/qemu/recpt2.pid -pcidevice host=11:09.0,name=pci-pt2 -usbdevice host:04e6:511a

相変わらず長ったらしいですが大事なのは以下

-pcidevice host=11:09.0,name=pci-pt2
-usbdevice host:04e6:511a

これでゲストでPT2とICカードリーダーが使えるようになります。