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カードリーダーが使えるようになります。