はじめに
グロービス Advent Calendar 2018 21日目を担当する本間です。
普段は Ruby ばかり書いているので、たまには Ruby 以外のことを書きたいと思います。
タイトルのとおり、Raspberry Pi 3 Model B(本稿ではラズパイ3と記載します)を使って簡単な家電(HDDレコーダー)作りをしてみます。
本記事では著作権で保護されたコンテンツを扱うシステムを構築します
いわずもがなですが、著作権で保護されたコンテンツを適正な利用範囲を超えて利用することは犯罪となります
扱いには充分注意して下さい
必要なもの
この記事に沿ってオリジナルの HDD レコーダーを作ってみたいと思われた方は以下の材料を揃えてください。
沢山書いてますが、おそらく新たに買う必要があるものは Amazon とダイソーで何とかなると思います。
- ラズパイ3
- 2.5A程度が出力できる USB 充電器(ダイソーの¥300充電器が 2.4A 出て安くて重宝してます)
- 電源用マイクロ USB ケーブル(急速充電対応と書かれているものにしましょう)
- 中身を消して良いマイクロ SD カード(16GBあれば充分。速度が速ければ速いほど良いです)
- NTTコミュニケーションズ 接触型 USBタイプ ICカード リーダーライター ACR39-NTTCom
- PLEX USB接続ドングル型地上デジタルTVチューナー PX-S1UD V2.0
- B-CAS カード(デジテルチューナーを中古で入手した場合は再発行を依頼できます)
- テレビアンテナ用同軸ケーブル
- 中身を消して良い USB 接続の HDD
- ラズパイ用 HDMI モニター
- ラズパイ用 USB 接続キーボード
- 作業用の Mac (Windows ユーザーは他の記事を参考に OS インストールを乗り切って下さい)
- Wi-Fi
- DLNA 対応のテレビ(日本製のものは殆ど対応していると思います)
肝になりそうな IC カードリーダーとチューナーは Amazon のリンク貼っておきました。アフィリエイトのリンク貼れば良かった
これ以外の組合せでも組めるとは思いますが、ドライバーのインストールでハマったりするかもしれないので、本記事を参考にして新たに購入するならば上記をお勧めします。
なお、基本的なターミナルの使い方等は説明しません。ある程度のスキルを持っている方向けです。(Qiita 読者には不要な注釈かもしれませんが)
ラズパイ3 に最新の RASPBIAN をインストールする
まずは、本体となるラズパイ3に OS をインストールします。
OS イメージのダウンロード
作業用の Mac で OS のイメージをダウンロードします。
ダウンロードURL
https://www.raspberrypi.org/downloads/
不要なものはインストールしない、かつ足りないものは後からインストールすれば良いので、 LITE を選択します。ここでは Zip ファイルダウンロードを選びました。
ダウンロードしたファイルはチェックサムを確認しておきます。Mac では shasum
コマンドで確認します。サイトには SHA-256
で記載されているので、 -a 256
オプションを忘れずに。
/Users/norifumi/Downloads% shasum -a 256 2018-11-13-raspbian-stretch-lite.zip
47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d 2018-11-13-raspbian-stretch-lite.zip
この値がダウンロードページのものと合わなかったら、ダウンロードし直します。合っていたら次に進みます。
イメージをマイクロ SD カードに書き込む
作業用の Mac にマイクロ SD カードを差し込んで、 diskutil list
を実行します。
/Users/norifumi% diskutil list
...(略)...
/dev/disk2 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *15.5 GB disk2
1: Windows_FAT_32 boot 46.0 MB disk2s1
2: Linux 15.5 GB disk2s2
...(略)...
既に利用したことのある SD カードだと上記のようにパーティションが切られているかもしれません。
カード容量で SD がどの IDENTIFIER
かを判断します。分かりづらかったら、一度カードを抜いて diskutil
を実行すると、無くなっているものがどれかで判断できます。
SD カードの IDENTIFIER
が disk2
と分かったので、フォーマットします。
Apple
から始まるドライブをフォーマットすると辛い未来が待ち受けているので、指さし確認する位でちょうど良いと思います。
コマンドは以下を参考にして下さい。 RASPBIAN
というのはカードに対して付けるラベルなので、何でも良いです。
/Users/norifumi% diskutil eraseDisk MS-DOS RASPBIAN disk2
少し時間が掛かります。以下のようなメッセージが出て。
Started erase on disk2
Unmounting disk
Creating the partition map
[ / 0%..10%..20%......................................... ]
このようなメッセージが出たら完了です。
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT) with name RASPBIAN
512 bytes per physical sector
/dev/rdisk2s2: 29897536 sectors in 467149 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=29904896 bspf=3650 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
フォーマットが終わったら、ダウンロードした OS イメージファイルを展開して書き込みます。
まずは、展開。
/Users/norifumi/Downloads% unzip 2018-11-13-raspbian-stretch-lite.zip
Archive: 2018-11-13-raspbian-stretch-lite.zip
inflating: 2018-11-13-raspbian-stretch-lite.img
その後、一旦 SD カードをアンマウントします。マウントポイントを指定するので /dev/disk2
となります。(この例の場合)
/Users/norifumi/Downloads% diskutil umountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
dd
コマンドで書き込みます。 if=
の後は、展開した OS イメージファイル、 of=
の後は今アンマウントしたデバイスのマウントポイントを指定します。
この時、 /dev/disk2
の場合に /dev/rdisk2
といった具合に r
を付けると高速に書き込めます。
また、 bs=16m
というオプションを指定すると、ブロックサイズを 16MB として書き込めるので、これまた高速化します。
/Users/norifumi/Downloads% sudo dd bs=16m if=/Users/norifumi/Downloads/2018-11-13-raspbian-stretch-lite.img of=/dev/rdisk2
Password:
書き込み中はただ待たされるだけなので、気長に待ちます。せっかちな人は control + t
を押すと途中経過が出ます。
load: 2.52 cmd: dd 54798 uninterruptible 0.00u 0.36s
29+0 records in
28+0 records out
469762048 bytes transferred in 48.450478 secs (9695715 bytes/sec)
全て終わるとこのような表示になります。末尾に記載されているとおり、およそ3分掛かりました。
111+1 records in
111+1 records out
1866465280 bytes transferred in 182.270500 secs (10240084 bytes/sec)
以上で Mac を使って OS イメージを書き込んだ SD カードを作成することができました。
この SD カードをラズパイに挿して、電源を入れます。
ラズパイの設定
OS イメージが書き込まれたマイクロ SD カードを挿し、ディスプレイやキーボード、マウスを接続し、ラズパイの電源を入れます。
作業はなるべく Mac から実施したいので、早速 Wi-Fi に繋ぎます。
Resized root file system
起動すると最初に root file system の調整が自動で行われます。その後再起動しますので、少し待ちます。
Wi−Fi 設定
まずはログインします。初期状態では、以下のユーザーが設定されています。
- ユーザー名:
pi
- パスワード:
raspberry
これを使ってログインしたら、さっそく以下のコマンドを打ちます。 <SSID>
と <PASSPHRASE>
は利用する Wi-Fi のものを記載します。
pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase <SSID> <PASSPHRASE> >> /etc/wpa_supplicant/wpa_supplicant.conf'
(個人で使う分には気にならないとは思いますが)生パスフレーズが記載されているのが気になる場合は /etc/wpa_supplicant/wpa_supplicant.conf
ファイルを開いて生の Wi-Fi パスフレーズがコメントとして書かれて居る箇所( #psk=XXXX
)を削除しておきます。
ここで一旦再起動しましょう。
pi@raspberrypi:~ $ sudo init 6
再起動が完了したら、 DHCP で取得した IP アドレスを確認します。
pi@raspberrypi:~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether b8:27:eb:12:34:56 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b8:27:eb:12:34:57 brd ff:ff:ff:ff:ff:ff
inet 192.168.43.22/24 brd 192.168.43.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::dc99:5b44:6a5f:b73f/64 scope link
valid_lft forever preferred_lft forever
wlan0
の inet
の箇所を確認します。この例では 192.168.43.22
が取得できています。
アドレスが取得出来ていることを確認できたら、 ssh を有効にし、後は作業用の Mac から操作します。
pi@raspberrypi:~ $ sudo service ssh start
作業用の Mac から ssh で接続できるか確認します。
作業用の Mac のコンソールから先程確認した IP アドレスに向けて pi ユーザーで ssh 接続します。
パスワードは初期設定のままです。
/Users/norifumi% ssh pi@192.168.43.22
pi@192.168.43.22's password: <raspberry:初期パスワード>
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Thu Dec 13 02:09:12 2018 from 192.168.43.224
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
pi@raspberrypi:~ $
ここまでできれば、キーボードでログインした方はログアウトしても構いません。
ディスプレイやキーボードを外せます(ネットワーク設定等でミスしたらまた繋ぐ必要があります)。
OS の初期設定を行う
ここからは、Mac から ssh で設定します。まずはお馴染みの raspi-config
を実行します。
pi@raspberrypi:~ $ sudo raspi-config
順番に設定していきましょう。以下に記載の無いものは必要になった時に設定すれば良いと思います。
1 Change User Password
これを選択して、エンターキーを押します。メッセージが表示された後にコンソールで新しいパスワードを2回聞かれるので同じものを入力します。
Password changed successfully
と表示されたら完了です。
2 Network Options
-
N1 Hostname
- 設定しておきましょう。拘りが無ければそのまま(
raspberrypi
)でも構いません。今回はraspberrypi
のままにします。
- 設定しておきましょう。拘りが無ければそのまま(
4 Localisation Options
-
I1 Change Locale
-
[ ] ja_JP.UTF-8 UTF-8
にチェックします。その後の質問もja_JP.UTF-8
にします。
-
-
I2 Change Timezone
-
Asia
→Tokyo
を選択します
-
-
I3 Change Keyboard Layout
- キーボードを既に外していたら特に実行する必要はありません
-
I4 Change Wi-fi Country
-
JP Japan
を選びます
-
5 Interfacing Options
※これを忘れると面倒です
-
P2 SSH
- これを選択して、有効化してください。これを忘れると次の再起動で ssh できなくなります。
7 Advanced Options
最近のラズパイは初回起動時に自動で実施してくれるようですが、念のため。
-
A1 Expand Filesystem
- これを選択して実行します。
Root partition has been resized.
The filesystem will be enlarged upon the next reboot
と表示されたら完了です。 Finish
を選択すると一度再起動され、これまでの設定が反映されます。
IP アドレスを固定する
DHCP のままでも hostname を使ってアクセスはできますが、IP アドレスを固定しておきたい場合もあります。その時は以下の設定を行います。
今回は Wi-Fi を使って設定していますが、運用後のことも考えて有線 LAN も固定しておきます。
まず、有線 LAN のインターフェース名が自動で変更されないように、 eth0
で固定する設定を追加します。
pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt
1行で設定がツラツラと書かれていますので、最後に以下の設定を追加します
net.ifnames=0
こんな感じになればOKです。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=12345678-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait net.ifnames=0
そして、DHCP の設定を変更して固定されるようにします。
pi@raspberrypi:~ $ sudo vi /etc/dhcpcd.conf
末尾に以下の設定を記載します。 eth0
と wlan0
を指定しています。
interface eth0
static ip_address=192.168.43.200/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254
interface wlan0
static ip_address=192.168.43.201/24
static routers=192.168.43.254
static domain_name_servers=192.168.43.254
設定を反映するときは再起動します。次に ssh 接続する時は新しい IP アドレスになっていることに注意。
周辺機器の設定
ここから、ラズパイに接続する各周辺機器の設定を行います。引き続き Mac から ssh 接続で操作します。
IC カードリーダー
カードリーダーを利用できるようにするためにいくつかパッケージをインストールします。ラズパイに IC カードリーダーを接続する前に、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install pcscd libpcsclite-dev libccid pcsc-tools
インストールが完了したら、IC カードリーダーをラズパイの USB ポートに差し込みます。B-CAS カードもセットしておきます。
差し込んだら、以下のコマンドで B-CAS カードが認識できているかを確認します。
pi@raspberrypi:~ $ pcsc_scan
以下のような表示が出たらOKです
pi@raspberrypi:~ $ pcsc_scan
PC/SC device scanner
V 1.4.27 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.18
Using reader plug'n play mechanism
Scanning present readers...
(中略)
Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B F0 12 34 56 78 9A BC DE F0 12 34 56
Japanese Chijou Digital B-CAS Card (pay TV)
Chijou Digital
という単語に圧倒されながら、確認出来たら control + c
でコマンドを中断します。
地上デジタルTVチューナー
ドライバーは既に Linux カーネルに含まれているので、ファームウェアのファイルだけあれば利用可能です。
必要なファイルはメーカーのサイトの旧版のドライバーから手に入れることができます。
ダウンロード先: http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ wget http://plex-net.co.jp/plex/px-s1ud/PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ unzip PX-S1UD_driver_Ver.1.0.1.zip
pi@raspberrypi:~ $ sudo cp PX-S1UD_driver_Ver.1.0.1/x64/amd64/isdbt_rio.inp /lib/firmware
ここまで完了したら、以下のコマンドを実行します
pi@raspberrypi:~ $ lsusb
カードリーダーと、あとは元々ラズパイに搭載されているもののみ表示されます
Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
地上デジタルTVチューナーを接続して、再度実行します
pi@raspberrypi:~ $ lsusb
Bus 001 Device 005: ID 3275:0080 VidzMedia Pte Ltd
Bus 001 Device 004: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
VidzMedia
というのが増え、認識されたのが確認できました
録画用ソフトウェアのインストール
ここからソフトウェアをインストールして、コマンドラインで録画ができるところまで進めます
デコーダーのインストール
Linux用ARIB STD-B25ライブラリ のダウンロードとインストールを行います
pi@raspberrypi:~ $ sudo apt-get install cmake
pi@raspberrypi:~ $ wget https://github.com/stz2012/libarib25/archive/master.zip
pi@raspberrypi:~ $ unzip master.zip
pi@raspberrypi:~ $ cmake libarib25-master
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install
録画アプリケーションのインストール
コマンドラインから録画ができる recdvb をインストールします
pi@raspberrypi:~ $ sudo apt-get install autoconf
pi@raspberrypi:~ $ wget http://www13.plala.or.jp/sat/recdvb/recdvb-1.3.2.tgz
pi@raspberrypi:~ $ tar zxvf recdvb-1.3.2.tgz
pi@raspberrypi:~ $ cd recdvb-1.3.2
pi@raspberrypi:~ $ ./autogen.sh
pi@raspberrypi:~ $ ./configure -enable-b25
pi@raspberrypi:~ $ make
pi@raspberrypi:~ $ sudo make install
ここまでできたら、一度動作確認をします。地上デジタルTVチューナーに TV のアンテナ線を接続して、コマンドラインから以下のコマンドを実行します。
※以下のコマンドの 29
は栃木(矢板発)のとちぎテレビの物理チャンネル番号です。チャンネル番号はマスプロ社の資料 等を参考に、適宜変更します
pi@raspberrypi:~ $ recdvb --b25 --strip 29 5 ~/sample.m2ts
コマンドの 5
は 5秒録画するという指定なので、5秒ほど待たされた後に完了します。
録画されたビデオを Mac 等で取得して、 VLC for Mac OS X 等で再生してみます。
/Users/norifumi% scp pi@192.168.43.201:~/sample.m2ts ~/Desktop
デスクトップにコピーされた sample.m2ts
ファイルを開いて確認して下さい。テレビ番組の内容が5秒表示されたらここまでの作業は成功です。
ネットワーク越しにファイルを再生できるようにする
ラズパイに撮りためたテレビ番組を家庭内のテレビ等から見られるようにしたいので、 DLNA サーバーをインストールします。ラズパイに GUI を導入して、ラズパイに接続したディスプレイで再生しても良いのですが、家電感を出すにはやはりテレビで見たいです。
USB 接続の HDD を追加する
DLNA サーバーを導入する前にラズパイに HDD を追加しておきます。録画した番組を SD カードに保存するとあっという間に容量を使い切りそうですし、OS とは別のドライブに保存したいので。
ラズパイに HDD を接続して、以下のコマンドを実行します。
以下の操作を行うと接続されたHDDのデータは全て削除されます
pi@raspberrypi:~ $ sudo fdisk -l
すると、以下のような表示が出てきます。今回は 500GB の HDD を接続しました。
/dev/sda
に接続されていることが分かります。
(前略)
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000
(後略)
このディスクをフォーマットし直します。
pi@raspberrypi:~ $ sudo mount | grep sda
何も表示されなければ自動でマウントされていないので、作業を開始できます。
(自動でマウントされていたら umount
コマンドでアンマウントします)
/dev/sda
で認識されているので、 fdisk
コマンドでパーティションを切り直します。
pi@raspberrypi:~ $ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.29.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
A hybrid GPT was detected. You have to sync the hybrid MBR manually (expert command 'M').
Command (m for help):
対象ディスクを誤っていると再度インストールし直しになるので、まずはパーティション一覧を確認します。
p
コマンドを入力して、エンターキーを押します。
(この HDD は元々 Macbook に接続されていたものなので Apple boot があったりします)
Command (m for help): p
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000
Device Start End Sectors Size Type
/dev/sda1 40 409639 409600 200M EFI System
/dev/sda2 409640 975503591 975093952 465G Microsoft basic data
/dev/sda3 975503592 976773127 1269536 619.9M Apple boot
このディスクで間違いありません。 /dev/sda1
、 /dev/sda2
、 /dev/sda3
、全てを削除します。
d
を入力してエンターキーを押します。
Command (m for help): d
Partition number (1-3, default 3): 1
Partition 1 has been deleted.
Command (m for help): d
Partition number (2,3, default 3): 2
Partition 2 has been deleted.
Command (m for help): d
Selected partition 3
Partition 3 has been deleted.
あっさり削除できます。再度設定を確認します。p
コマンドを実行します。
Command (m for help): p
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 00000A57-4A2C-0000-0034-0000789A0000
パーティションが無くなりました。
n
コマンドを実行して、新しいパーティションを作成します。
パーティション番号は 1
、パーティションの先頭は最小の数字(この例では 34
)、最後の数字はデフォルト(全部使う)にします。
Command (m for help): n
Partition number (1-128, default 1): 1
First sector (34-976773134, default 2048): 34
Last sector, +sectors or +size{K,M,G,T,P} (34-976773134, default 976773134):
Created a new partition 1 of type 'Linux filesystem' and of size 465.8 GiB.
ここまでできたら、w
コマンドで変更を反映して完了です。
Command (m for help): w
The device contains hybrid MBR -- writing GPT only. You have to sync the MBR manually.
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
次に、パーティションをフォーマットします。 mkfs.ext4
コマンドを実行します。入力を求められたらエンターキーを押して先に進みます。
pi@raspberrypi:~ $ sudo mkfs.ext4 /dev/sda1
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 122096637 4k blocks and 30531584 inodes
Filesystem UUID: 082f76dd-7694-4613-b3c2-85278bcb9a4e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks):
done
Writing superblocks and filesystem accounting information: done
あと一息です。今フォーマットしたパーティションをラズパイの起動時に自動でマウント(利用可能に)するようにします。
最初にマウント先を作成します。
pi@raspberrypi:~ $ sudo mkdir /var/lib/minidlna
次に、ディスクの UUID を調べます。
pi@raspberrypi:~ $ sudo blkid /dev/sda1
/dev/sda1: UUID="08abcdef-789a-4567-bcdef-123456789abc" TYPE="ext4" PARTUUID="12345678-6789-abcd-ef12-3456789a1234"
それらの値を /etc/fstab
に追記します。
pi@raspberrypi:~ $ sudo vi /etc/fstab
追記するのは以下の行です。最後に1行追記します。 UUID
の値は上記で調べたものにします。
UUID=08abcdef-789a-4567-bcdef-123456789abc /var/lib/minidlna ext4 defaults 0 0
手動でマウントできるか確認します。
pi@raspberrypi:~ $ sudo mount -a
エラーが出なければOKです。念のため確認してみましょう。
pi@raspberrypi:~ $ mount | grep sda1
/dev/sda1 on /var/lib/minidlna type ext4 (rw,relatime,data=ordered)
上記のような表示が出ればOKです。
マウント先を /var/lib/minidlna
にしていますが、このすぐ後に理由が分かります。
ReadyMedia のインストール
DLNA サーバーソフトウェアの ReadyMedia(旧MiniDLNA) をインストールします。 apt
を使って簡単にインストールできます。
pi@raspberrypi:~ $ sudo apt-get install minidlna
録画したファイルを DLNA で共有するために、ディレクトリのオーナーを変えます。
外付け HDD のマウントポイントをここにしておいたのは、 ReadyMedia がデフォルトでここを共有するからでした。
pi@raspberrypi:~ $ sudo chown pi:pi /var/lib/minidlna
pi@raspberrypi:~ $ ls -la /var/lib/minidlna/
合計 28
drwxr-xr-x 4 pi pi 4096 12月 13 18:10 .
drwxr-xr-x 30 root root 4096 12月 13 18:21 ..
drwx------ 2 root root 16384 12月 13 19:00 lost+found
試しに、先程 5秒テスト録画したファイルを移動して、 Mac から試聴できるか確認します。
pi@raspberrypi:~ $ mv sample.m2ts /var/lib/minidlna
作業用の Mac で VLC for Mac OS X を立ち上げて、 ローカルネットワーク
の ユニバーサルプラグ & プレイ
を開きます。
少し待つと raspberrypi:minidlna
といった名前(:
の前はホスト名です)が見つかります。
ビデオ
を開くと sample
(先程のサンプル録画したファイルのファイル名)が見つかるので、それをクリックして再生します。
録画したテレビ番組が見られれば成功です。
動作は問題無さそうですが、ログを確認すると、気になるメッセージが出ています。
pi@raspberrypi:~ $ cat /var/log/minidlna.log
(前略)
[2018/12/13 18:22:21] inotify.c:199: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [2] and I do not have permission to increase this limit. Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.
(後略)
Inotify
の max_user_watches
が 8192
だと小さすぎるとのことでした。運用してみないと適正値は分かりませんが、何となく4倍くらいにしておきます。
現状の設定を念のため確認します。
pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192
やはり 8192
でした。設定を変えます。
pi@raspberrypi:~ $ sudo vi /etc/sysctl.conf
一番最後に以下の1行を追加します。
fs.inotify.max_user_watches = 32768
設定変更を反映するには -p
オプションを付けて sysctl
コマンドを実行します。
pi@raspberrypi:~ $ sudo sysctl -p
fs.inotify.max_user_watches = 32768
先ほどと同じコマンドで反映されたか再度確認します。
pi@raspberrypi:~ $ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 32768
OKでした。
あともう1個だけ、設定を変えておくと良い場所があります。
pi@raspberrypi:~ $ sudo vi /etc/minidlna.conf
以下の箇所を修正します。
(前略)
# Automatic discovery of new files in the media_dir directory.
inotify=yes # ← コメントアウトされているので、コメントを外します
(中略)
# SSDP notify interval, in seconds.
notify_interval=60 # ← コメントを外し、数字を 895 から 60 に変更
(後略)
ファイルを自動で探してくれる設定です。保存したら、 minidlna を再起動します。
pi@raspberrypi:~ $ sudo service minidlna restart
ここまでで、ある程度形になってきました。後は
- コマンドラインではなく、もっと簡単な方法で録画ができるようにしたい
- 録画したファイルが自動的に DLNA 共有ディレクトリに入って欲しい
が満たせれば、HDD レコーダーとして使えそうです。
チューナーサーバーのインストール
インストールする順番が逆になりますが、録画サーバーとして Chinachu を使いたいと思います。そのため、まず Mirakurun をインストールします。
Node.js のインストール
Mirakurun をインストールするために、Node.js が必要なのでインストールします。
apt-get
コマンドでインストールできる Node.js では Mirakurun のインストールがうまく行かないので、手動でインストールします。
このドキュメントを参考に、 一部 sudo
を足して実行します。
pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
pi@raspberrypi:~ $ sudo apt-get install -y nodejs
バージョンを確認すると以下のものが入りました。Mirakurun の Requirements を満たしています。
pi@raspberrypi:~ $ node -v
v8.14.0
pi@raspberrypi:~ $ npm -v
6.4.1
Mirakurun のインストール
Node.js のインストールが完了したら、あとは npm
コマンドで入ります。動作確認のために Rivarun もインストールしておくと便利です。
pi@raspberrypi:~ $ sudo npm install pm2 -g
pi@raspberrypi:~ $ sudo npm install mirakurun -g --unsafe --production
pi@raspberrypi:~ $ sudo npm install rivarun -g
エラーが出ずに終了したら次に進みます。
Mirakurun の設定
まずチューナーの設定を行います。
pi@raspberrypi:~ $ sudo vi /usr/local/etc/mirakurun/tuners.yml
ファイルの最後に以下を追記します。 yaml ファイルなので、インデントも重要です。
- name: PX-S1UD
types:
- GR
command: recdvb --b25 --strip <channel> - -
次に、チャンネルファイルの設定を変更します(以下は那須塩原市の例)。
pi@raspberrypi:~ $ sudo mirakurun config channels
自動でチャンネルスキャン してくれますが、時間が掛かるので、先ほどのマスプロ社が公開している資料を見て、チャンネル設定を書き込みました。
- name: GYT
type: GR
channel: '29'
- name: CX
type: GR
channel: '35'
- name: TBS
type: GR
channel: '15'
- name: TX
type: GR
channel: '18'
- name: EX
type: GR
channel: '17'
- name: NTV
type: GR
channel: '19'
- name: NHK E
type: GR
channel: '39'
- name: NHK G
type: GR
channel: '47'
以上が完了したら、一度 Mirakurun を再起動します。
pi@raspberrypi:~ $ sudo mirakurun restart
[PM2] Applying action restartProcessId on app [mirakurun-server](ids: 0)
[PM2] [mirakurun-server](0) ✓
┌──────────────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ mirakurun-server │ 0 │ 2.7.4 │ fork │ 722 │ online │ 1 │ 0s │ 0% │ 15.3 MB │ root │ disabled │
└──────────────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
再起動したら、ログを確認してエラーが無いことをチェックします。
pi@raspberrypi:~ $ sudo mirakurun log server
特にエラーが出ていなければ、以下のコマンドを打って、とちテレを5秒録画してみます。
pi@raspberrypi:~ $ rivarun --ch GR/29 5 /var/lib/minidlna/tochitele.m2ts
status: 200
headers: {"server":"Mirakurun/2.7.4","content-type":"video/MP2T","date":"Fri, 14 Dec 2018 12:06:49 GMT","connection":"close","transfer-encoding":"chunked"}
保存先を DLNA で共有しているディレクトリにしたので、録画ファイルが DLNA を経由して見られればOKです。
録画サーバーのインストール
Chinachu をインストールします。Github からソースを取得してコンパイルするので、 git
コマンドが使えるようにします。
pi@raspberrypi:~ $ sudo apt-get install git
ソースコードを取得します。
pi@raspberrypi:~ $ git clone git://github.com/kanreisa/Chinachu.git ~/chinachu
インストーラーを実行します。 Auto
を選びます。
pi@raspberrypi:~ $ cd ~/chinachu/
pi@raspberrypi:~/chinachu $ ./chinachu installer
Chinachu Installer Menu:
[!] These are installed under all /home/pi/chinachu/...
[!] Recommend the Auto installation.
1) Auto (full) 3) Node.js Environment 5) ffmpeg
2) submodule 4) Node.js Modules
what do you install? > 1
selected: Auto (full)
かなり時間が掛かるので、このまましばらく放置します。先に tmux
をインストールして、セッションが切れないようにすると良いかも知れません。
以下のような表示が出たら完了です。(ここでインストールされる ffmpeg
は使わないのですが)
(前略)
ffmpeg-4.1-32bit-static/ffmpeg
ffmpeg-4.1-32bit-static/GPLv3.txt
'ffmpeg-release-32bit-static.tar' を削除しました
Creating libav aliases...
'/home/pi/chinachu/usr/bin/avconv' -> '/home/pi/chinachu/usr/bin/ffmpeg'
'/home/pi/chinachu/usr/bin/avprobe' -> '/home/pi/chinachu/usr/bin/ffprobe'
ffmpeg --> done.
ARM 用 ffmpeg の導入
Chinachu の設定の前に ffmpeg build のサイトから ARM 用にビルド済みの ffmpeg をダウンロードし、 Chinachu が標準でインストールしたものと入れ替えます。
pi@raspberrypi:~ $ wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-armhf-static.tar.xz
pi@raspberrypi:~ $ tar xvf ffmpeg-release-armhf-static.tar.xz
pi@raspberrypi:~ $ cd ffmpeg-4.1-armhf-32bit-static
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ cp ffmpeg ffmpeg-10bit ffprobe qt-faststart ~/chinachu/usr/bin/
pi@raspberrypi:~/ffmpeg-4.1-armhf-32bit-static $ sudo cp ffmpeg ffmpeg-10bit ffprobe /usr/local/bin
Chinachu の設定
Chinacu の設定を行います。細かい設定は運用しながら行うとして、今は動くための最低限のものだけ。
pi@raspberrypi:~/chinachu $ cp config.sample.json config.json
pi@raspberrypi:~/chinachu $ vi config.json
uid
が設定されていないので、 pi
ユーザーで動かします。また保存先を /var/lib/minidlna/
に変更し、ストリーミング再生時に HW 支援を使用します。
"uid": null,
# ↓ "pi" に変更
"uid": "pi",
"recordedDir" : "./recorded/",
# ↓ "/var/lib/minidlna/" に変更
"recordedDir" : "/var/lib/minidlna/",
"vaapiEnabled": false,
# ↓ true に変更
"vaapiEnabled": true,
次に空のルール設定ファイルを作成します。この辺は本家のインストレーションガイドのとおりに進めます。
pi@raspberrypi:~/chinachu $ echo [] > rules.json
Chinachu の動作チェック
ここまでできたら、 Chinachu を起動して動作確認します。
pi@raspberrypi:~/chinachu $ ./chinachu service wui execute
特にエラーが表示されず、コマンドが終了しなければOKです。以下のような表示がありますので
14 Dec 09:34:31 - HTTP Open Server Listening on { address: '192.168.43.200', family: 'IPv4', port: 20772 }
ブラウザで http://[http://[ラズパイのIPアドレス]:20772]/
(この例だと IPアドレスは 192.168.43.200
)にアクセスします。以下のような画面が出ればここまで成功です。
まだ、番組表等は取得していないので、取得します。ラズパイのコンソールで control+¥
を押して、サーバーを停止し、以下のコマンドを実行します。
pi@raspberrypi:~/chinachu $ ./chinachu update
特に Mirakurun への接続エラー等が出なければOKです。再度
pi@raspberrypi:~/chinachu $ ./chinachu service wui execute
を実行して、ブラウザからアクセスして、番組表が取得できればOKです。
自動実行の設定
ここまで設定できたら、 Chinachu が自動で起動するように設定します。
pi@raspberrypi:~/chinachu $ sudo pm2 start processes.json
pi@raspberrypi:~/chinachu $ sudo pm2 save
エラーが出ずに実行できたら、一度再起動して、自動で起動できたことを確認します。
pi@raspberrypi:~/chinachu $ sudo init 6
再起動後にブラウザで Chinachu にアクセスできたら成功です。
最後に
実装中は Mac の VLC プレイヤーで再生を試したりしていましたが、家庭用のテレビからも再生できるようになっています。
例えば、 Panasonic のテレビであれば「お部屋ジャンプリンク」という機能で、家庭内の LAN 上のラズパイが見つけられ、そこに録画したファイルが再生できます。
また、最近のテレビにはブラウザ機能も付いているので、そのブラウザで Chinachu をブックマークしておけば、テレビから Chinachu の番組表を開いて、録画することもできます。もちろん、スマートフォンで Chinachu を操作しても良いでしょう。
ここまでできれば、一応家電と言えるのでは無いでしょうか。オープンソースソフトウェアだけでここまでできることに、作者の皆さまには感謝しかありません。
年末年始は、ここから自分なりのカスタマイズを楽しんでみたいと思います。