2015/09/26

lxcコンテナに録画システムを移設する

今年リニューアル構築した録画システムをlxcコンテナ上で動くようにしたいわけです。
なぜなら、面白そうだから。ですが、独立したクリーンな環境で動かせることが一番の魅力です。
色々実験していると環境がぐちゃぐちゃになっていきます。
いつ何を入れたのか、どこに何を設定したのか、次第にあやふやになってくる。etckeeperだけじゃキープできない。
「ちょっと試したい時にコンテナをクローンして試して失敗したら消す!」をしたい。

録画システム用コンテナ作成後に、以下ゴニョゴニョする

ビルド環境

$ sudo apt-get install build-essential
(for recfsusb2n)
$ sudo apt-get install libboost-filesystem-dev libboost-thread-dev -y
(for epgdump)
$ sudo apt-get install cmake -y
(for FFmpeg)
$ sudo apt-get install yasm libx264-dev libfaac-dev
$ sudo apt-get install pkg-config

ビルドしてインストール

epgdump、ffmpeg は、
$ make install
recfsusb2n は Makefileにinstall記述がないので直接
$ sudo cp ./recfsusb2n /usr/local/bin

もうここは専用環境なのでバンバン/usr/localとか自由に使う。

udevdが動いてないので

どうやらコンテナではudevdが動かないらしい。前回は'video'グループ権限でアクセスできるような
ルール設定ファイルを /dev/udev/rules.d に置いたりしたけど、udevdが動いてないので意味が無い。
っていうか、後で気づいたことだけど、ホスト側で設定しておくべきことだった。
ホストに/etc/udev/rules.d/89-tuner.rulesを作成。内容は以下な感じ。
# FSUSB2N
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="0511", ATTRS{idProduct}=="0029", MODE="0664", GROUP="video"
これでブート時にチューナデバイスのグループが'video'になる。

USBデバイス スルー

コンテナ上の録画プログラム(recfsusb2n)がチューナーデバイスを扱えるように、
ホストに接続されているUSBデバイスをlxcコンテナからアクセスできるようにする必要がある。
# usb device
lxc.cgroup.devices.allow = c 189:* rwm
# mount
lxc.mount.entry=/dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir
上の記述を、コンテナのコンフィグファイルに追記して、コンテナ再起動する。
ホスト側と同じ状態でUSBデバイスをシェアした状態になる
コンテナから ls -l /dev/bus/usb/001/* すると
crw-rw-r-- 1 root root  189, 0  9月 23 20:13 /dev/bus/usb/001/001
crw-rw-r-- 1 root root  189, 1  9月 23 20:13 /dev/bus/usb/001/002
crw-rw-r-- 1 root root  189, 2  9月 23 20:13 /dev/bus/usb/001/003
crw-rw-r-- 1 root root  189, 3  9月 23 20:13 /dev/bus/usb/001/004
crw-rw-r-- 1 root video 189, 4  9月 25 17:50 /dev/bus/usb/001/005
crw-rw-r-- 1 root root  189, 5  9月 23 20:13 /dev/bus/usb/001/006

rvm入れなくても大丈夫かな
ubuntu14.04の時は、パッケージインストールされるrubyが1.9.3だったり、独立したruby環境にしたかったのでrvmを入れていたけど、ubuntu15.04のrubyは2.1.2で新し目だし、コンテナ自体が独立しているので、rvmではなく、普通にパッケージインストールしたものを使う。

gemインストール
録画システムはrailsで構築しているので、システムパッケージをまるっと持ってきて
(gitで退避しておいたので、git cloneして復活)そこで

$ bundle

で必要なgemパッケージをインストール
おっと、bundleも入ってなかったか。bundleが成功するまで、色々足りていないものを入れる。

(引っかかった順)
$ sudo gem install bundler
$ sudo apt-get install ruby-dev
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install mysql-server libmysqlclient-dev

bundleでgemインストールが完了したら
$ sudo mysql_secure_installation&アクセス用のmysqlユーザを作って権限設定とかして、、

DB作成とマイグレーション

$ RAILS_ENV=production bundle exec rake db:create
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=development bundle exec rake db:create
$ RAILS_ENV=development bundle exec rake db:migrate

NATで外と接続(ホストで)
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j DNAT --to <コンテナIP>:3000

したら、コンテナ側のrailsアプリ上で
$ rails s -b 0.0.0.0

http://ホスト:3000 へアクセスして、コンテナ上のwebrickサーバーが反応すればテストOK。

recmanとしてちゃんと稼動させる
テストは良好だったので、サーバーのデーモン駆動周りを整える
$ sudo apt-get install redis-server nginx -y

unicornとsidekiqを稼動させて、nginxからunicornへproxyするように。

最後にwheneverでcrontab更新
$ bundle exec whenever --update-crontab

NAT設定して、外からアクセスできるように
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to <コンテナIP>:80


思っていたよりすんなり移設できたが、気になる点としては、Ubuntu15.04からinitデーモンが、upstartではなく、systemdになったらしいこと。upstartも使えるけど、systemd対応の方が今風なのだと。unicornとsidekiqの自動起動をsystemd対応にしてみたい。

0 件のコメント:

コメントを投稿