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

KVMでVLAN

eth1をVLAN専用のインターフェース、VLANタグを20とします。
設定をちまちま書くだけ。

/etc/sysconfig/network に

VLAN=yes

を追記。


仮想マシンとブリッジするインターフェースを定義。名前はなんでもいい。
/etc/sysconfig/network-scripts/ifcfg-br20

DEVICE=br20
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
DELAY=0


/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE="eth1"
BOOTPROTO="none"
HWADDR="00:E0:81:B2:77:DF"
NM_CONTROLLED="no"
ONBOOT="yes"


VLANタグ20のサブインターフェースを切ります。
/etc/sysconfig/network-scripts/ifcfg-eth1.20

DEVICE="eth1.20"
BOOTPROTO="none"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE=br20


ここまでの設定を行って、networkを起動しなおすか、再起動。
あとはvlanを指定して仮想マシンを起動。
qemuに以下のオプションを渡します。

    • device virtio-net-pci,vlan=20,id=net0,mac=52:54:00:ff:ff:02,bus=pci.0,addr=0x3 -net tap,vlan=20,ifname=tap02,name=hostnet0

Fedora 14でSpice

Fedora14からkvmにspiceが統合されました。
vncでのもっさり感がなくなります。おすすめ。
ただし現在のところlibvirtが対応していないのでvirt-manager等の管理ユーティリティは使えません。
qemuを直接起動します。



以下kvmのセットアップ含めたメモ。

  • 必要なパッケージの導入

yum install qemu-kvm bridge-utils spice-server

  • ネットワーク設定

chkconfig NetworkManager off
chkconfig network on


/etc/sysconfig/network-scripts/ifcfg-br0

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
DNS1=10.20.20.11
IPADDR=10.20.35.2
NETMASK=255.255.0.0
ONBOOT=yes
DELAY=0
GATEWAY=10.20.0.1


/etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="eth0"
BOOTPROTO="none"
HWADDR="00:E0:81:B2:57:FE"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE=br0

  • qemuのネットワーク設定

起動時に以下のスクリプトが呼び出されbr0にブリッジされます。

/etc/qemu-ifup

#!/bin/sh

echo "Bringing up $1 for bridged mode..."
ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
brctl addif br0 $1

/etc/qemu-ifdown

#!/bin/sh

echo "Removing $1 to br0..."
brctl delif br0 $1
echo "Shutting down $1..."
ifconfig $1 down

  • ゲストの起動

/usr/bin/qemu-kvm -enable-kvm -rtc base=localtime -name fedora -cpu qemu32 -smp 1,sockets=1,cores=1,threads=1 -m 1024 -drive file=/dev/mapper/vg_vm-fedora,if=none,id=drive-virtio-disk0,format=raw,boot=on -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk0,id=virtio-disk0 -drive file=/mnt/iso/Fedora/Fedora-14-i686-Live-Desktop.iso,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 -device virtio-net-pci,vlan=0,id=net0,mac=52:54:00:ff:00:02,bus=pci.0,addr=0x3 -net tap,vlan=0,name=hostnet0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 -vga qxl -spice port=5902,disable-ticketing -device virtio-serial,bus=pci.0,addr=0x7 -device spicevmc,subtype=vdagent -device AC97,id=sound0,bus=pci.0,addr=0x5 -boot once=d -daemonize -pidfile /var/run/qemu/fedora.pid

長ったらしいですが重要なのは以下の部分。

-vga qxl -spice port=5901,disable-ticketing
spiceを有効にします。
disable-ticketingだと認証等は何もありませんので必要に応じて適宜オプションを変更します。

-device AC97
サウンドを有効にします。
spiceは音も出せます。

-device spicevmc,subtype=vdagent
コピペを使う場合はこれを追加。
ゲストにvdagentをインストールすることでコピペができるようになります。

クライアントがWindowsの場合はDownloadからspice-client-win32-0.6.3.zipとspice_libs_win32_063_and_earlier.zipをダウンロード。
spicecを実行するのにはlibcelt_0_5_1.dllが必要です。

Fedoraをクライアントにする場合は
yum install spicec
でOK。
GUIで接続先を指定もしくはコマンドライン

spicec -h 10.20.35.2 -p 5901

としてゲストに接続しOSの導入を行う。


ゲストがWindowsの場合はDownloadにあるQXLドライバを導入。
Fedoraの場合は標準で導入されていますが私の環境ではXの起動に失敗してループにはまりました。
一度vncで起動し、yum updateでアップデートをかけるとxorg-x11-drv-qxlにアップデートがかかりますのでその後に改めてspiceを有効にすることで問題が解消しました。


  • オプションとしてコピペ。

Windowsの場合はvdagentをダウンロードしてきてから

vdservice install

Fedoraここにsrc.rpmへのリンクがありますので自分でビルドしましょう。(私はまだやっていません)


Ubuntuをゲストにする場合10.10で入ってくるqxlドライバでは解像度が1024x768までしか設定できません。
ここにあるパッチを4つともあてることで1024x768より大きい解像度が選択できるようになります。

Parted Magic

必要なときにバックアップイメージを取りたいな、ということでParted Magicを使ってみる。
ClonezillaとかG4Lなどが採用されています。

いちいちブートメディアを作るのも面倒なのでPXE Bootで。
TFTPサーバーはOpenSolarisDHCPサーバーはWindows
pxelinux.0だけはParted Magicのアーカイブに入っていないのでkernel.orgにあるsyslinuxのアーカイブから取り出します。


ディレクトリ構成。
TFTPサーバーのルートディレクトリにファイルをぶちまけたくなかったのでpxeディレクトリにまとめています。

-- pxe
|-- chain.c32 |-- hdt.gz |-- isohybrid |-- mbr.bin |-- memdisk |-- memtest |-- message.txt |-- message2.txt |-- message3.txt |-- message4.txt |-- pmagic | |-- bzImage | `-- initramfs |-- pxelinux.0 |-- pxelinux.cfg | `-- default |-- reboot.c32 |-- splashpm.png |-- syslinux.cfg `-- vesamenu.c32

pxe/pxelinux.cfg/default(抜粋)

UI vesamenu.c32
F1 message.txt
F2 message2.txt
F3 message3.txt
F4 message4.txt
F5 message5.txt
PROMPT 0
TIMEOUT 200
ONTIMEOUT normal

MENU DEFAULT normal
MENU TABMSG Press to edit options or for more information
MENU AUTOBOOT Automatic boot in # second{,s}...
MENU BACKGROUND splashpm.png
MENU TITLE Parted Magic - A Free Partitioning Tool
MENU color title 1;36;44 #ffffffff #00000000 std
MENU color sel 7;37;40 #FF000000 #FFC0C0C0 all
MENU color hotsel 1;7;37;40 #FF000000 #FFC0C0C0 all
MENU ROWS 12

LABEL normal
MENU LABEL ^1. Default settings (Runs from RAM)
LINUX pmagic/bzImage
INITRD pmagic/initramfs
APPEND edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rw vga=788 loglevel=0 max_loop=256 keymap=jp106 ja_JP

(以下略)

あとはWindowsDHCPでサーバーオプションの066、067を指定してやるだけ。


バックアップ目的で環境作ったけどChrominumとか入っていて普通に使えそうでびっくり。

RemoteFXに挑戦できませんでした

余っていたPCでRemoteFXを試そうと思いQ6600なマシンに2008R2にSP1 Betaを導入。
Hyper-VとRemoteFXを構成してさあ開始、というところで躓きました。

Hardware Considerations for RemoteFX | Microsoft Docs

両方満たしてませんでしたとさ。
Q6600と7600GTじゃあダメですね。

そのうちサポートしたハードウェアを用意してリベンジします。

SCCM クライアントのインストール

前回SCCMの導入までを行ったのでConfiguration Managerクライアントを展開する。
方法は何通りかあるけれど、今回はソフトウェアの更新ポイント(WSUS)を利用して導入を行う。
他の方法についてはリンク先参照。
Overview of Configuration Manager Client Deployment | Microsoft Docs

まず前提としてADのGPOでWSUSを更新先として設定しておくこと。
SCCMのインストールメディアの中、TOOLS\CONFIGMGRADMTEMPLATESにテンプレートとしてCONFIGMGR2007INSTALLATION.ADMが入っているので管理用テンプレートからインポートします。
[Configure Configuration Manager 2007 Client Deployment Settings]を有功にしてCCMSetup.exeに対して与えるコマンドラインオプションを設定します。

/mp:sccmhost SMSSITECODE=S01 FSP=sccmhost

こんな感じ。
サイトはインストールメディアに一緒に入っているGPOのテンプレートから設定してもOKかもしれない。
オプションに関する詳細はこちら。
About Configuration Manager Client Installation Properties | Microsoft Docs

このGPOを設定しておかないと各クライアントがConfiguration Managerクライアントをインストールしようとした時にエラーを出してインストールに失敗する。
イベントログに出力されるエラーの内容:

インストールの失敗: エラー 0x80070643 で次の更新のインストールに失敗しました: Configuration Manager Client Installation。

詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。

  • ソフトウェアの更新ポイント

SCCM導入直後だと「ソフトウェアの更新ポイント」として定義されているサーバーが無いのでConfiguration Manager Consoleの[サイトシステム]からSCCMを導入したサーバーに役割を追加する。

#これをやっていないと次に行う手順を行ってもクライアントが展開されない。
#特にエラーも出さないのでなかなか気付きませんでした...


[ソフトウェアの更新ポイントのクライアントインストール]から更新ポイントからのインストールを有功にすることで各々のクライアントごとにスケジュールされた更新のタイミングで Configuration Managerクライアントをインストールします。
#てっきりWindows Updateの一覧に出てくるのかと思ったらいつの間にか勝手に導入されていた。




クライアントの導入でこんなにハマるポイントがあるとは思いませんでした。
もう少し簡単だと良いのだけれど。

System Center Configuration Manager 2007 導入メモ

仕事で少しだけ関わりあるので興味本位で評価環境を作ってみたんですが
いやあ、たかだかインストールに手間がかかる。
SQL Server周りのいろいろなお作法を知らなかったせいもあるけれど。

今回作った環境

大筋は
System Center Configuration Manager 2007 SP1 & R2 サーバーインストール手順書 – 運用管理とセキュリティのウタタゴト
と同じ。
違うのは前提となるバージョンが違うのでKBがいくつか不要だったりすることと、SQL Serverを別にしているのでDBの接続先を指定してやること。


導入にあたってのメモ

  • SQL Serverを導入したコンピュータのローカルAdministratorsグループにSCCM 2007を導入するコンピュータアカウントを追加する
  • SQL Serverサービスを実行させるサービスアカウントをドメイン上のアカウントにした時はサービスプリンシパル名を手動で追加する
    • setspn -A MSSQLSvc/ \
    • setspn -A MSSQLSvc/:1433 \

setspnはどちらか片方でいいかもしれないが、FQDNを指定すること。コンピュータ名ではダメでした。
これをやらないとSCCM 2007のインストールの際に「データベース通知モニタのインストール」と「管理ポイントのインストール」で失敗する。
失敗した際はセットアップのログに

Begin monitoring - SMS_DATABASE_NOTIFICATION_MONITOR.
Timed out monitoring.

こんなエラーが出ます。
これでハマって4回ほどインストールをやり直しました。