2014年1月8日水曜日

【備忘録】Ubuntu 13.10 の KVM 仮想環境上に PT3 と epgrec による録画環境の構築実験(失敗)

【2014/01/08】現時点では、実験に失敗している。
PT3 ドライバか recpt1 が正常に動作していないようだ。
手順の問題なのか、仮想環境の問題なのか、今のところ調べ切れていない。
いつかまた、再実験のために、この記録を公開しておく。

我が屍を超えてゆけ!!!

環境

MB:GIGABYTE GA-990FXA-UD5(IOMMU 対応)
CPU:AMD Phenom II X4 955 Black Edition
MEM:8G
HDD:Seagate 2TB X 1(システム用)、2TB X 4(KVM ストレージプール用)
OS:Ubuntu 13.10 Server amd64
ICカードリーダー:PLEX PX-ICCR01
アースソフト PT3 Rev.A



ホストOSをインストール

Ubuntu を通常通りインストール
システム用HDDに 20GB EXT4 のルートパーティションと、8GB の SWAP パーティションを作成。

sudo apt-get install aptitude
sudo aptitude update
sudo aptitude full-upgrade

必要なものをインストール
sudo aptitude install ssh lvm2 mdadm


作業用のパーティション作成
システム用 HDD の残り領域に、作業用パーティションを作成。
パーティションの UUID を調べる
blkid

/etc/fstab に追記
5番目の値は、dump 対象の設定。しないように 0 とする。
UUID=上記で調べたUUID /mnt/work ext4 rw 0 2

マウント先を作成
mkdir /mnt/work

バックアップとリストアの訓練

リカバリー用起動メディア には、Ubuntu インストールメディアを使用する。

バックアップ

バックアップには、dump を使おうとしたが、インストーラで起動したときに、デフォルトで入っていないので断念。

シングルモードで起動
再起動して、BIOS 画面から ubuntu が起動する前に Shift キーを押下する。
Grab メニューが表示されたら、通常起動する項目を選択して e キーを押下
先頭が linux ~ となっている行の末尾に single または、 1 を追記して Ctrl + X を押下し起動する。

cd /mnt/work
tar czvplf 20131025.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/sys /

tar の最後の引数で、/ のように絶対パス指定だが、アーカイブされたファイルの中身は、先頭の / が省かれて、相対パスになっている。

リストア

インストーラから起動。
言語選択で「日本語」を選択。
メニューから「壊れたシステムを修復」を選択。
選択された言語でインストールを続けますか?はい
場所:日本
キーボードの設定:日本語
キーボードのレイアウト:日本語
ホスト名には、適宜名前を設定
時間の設定で「Asia/Tokyo」でいいか?と英語で聞かれるので、はい。

システムパーティションをフォーマットしたいので、ルートファイルシステムとして使うデバイスを聞かれたら、「ルートファイルシステムとして使用しない」を選択。
 「インストーラ環境内でシェルを実行」を選択 「続ける」を選択。

parted や mkfs.ext4 で、システム用パーティションを作成し、フォーマット。
フォーマットすると UUID が変わるので注意。mkfs の -U オプションで、UUIDを指定することも可能。
mkfs.ext4 /dev/sda1
exit

「異なるルートファイルシステムを選択」を選択
「/dev/sda1」を選択
「インストーラ環境内でシェルを実行」を選択 「続ける」を選択
/dev/sda1 が /target にマウントされた状態でシェルが起動する。

バックアップから書き戻す
前述のバックアップファイル保存先をマウント
mount /dev/sda3 /mnt
cd /mnt
tar xzvpf 20131025.tar.gz -C /target

バックアップしていないディレクトリを作成
mkdir /target/proc /target/lost+found /target/media /target/mnt /target/sys
特に /mnt のサブディレクトリの作り忘れに注意。 起動時にマウントは失敗するが、スキップすれば起動できる。
exit でメニューに戻る。

「/dev/sda1 内でシェルを実行」を選択。
bash
blkid /dev/sda1

/etc/fstab の UUID を確認し、異なっていれば修正。

swap用パーティションUUID が変わった場合、以下のファイルを変更。
/etc/initramfs-tools/conf.d/resume

update-grub2
update-initramfs -u -k all

exit
exit

メニューに戻るので、リブートを選択。
これで、リストアが完了。

KVM 環境構築

ここからは、ssh 接続で作業を行った。

必要なパッケージをインストール

sudo aptitude install kvm bridge-utils virt-manager qemu-system virt-viewer qemu-kvm-spice spice-client spice-client-gtk python-spice-client-gtk guestfish libguestfs-tools

qemu-kvm-spice と spice-client は、SPICE (VNCのようなもの)で接続ために必要。

guestfish と libguestfs-tools は、ゲストのストレージをあれこれ操作するために必要。
guestfish コマンドとか virt-rescue コマンドなどで、バックアップや、レスキューができる。

利用ユーザーの補助グループに libvirtd を追加

sudo usermod $(whoami) -a -G libvirtd
cat /etc/group | grep libvirtd

再起動する。
再起動をしないと、virt-manager 起動時に「libvirt に接続できませんでした」と怒られる。

仮想ブリッジを定義

sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
#NetworkManager#auto eth0
#NetworkManager#iface eth0 inet dhcp
# ここから追加
auto eth0
iface eth0 inet manual
up /sbin/ifconfig eth0 promisc
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_maxwait 1

ネットワーク設定を有効化

sudo /etc/init.d/networking restart

確認
ifconfig -a
br0       Link encap:イーサネット  ハードウェアアドレス 00:24:8c:52:c1:65
          inetアドレス:192.168.1.102  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
          inet6アドレス: fe80::224:8cff:fe52:c165/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:58 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:89 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:5686 (5.6 KB)  TXバイト:15970 (15.9 KB)
eth0      Link encap:イーサネット  ハードウェアアドレス 00:24:8c:52:c1:65
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  メトリック:1
          RXパケット:29029 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:8515 エラー:0 損失:0 オーバラン:0 キャリア:3
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:22073164 (22.0 MB)  TXバイト:762722 (762.7 KB)
lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:190 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:190 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:22165 (22.1 KB)  TXバイト:22165 (22.1 KB)
virbr0    Link encap:イーサネット  ハードウェアアドレス d2:c4:a1:7e:c2:82
          inetアドレス:192.168.122.1  ブロードキャスト:192.168.122.255  マスク:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)


不要なネットワーク設定を無効化

virbr0 は、KVM をインストールすると自動的に作成される。
外部から接続するような場合には、上記で作成した仮想ブリッジの方が便利なようなので、virbr0 を無効化しておく。

定義の確認
sudo virsh net-list
sudo virsh net-dumpxml default

停止
sudo virsh net-destroy default

自動起動を停止
sudo virsh net-autostart default --disable

確認
sudo virsh net-list --all

ゲストOS 格納用ストレージプール作成

ストレージプールは、LVM 上に確保する。
LVM に利用するストレージは、RAID10 構成とする。

4台すべてのKVM ストレージプール用 HDD をパーティション分けする。
今回は、来るべき 2TB 超え HDD を利用することを想定して、MBR(Master Boot Record)ではなく、GPT(GUID Partition Table)で、パーティションを作成することにした。
したがって、fdisk や cfdisk などでは、GPT が扱えないので、parted というコマンドを使うことになる。

コマンドの詳細を調べておく。


・パーティションテーブル種別
sudo parted /dev/sdb help mktable
  mklabel,mktable ラベルの種類  新しいラベル(パーティションテーブル)を作る

        ラベルの種類は次のうちから選びます: aix, amiga, bsd, dvh, gpt, mac, msdos, pc98, sun, loop


gpt を設定すればよいようだ。


・パーティション作成
sudo parted /dev/sdb help mkpart
  mkpart パーティションの種類 [ファイルシステムの種類] 開始 終了
                    パーティションを作る

        パーティションの種類は次のうちのどれかとなります: プライマリ、論理、拡張
        ファイルシステムの種類は次のうちから選びます: zfs, btrfs, ext4, ext3, ext2, fat32, fat16, hfsx, hfs+, hfs, jfs, swsusp,
        linux-swap(v1), linux-swap(v0), ntfs, reiserfs, freebsd-ufs, hp-ufs, sun-ufs, xfs, apfs2, apfs1, asfs, amufs5,
        amufs4, amufs3, amufs2, amufs1, amufs0, amufs, affs7, affs6, affs5, affs4, affs3, affs2, affs1, affs0,
        linux-swap, linux-swap(new), linux-swap(old)
        START と END は、ディスク上の位置を 4G や 10% などで表わします。負の値はディスクの終わりからの値になります。例えば、-1s は、最後のセクタを指します。

        mkpart はパーティションだけ作り、新しいファイルシステムは作りません。ファイルシステムの種類を指定すると、正しいIDが設定されます。


GPT の場合、パーティションの種類に指定したものは、name になるようなので、分かりやすいものをつければよいらしい。 RAID の場合は、ファイルシステムの種類を指定しなくてもいいようだ。

・フラグ設定
sudo parted /dev/sdb help set
   set NUMBER フラグ 状態
        ファイルシステムのフラグと状態を設定する
        NUMBER は Linux カーネルによってパーティション番号として使われます。MS-DOS ディスクラベルでは、基本パーティション番号は 1 から 4 までで、論理パーティションは 5 以降となります。         フラグは次のうちから選びます: boot, root, swap, hidden, raid, lvm, lba, hp-service, palo, prep, msftres, bios_grub, atvrecv,         diag         状態は on か off のどちらか

RAID とか LVM は、フラグとして設定するようだ。

パーティションを作成

sudo parted /dev/sdb
(parted) unit MB
(parted) mktable gpt
(parted) mkpart disk0 1 -1
(parted) set 1 raid on

(parted) quit

mkpart で、開始を 1 にしているのは、
同じように全ドライブにパーティションを作成

RAID10 作成

sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]
mdadm: /dev/sdb1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Oct 24 11:51:29 2013
mdadm: /dev/sdc1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sdd1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
mdadm: /dev/sde1 appears to contain an ext2fs file system
    size=975872K  mtime=Thu Jan  1 09:00:00 1970
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

RAID の状態を確認
cat /proc/mdstat

Physical Volume 作成

sudo pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created

Volume Group 作成

sudo vgcreate vg0 /dev/md0
  Volume group "vg0" successfully created

Logical Volume は、KVM ゲスト作成時に自動的に作成されるので、ここでは作成しなくてよい。


KVM ゲスト用ストレージプール作成
virsh pool-define-as pool logical - - - vg0 /dev/vg0
プール pool が定義されました

virsh pool-autostart pool
プール pool が自動起動としてマークされました

virsh pool-start pool
プール pool が起動されました

virsh pool-list --all
名前               状態     自動起動
-----------------------------------------
pool                動作中  はい (yes)


ゲストOS インストール

ゲストOSのインストール方法は色々あるが、リモート接続で行うことにした。
リモート接続でのインストールは、グラフィカルモードとテキストモードのいずれでも可能。
グラフィカルモードのインストールには、SPICE を利用する。

ゲスト名:「yebisu」
メモリ:「2048MB」
CPU:「4」
ディスク:「10GB」
インストーライメージファイル:「/mnt/work/ubuntu-13.10-server-amd64.iso」

「--os-variant」に指定する値は、Ubuntu のバージョンによっても変わるので注意。指定できる値は、「man virt-install」で該当項目を参照すること。


テキストモードでのインストール

SSH で接続し、テキストモードでインストールする。

sudo virt-install --connect qemu:///system \
--name=yebisu \
--connect=qemu:///system \
--ram=2048 \
--vcpu=4 \
--os-type=linux \
--hvm \
--virt-type=kvm \
--os-variant=ubuntusaucy \
--disk pool=pool,bus=virtio,size=10,cache=writethrough \
--location=/mnt/work/ubuntu-13.10-server-amd64.iso \
--network bridge=br0 \
--graphics none,keymap=ja \
--extra-args='console=tty0 console=ttyS0,115200n8'


グラフィカルモードでのインストール

【注意】2014/1/6 時点の Ubuntu 13.10 では、以下のようなエラーが出て失敗する。
因みに、Ubuntu 12.04 の時は、発生していなかった。
ERROR    unsupported configuration: Auto allocation of spice TLS port requested but spice TLS is disabled in qemu.conf
どうやら、TLS ポート指定をしない場合でも、自動ポートモードで起動してしまうバグなのかも・・・


Windows でインストールする場合、予め PuTTY および virt-viewer (virt-viewer-x64-0.5.7.msi)をインストールしておく。

はじめに PuTTY でホストに繋げ、以下のコマンドを入力。
ちなみに、video オプションには、cirrus を指定する。インストール時に、qxl を指定すると、ゲストの画面が表示できなかった。インストール後に、qxl に切り替えることが可能。

sudo virt-install --connect qemu:///system \
--name=yebisu \
--connect=qemu:///system \
--ram=2048 \
--vcpu=4 \
--os-type=linux \
--hvm \
--virt-type=kvm \
--os-variant=ubuntusaucy \
--disk pool=pool,bus=virtio,size=10,cache=writethrough \
--location=/mnt/work/ubuntu-13.10-server-amd64.iso \
--network bridge=br0 \
--graphics spice,port=5930,listen=0.0.0.0,keymap=ja \
--channel spicevmc \
--video cirrus \
--noautoconsole

sh: 0: getcwd() failed: No such file or directory

インストールの開始中...
ファイル version.info を読出中...                                                 |  116 B     00:00 ...
ファイル linux を読出中...                                                          |  10 MB     00:00 ...
ファイル initrd.gz を読出中...                                                      |  37 MB     00:00 ...
割り当て中 'oracle.img'                                                             |  10 GB     00:00
sh: 0: getcwd() failed: No such file or directory
sh: 0: getcwd() failed: No such file or directory
ドメインを作成中...                                                                   |    0 B     00:00
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

すぐにコマンドが終了する。ただし、インストールは裏で続行されている。

次に、virt-viewer を起動して、「spice://ホストのIP:5930」に接続する。
接続先の IP はホストを指定することに注意。
あとは、通常のグラフィカルインストールと同じ。
インストール完了後、通常はリブートされるはずだが、なぜか停止してしまう。
ゲストを起動して、virt-viewer を再接続する。
sudo virsh list --all
sudo virsh start yebisu


インストール途中では、以下の選択をした。
パーティションは、LVM などを利用しない。
追加のインストール項目は以下のものを選択。
OpenSSH server
Samba file server


必要に応じて、シリアルコンソールを使用できるように設定
ゲストで以下を設定
$ sudo vi /etc/init/ttyS0.conf

# ttyS0 -getty
#
# This service maintains a getty on ttyS0 from the point the system is
# stared until it is shut down again.

start on stopped rc or RUNLEVEL=[2345]
stop on runlevel[!2345]

respawn
exec /sbin/getty -8 115200 ttyS0

保存する。

接続できるか確認しておく。

sudo start ttyS0
ttyS0 start/running, process 2175

サービスが起動したら、ホスト側から接続してみる。
virsh console yebisu
ドメイン test に接続しました
エスケープ文字は ^] です

Enter キーを押す。
IDとパスワードを入力し、ログインできることを確認したら。 Ctrl + ] を押して切断。


再びゲストで作業
以下のファイルを修正。
Grub メニューを表示するようにする。
パクリ元参考:http://nanako-net.info/?p=838 (ありがたやありがたや)
sudo vi /etc/default/grub
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT=-1

ファイル変更後、Grub を更新
sudo update-grub

qxl プロトコルの有効化
SPICE の接続プロトコルを cirrus から qxl に変更する。ただし、BIOS、起動ログや Grub メニューなどが表示されなくなるので注意。
virt-manager で設定すれば、お手軽簡単だが、virsh で変更する方法も記載しておく。

virsh edit yebisu
video の記述を入れ替える。
    <video>
      <model type='qxl' vram='65536' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
ゲストのバックアップ

ゲストをシャットダウン
ゲスト上でシャットダウンするか、ホスト上で、virsh shutdown yebisu とする。

状態を確認
virsh list --all
 Id 名前               状態
----------------------------------
  - yebisu           シャットオフ



まずは、LogicalVolume をコピーするだけの簡単バックアップ方法
sudo virsh vol-clone yebisu.img yebisu-org.img --pool pool

リストアの時は、lvrename と virsh vol-clone などで、書き戻す。


次に、ダウンタイムを最小にする方法

ゲストの論理ボリュームのスナップショットを作成
指定したサイズは、オリジナルや、スナップ LV の方に変更があった場合に、その差分を書き込む領域で、この領域を使い切ると、オリジナルおよびスナップショットに書き込み不能になる。
したがって、スナップショットを削除するまでに発生するであろう、差分量以上を確保する必要がある。
sudo lvcreate --snapshot --size 1g --name yebisu.img_snap /dev/vg0/yebisu.img
sudo lvscan
  ACTIVE   Original '/dev/vg0/yebisu.img' [10.00 GiB] inherit
  ACTIVE   Snapshot '/dev/vg0/yebisu.img_snap' [1.00 GiB] inherit


スナップショットを作成した後は、ゲストを起動できる。
ただし、スナップショットのサイズ以上の変更を行うと、書き込み不能となるので注意。
バックアップ完了後、速やかにスナップショットを削除する必要がある。

スナップショットからゲストのバックアップを取得

tar で取る方法
sudo guestfish --ro -a /dev/vg0/yebisu.img.snap -i tgz-out / yebisu.bak.tar.gz

dd で取る方法
sudo dd if=/dev/vg0/yebisu.img.snap | xz -z - > yebisu.bak.dd.xz

スナップショットを削除
sudo lvremove /dev/vg0/yebisu.img.snap

これで、バックアップ完了。


録画ファイル保存用ストレージをゲストに追加

Logical Volume 作成

前述のストレージプール用に作成した Volume Group に作成する。
容量は 3TB とする。
sudo lvcreate --name record-video --size 3t vg0
sudo mkfs.ext4 /dev/vg0/record-video

ゲストに設定

ゲストを停止

virsh shutdown record

ディスクを追加

virsh attach-disk record /dev/vg0/record-video vdb --persistent --cache writethrough

マウントの設定は、epgrec の設定の時に行う。

その他の設定方法など

ゲストのストレージサイズを拡張

パーティションを確認
virt-list-partitions -lh /dev/vg0/yebisu.img
/dev/sda1 ext4 8.0G
/dev/sda2 unknown 1K
/dev/sda5 swap 2.0G

LogicalVolume をリネーム
sudo lvrename vg0 yebisu.img yebisu.1.img

LogicalVolume を作成
sudo lvcreate --size 30g --name oracle.img vg0

sda1 を拡張して、新規領域にコピー
オプションに --dryrun をつけると、実際には処理せずに、お試し実行できる。その他にも、--resize で、拡張サイズを直接指定できる。
virt-resize /dev/vg0/oracle.1.img /dev/vg0/oracle.img --expand /dev/sda1


デバイスのパススルー設定

参照1:http://yukkuri-maeni.blogspot.jp/2011/07/amdkvm-pci-pt2.html
参照2:http://d.hatena.ne.jp/m-bird/touch/20110722/1311366299
参照3:http://docs.fedoraproject.org/ja-JP/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html
参照4:https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/sect-Virtualization_Host_Configuration_and_Guest_Installation_Guide-SR_IOV-How_SR_IOV_Libvirt_Works.html


AMD-Vi の状態を確認

dmesg | grep AMD-Vi
[    1.037789] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
[    1.037790] AMD-Vi: Interrupt remapping enabled
[    1.047710] AMD-Vi: Lazy IO/TLB flushing enabled

散々悶絶した結果、この環境では、カーネルパラメータを指定する必要がなかった。
環境によって、設定方法にだいぶ違いがあるようだ。

PT3 デバイスを確認

lspci -nn
04:00.0 Multimedia controller [0480]: Altera Corporation Device [1172:4c15] (rev 01)

lspci -tv
-[0000:00]-+-00.0  Advanced Micro Devices, Inc. [AMD/ATI] RD890 PCI to PCI bridge
           +-00.2  Advanced Micro Devices, Inc. [AMD/ATI] RD990 I/O Memory Man ・・・
           ・・・
           +-0a.0-[03]----00.0  Marvell Technology Group Ltd. 88SE9172 SATA
           +-0b.0-[04]----00.0  Altera Corporation Device 4c15
           +-0c.0-[05]----00.0  Toshiba America Device 01ba
           +-11.0  Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA
           ・・・

IC カードリーダーを確認

lsusb
Bus 005 Device 002: ID 058f:9540 Alcor Micro Corp.

ゲストにデバイスを追加

virt-manager で上記2つのデバイスを追加。
「仮想マシンを開く」→「仮想マシンの情報を表示」→「ハードウェアを追加」ボタンを押下。
「PCI Host Device」からPT3デバイスを選択して完了。
同様に「USB Host Device」から IC カードリーダーを選択して完了。

ホストからの PT3 デバイスを開放

モジュールの確認

lsmod | grep stub
pci_stub               12622  0

上記で何も表示されなかった場合
sudo modprobe pci_stub

PT3 デバイスの開放

pci_stub の仕組みを理解していないのでよくわからないが、このようにする。
この作業は、ホストを再起動した場合に、毎回行う必要がある。
sudo bash -c "echo \"1172 4c15\" > /sys/bus/pci/drivers/pci-stub/new_id"
sudo bash -c "echo \"0000:00:0b.0\" > /sys/bus/pci/devices/0000:00:0b.0/driver/unbind"

色々なサイトで以下のコマンドも実行するような記述があるが、エラーになる。
指定の仕方が悪いのか・・・
いずれにしても、このコマンドを実行しなくても今のところ大丈夫のようだ。
sudo bash -c "echo \"0000:00:0b.0\" > /sys/bus/pci/drivers/pci-stub/bind"
bash: 0 行: echo: 書き込みエラー: そのようなデバイスはありません


デバイスの開放を行わないと、以下のようなエラーが発生する。
仮想マシンの開始中にエラーが発生しました: internal error: Invalid device 0000:04:00.0 driver file /sys/bus/pci/devices/0000:04:00.0/driver is not a symlink

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 96, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 117, in tmpcb
    callback(*args, **kwargs)
  File "/usr/share/virt-manager/virtManager/domain.py", line 1162, in startup
    self._backend.create()
  File "/usr/lib/python2.7/dist-packages/libvirt.py", line 698, in create
    if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirtError: internal error: Invalid device 0000:04:00.0 driver file /sys/bus/pci/devices/0000:04:00.0/driver is not a symlink


ゲストの起動して、デバイスの確認

lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
00:04.0 Audio device: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller (rev 01)
00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device
00:06.0 Unclassified device [00ff]: Red Hat, Inc Virtio memory balloon
00:07.0 Communication controller: Red Hat, Inc Virtio console
00:08.0 Multimedia controller: Altera Corporation Device 4c15 (rev 01)

lsusb
Bus 001 Device 002: ID 058f:9540 Alcor Micro Corp.
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub


ゲストに開発関連パッケージをインストール


sudo aptitude install unzip git subversion automake build-essential
sudo aptitude install omake autopoint libtool libboost-all-dev pkg-config
sudo aptitude install binutils-gold checkinstall yasm nasm paco ccache

リンカが gold になるように設定

もう少し言うと、通常のリンカと簡単に切り替え可能にし、gold の優先度を高く設定して、自動的に gold が有効になる、ということ。
sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 1
sudo update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 2
update-alternatives --list ld

カードリーダーの設定

パッケージをインストール
sudo aptitude install pcscd libpcsclite-dev pcsc-tools

カードリーダーの動作チェック
pcsc_scan

PT3 ドライバのインストール

ドライバをビルド

git clone http://github.com/m-tsudo/pt3.git
cd pt3
make clean
make
sudo paco -au
sudo paco -lp pt3-driver "make install"

ゲストを再起動

sudo reboot

ドライバの動作確認

dmesg | grep pt3
[    3.636319] pt3_drv: module verification failed: signature and/or required key missing - tainting kernel
[    3.636724] PT3: pt3_drv 0.0.1rev99 2013-08-05

デバイスファイルが存在することを確認

ls -la /dev/pt3*
crw-rw-rw- 1 root video 250, 0  1月  6 23:39 /dev/pt3video0
crw-rw-rw- 1 root video 250, 1  1月  6 23:39 /dev/pt3video1
crw-rw-rw- 1 root video 250, 2  1月  6 23:39 /dev/pt3video2
crw-rw-rw- 1 root video 250, 3  1月  6 23:39 /dev/pt3video3

arib25 のインストール

wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip
unzip c44e16dbb0e2.zip
cd pt1-c44e16dbb0e2/arib25
make clean
make
sudo paco -lp arib25 "make install"

recpt1 のインストール

git clone http://github.com/stz2012/recpt1.git stz_recpt1
cd stz_recpt1/recpt1
./autogen.sh
./configure --enable-b25
make clean
make
sudo paco -lp recpt1 "make install"

動作確認

recpt1 --b25 --strip 27 20 test.ts

epgdump のインストール

git clone http://github.com/stz2012/epgdump.git stz_epgdump
cd stz_epgdump
make clean
make
sudo paco -lp epgdump "make install"

epgrec のインストール

関連パッケージをインストール

sudo aptitude install apache2 php5 mysql-server mysql-client php5-mysql libav-tools

at コマンドを epgrec から利用できるように設定

sudo vi /etc/at.deny
以下の行を削除
www-data

MySQL の設定

文字コードを UTF-8 に設定。

以前アップデートした時に、文字化けして痛い目を見たので、設定しておくことにする。
sudo vi /etc/mysql/my.cnf
[client] および [mysqld] に以下の設定を追加する。

[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8

MySQL の再起動

sudo service mysql restart

設定の確認

mysql -u root -p
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

データベースおよびユーザ作成

mysql -u root -p
mysql> create database epgrec;
mysql> grant all on epgrec.* to epgrec@localhost identified by 'パスワードをここに記述';
mysql> flush privileges;


epgrec をダウンロード

cd /var/www
sudo git clone http://github.com/stz2012/epgrec.git epgrec

録画ファイル保存用ストレージのマウント設定

マウントディレクトリを設定

cd /var/www/epgrec
sudo rm video/*

UUID を調べる

sudo blkid
/dev/vdb: UUID="9e7ef31a-a571-44be-94c8-fa8e5b124f2e" TYPE="ext4"

fstab に追加

sudo vi /etc/fstab
UUID=9e7ef31a-a571-44be-94c8-fa8e5b124f2e /var/www/epgrec/video  ext4  defaults  0  2

ゲストを再起動
マウントされたことを確認

video ディレクトリ内のファイルを元に戻す

cd /var/www/epgrec
sudo git checkout .

epgrec の設定

cd /var/www
sudo chown -R www-data:www-data ./epgrec
cd epgrec

sudo cp do-record.sh.pt1 ./do-record.sh
sudo chown www-data:www-data do-record.sh
sudo chmod 755 do-record.sh
sudo chmod 777 cache settings templates_c thumbs video
sudo chmod 666 thumbs/index.html video/index.html
sudo cp config.php.sample config.php

sudo vi config.php
以下のように変更した。ただし、地域が変われば設定も変わる。
--- config.php.sample   2014-01-07 20:53:30.667557000 +0900
+++ config.php  2014-01-07 20:51:59.699557000 +0900
@@ -14,9 +14,10 @@
        "GR24" => "24",         // テレ朝
        "GR23" => "23",         // テレ東
 //     "GR20" => "20",         // MX TV
-//     "GR18" => "18",         // テレ神
-       "GR30" => "30",         // 千葉
-//     "GR32" => "32",         // テレ玉
+       "GR20" => "16",         // MX TV
+       "GR18" => "18",         // テレ神
+//     "GR30" => "30",         // 千葉
+       "GR32" => "32",         // テレ玉
        "GR28" => "28",         // 大学
 );

定期的に番組表を取得するクーロンを設定
sudo cp cron.d/getepg  /etc/cron.d


sudo vi /etc/php5/cli/php.ini
以下の行をコメントアウト
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,・・・・・
;disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,・・・・・

以下の行をコメントインして値を設定
;date.timezone =
date.timezone = "Asia/Tokyo"

ブラウザで接続
http://サーバー名/epgrec

文字化けしている場合は、ブラウザの設定で、文字コードを UTF-8 に変更。

次の画面での設定
変更した箇所だけ列挙する。
MySQL接続ユーザー名:epgrec
MySQL接続パスワード:データベース作成時に設定したパスワード
使用データベース名:epgrec
インストールURL:http://サーバー名/epgrec
サムネールの使用:使用する
ffmpegのパス:/usr/bin/avconv

設定を保存するボタンを押下

次の画面の設定は、好みに応じて適宜行うこと。

さらに進めて、EPG の初回受信を行う。
画面の説明で、cron の設定について書いてあるが、前述の設定で既に設定済みとなっている。


ここで、問題発生。
どうやら、きちんと PT3 が動作していないようだ。
recpt1 で録画しても、サイズが 0 のファイルしかできない。
試しに、ホスト側で同様にやってみたら、通常のファイルができあがった。
とりあえず、ここで断念する。

無念・・・・