sudo vi /etc/default/grub # GRUB_CMDLINE_LINUX に amd_iommu=on を追加する sudo mv /boot/grub/grub.cfg /boot/grub/grub.cfg.org sudo grub-mkconfig -o /boot/grub/grub.cfg sudo reboot
KVM上に録画サーバーの構築
作成日 | : | 2021/09/25 |
---|---|---|
最終更新日 | : | 2021/09/27 |
KVM上に録画サーバーの構築
作成日 | : | 2021/09/25 |
---|---|---|
最終更新日 | : | 2021/09/27 |
概要
かつて録画サーバーを構築した際、仮想環境ではなく実機上に構築したため保守が非常に大変でした。今回は仮想環境上に録画サーバーを構築し、環境を切り離して運用できるようにしたいと考えました。
前提条件
録画サーバーを構築するにあたって以下のデバイスが必要になります。
これらをKVM上で動作させるのに、CPUに仮想化支援機能があることとPCIパススルーができる必要があります。 KVMのホストに使用しているCPUがA10-7860Kなので、仮想化支援機能とPCIパススルー(IOMMU)に対応可能です。それぞれBIOSで有効化しておきます。
HOSTの設定
HOSTに物理的に接続しているチューナーカードやUSBカードリーダーをGUESTから扱えるようにします。
Kernelの起動オプションの設定
IOMMUを有効化するためにLinux Kernelに起動オプションを追加します。Intel系のCPUの場合はintel_iommu=onを、AMD系のCPUの場合はamd_iommu=onを設定します[3]。UbuntuにおいてKernelの起動オプションを設定するには以下の手順で行います[4]。実行後、問題がなければ再起動します。
デバイスドライバの無効化
PT1のデバイスドライバを無効化します。lspciコマンドでデバイスドライバとなるKernelモジュールを特定し、/etc/modprove.d/blacklist.confに登録します。登録後再起動し、Kernelモジュールが読み込まれていないことを確認します。
# PT1のデバイスを特定 lspci | grep Xilinx (ここから) 03:05.0 Multimedia controller: Xilinx Corporation Device 222a (rev 01) (ここまで) lspci -n | grep ^03:05.0 (ここから) 03:05.0 0480: 10ee:222a (rev 01) (ここまで) # PT1のドライバとKernelモジュールを特定 lspci -v -d 10ee:222a | grep Kernel (ここから) Kernel driver in use: earth-pt1 Kernel modules: earth_pt1 (ここまで) # PT1のドライバを無効化 sudo vi /etc/modprove.d/blacklist.conf (ここから) blacklist earth_pt1 # これを末尾に追記 (ここまで) lsmod | grep earth (ここから) earth_pt1 24576 0 dvb_core 143360 2 tc90522,earth_pt1 (ここまで) sudo reboot lsmod | grep earth (ここから) # 何も表示されないこと (ここまで)
GUESTにPCIデバイスとUSBデバイスを追加
PT1は先程lspciでデバイスを特定しました。しかし、SCR3310v2.0はまだ特定していません。USBデバイスを特定する際にはlsusbコマンドを使用します。特定したID 04e6:5116 のうち、 04e6 が Vendor ID、 5116 が Product IDになります。
lsusb | grep SCR (ここから) Bus 003 Device 002: ID 04e6:5116 SCM Microsystems, Inc. SCR331-LC1 / SCR3310 SmartCard Reader (ここまで)
PT1は 03:05.0 から、03 が Bus、 05 が Slot、 0 がFunctionになります。これらの情報をKVMのGUESTに追記します。
virsh edit guest
編集内容としては以下になります。
# 以下の内容を<devices></devices>の間に追記します。 <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x03' slot='0x05' function='0x0'/> </source> </hostdev> <hostdev mode='subsystem' type='usb' managed='no'> <source startupPolicy='optional'> <vendor id='0x04e6'/> <product id='0x5116'/> </source> </hostdev>
GUESTの設定
GUESTに録画サーバーを構築します。各種ドライバ[5][6]やテレビ放送受信サーバー[7]、録画サーバー[8]を参考文献を基に構築します。GUESTにはUbuntu Server 20.04.3 LTSを用いました。概ね「PT2録画ドライバ[5]」を参考に構築しましたが、ドライバ周りは「PT2への移行[6]」の内容に沿った形でないと録画されませんでした。
B-CASカード対応
まずは、B-CASカードを読み取れるようにします。インストール後、pcsc_scanコマンドを実行し、 Japanese Chijou Digital B-CAS Card と表示されれば問題ありません。表示を確認後 Ctrl + C で終了します。
sudo apt install pcscd pcsc-tools pcsc_scan
GUESTのデバイスドライバの無効化
デバイスドライバの無効化の項と同様にGUESTもデバイスドライバを無効化します。
sudo rmmod earth_pt1 sudo vi /etc/modprobe.d/blacklist.conf (ここから) blacklist earth_pt1 (ここまで)
各種開発ツールの導入
録画サーバーを構築するにあたって必要なツールをインストールします。何度かやり直しているため、不要なツールがある可能性もあります。
sudo apt install autoconf build-essential cmake curl git libssl-dev libtool \ libboost-all-dev pkg-config yasm mercurial libpcsclite-dev ffmpeg \ libavformat-dev libdlna-dev libupnp-dev pkg-config linux-headers-`uname -r`
地上波デジタル放送対応
地上波デジタル放送を復号するために、libarib25を導入します。
mkdir ~/arib25 cd ~/arib25 git clone https://github.com/stz2012/libarib25.git cd libarib25/ cmake . make sudo make install sudo /sbin/ldconfig cd
PT1用ドライバと録画ツールの導入
PT1用のドライバと録画ツールを導入します。まずは、ドライバを導入した上で録画ツールを導入します。
wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2 tar xvf tip.tar.bz2 cd pt1-17b4f7b5dccb/driver/ make all sudo make install sudo modprobe pt1_drv cd cd pt1-17b4f7b5dccb/recpt1/ ./autogen.sh ./configure --enable-b25 make sudo make install sudo reboot
録画サーバーの構築
録画サーバーを構築していきます。まずは、各種ツールを動かすために必要なNode.jsをインストールします。
sudo apt install curl curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt install -y nodejs sudo npm install n -g
Node.jsアプリケーションのプロセス管理を行うためにPM2をインストールします。
sudo npm install pm2 -g
テレビ放送受信サーバーのMirakurunをインストールします。
sudo npm install mirakurun -g --unsafe-perm --production sudo npm install mirakurun -g --production sudo mirakurun init sudo mirakurun restart
Mirakurunのクライアントとして動作するRivarunをインストールします。
sudo npm install rivarun -g sudo npm install arib-b25-stream-test -g --unsafe sudo mirakurun restart
Mirakurunの設定を変更し、
serverで、Mirakurun自体の設定をします。使用するポート番号やログの設定をしますがデフォルトのままで特に問題はなさそうです。
tunersでPT1との接続設定をします。BS、CS放送用のチューナーの有効化と地上波デジタル放送(GR)用のチューナーを有効化するために「 isDisabled: false」を追加します。
channelsで受信するチャネルを修正します。地域に合わせて修正が必要です。
sudo EDITOR=vim mirakurun config server sudo EDITOR=vim mirakurun config tuners sudo EDITOR=vim mirakurun config channels sudo mirakurun restart
logrotateの設定をしておきます。
sudo pm2 install pm2-logrotate sudo vi /etc/logrotate.d/mirakurun
Mirakurun用のlogrotateの設定ファイルは以下のようにします。
/usr/local/var/log/mirakurun.stdout.log /usr/local/var/log/mirakurun.stderr.log { daily compress rotate 7 missingok notifempty }
録画サーバーのUIとして動作するChinachuをインストールします。
git clone -b gamma git://github.com/kanreisa/Chinachu.git ~/chinachu cd ~/chinachu ./chinachu installer echo "[]" > rules.json cp config.sample.json config.json vi config.json sudo vi /etc/logrotate.d/chinachu cd ~/chinachu ./chinachu service wui execute sudo pm2 start processes.json sudo pm2 status sudo pm2 save
Chinachu用のlogrotateの設定ファイルは以下のようにします。
/usr/local/var/log/chinachu-operator.stderr.log /usr/local/var/log/chinachu-operator.stdout.log /usr/local/var/log/chinachu-wui.stderr.log /usr/local/var/log/chinachu-wui.stdout.log { daily compress rotate 28 missingok notifempty }
Chinachuへのアクセス
http://GUESTのIPアドレス:20772/ へアクセスするとChinachuにアクセスできます。
まとめ
- KVM環境のGUEST上に録画サーバーを構築した。
- GUESTで扱うためには、CPUの仮想化支援機能と、PCIパススルーの有効化が必要。
- PT1やPT2の動作例から、再現可能な方法を見つけるのに試行錯誤した。
参考文献
- 有限会社アースソフト, PT1/PT2 共通目次, libvirt, 2008-2019
- Identiv, Inc., SCR3310v2.0 USBスマートカードリーダー, Identiv, 2021
- ArchWiki:メンテナンスチーム, OVMF による PCI パススルー, ArchWiki, 2016-2021
- 西村めぐみ, 【 grub2-mkconfig/grub-mkconfig 】コマンド――GRUB 2の起動メニューを生成する, @IT, 2019
- kazu99, PT2録画ドライバ, Memorandum, 不明
- ねこった, PT2への移行, ねこったの日々, 2017-2021
- kazu99, mirakurun_html, Memorandum, 不明
- kazu99, chinachu_gamma_html, Memorandum, 不明