Mono Works

チラシのすきま

ラズパイでラジオ録音してNASへファイル転送

オールナイトニッポンを聴きたくなったけど、リアタイで聴いていられるほどの体力もなし。というわけで家に転がっていたRaspberry Pi Zero W(以下、Zeroと表記)を使って、やってみたことをメモ。

  1. Raspberry Pi OSのデフォルトユーザーが初期設定から削除されたので、公式のイメージ書き込みソフトを使って、Zeroのモニタレスセットアップイメージ作成。
  2. Zeroにradikoのタイムフリーを録音するためのスクリプトを導入し、定時に録音を実行するようcrontabを設定。
  3. ZeroのmicroSDに保存した録音ファイルをNASに転送するため、転送開始でNASをマウントし、転送後一定時間で自動アンマウントするように設定。
  4. 定期的にNASへファイルを転送し、転送に成功したファイルはZero側から削除するようcrontabを設定。

参考サイト

Zeroの基本セットアップ

冒頭にも書いた通り、2022年4月よりセキュリティ上の観点からRaspberry Pi OSからデフォルト設定であるuser=pipassword=raspberryが削除された。デスクトップ機能のないRaspberry Pi OS Liteを利用するには、公式のイメージ書き込みソフト「Raspberry Pi Imager」を使うことで、ユーザーとパスワードを設定したイメージファイルをmicroSDに書き込むことができる。このmicroSDを使ってZeroを起動すれば、初回のSSH接続がモニタレスでも可能となる。

Raspberry Pi OSの準備

準備作業は、Windows PCを使用しておこなった。Zeroへのリモート接続には、VSCodeのWSL2環境を利用。

  1. Raspberry Pi Imagerをダウンロード。
  2. Raspberry Pi Imagerを起動し、OSで「Raspberry Pi OS (other)」から「Raspberry Pi OS Lite (32-bit)」を選択し、ストレージでmicroSDカードを選択。
  3. Raspberry Pi Imagerの「設定(歯車のアイコン)」をクリックし、下記のように設定して保存。
  • ホスト名:radikozero(.local)
  • ユーザー名:{PiUser}
  • パスワード:{PiPassword}
  • タイムゾーン:Asia/Tokyo
  • 「終わったときにメディアを取り出す」のチェックを外す
  • ここでSSHやWi-Fiの設定も可能だが、この辺はImagerに頼らず別口で設定
  1. Raspberry Pi Imagerの「書き込む」ボタンを押すと書き込み開始。

  2. Raspberry Pi Imagerでの書き込みが終わったら、microSDカードのルートディレクトリに「SSH」という空のファイルを作成。

  3. microSDカードのルートディレクトリに「wpa_supplicant.conf」というファイルを作成し、Zeroが接続するWi-Fiの設定を下記のように書き込み。

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=JP
    network={
            ssid="{SSID}" # {SSID}と{パスフレーズ}を自分の環境に置き換え
            psk="{パスフレーズ}"
            # もしくは、wpa_passphraseコマンドで256bit変換したパスフレーズ
            psk={256bit変換したパスフレーズ}
    }
    
  4. 以上の設定を終えたmicroSDカードをZeroに挿し込んで準備完了。

Zeroの初回起動

  1. ZeroにUSB給電すると起動開始。初めての起動だと3~5分くらいかかる。

  2. ZeroがWi-Fiルータに接続できているか、ping radikozero.localコマンドで確認。

  3. ssh {PiUser}@radikozero.localコマンド(ホスト名はIPアドレスに置き換えてもOK)で、PCからZeroへSSH接続。

  4. 接続確認にyes、続けてRaspberry Pi Imagerで設定した{PiPassword}を使ってZeroにログイン。

  5. ログインに成功したら、dateコマンドでJST(日本標準時)に設定されていることと日時が合っていることを確認。(以下、個人的な初期設定メモなので、不要ならログアウトして公開鍵認証の切り替えへ)

  6. apt list --installedコマンドでインストールされているアプリを確認。

  7. vim-tinyを削除(sudo apt --purge remove vim-common vim-tiny)して、vimをインストール(sudo apt install vim)。

  8. sudo apt install gitでgitをインストール。

  9. aptコマンドの参照先を日本国内のミラーに変更するため、/etc/apt/sources.listファイルの参照先URLを変更。

  10. sudo apt -o Acquire::http::AllowRedirect=false updatesudo apt -o Acquire::http::AllowRedirect=false upgradeコマンドで環境を更新。

  11. ZeroのホストネームとIPアドレスを指定するため、/etc/dhcpcd.confファイルの末尾に下記の内容を追加。

    	hostname radikozero  # ホストネームの指定
    interface wlan0
    static ip_address=192.168.0.200/24 # 固定するIPアドレス
    static routers=192.168.0.1 # デフォルトゲートウェイのIPアドレス
    static domain_name_servers=192.168.0.1 # DNSサーバーのIPアドレス
    
  12. Bluetoothを無効にするため、/boot/config.txtファイルの末尾にdtoverlay=disable-btを追記。

  13. NTPサーバーにNICTを指定するため、/etc/systemd/timesyncd.confファイルの末尾にNTP=ntp.nict.jpを追記し、下記コマンドを実行。

    sudo systemctl daemon-reload # デーモンリロード
    sudo systemctl restart systemd-timesyncd.service # サービス再起動
    sudo systemctl status systemd-timesyncd.service # ステータス確認
    
  14. sudo shutdown -rコマンドでZeroの再起動をセットして、exitコマンドでいったんZeroからログアウト。

ZeroのSSH接続を公開鍵認証に切り替え

今回は作成済みの公開鍵を使用したが、未作成ならこの辺を参考に作成。

  1. リモート接続するPCから、scp ~/.ssh/{公開鍵} {PiUser}@radikozero.local:~/コマンドで公開鍵をZeroに送信。

  2. Raspberry Pi Imagerで設定した{PiPassword}を使って認証すると、公開鍵の送信が完了。

  3. ZeroにSSHパスワード認証でログインして、以下の作業をZero側で実施。

  4. mkdir ~/.sshコマンドで、ホームディレクトリに.sshディレクトリを作成。

  5. mv ~/{公開鍵} ~/.ssh/authorized_keysコマンドで、PCから送信した公開鍵をauthorized_keysとファイル名を変更して.sshディレクトリに移動。

  6. chmod 600 ~/.ssh/authorized_keysコマンドで、ファイルのパーミッションを変更

  7. chmod 700 ~/.sshコマンドで、ディレクトリのパーミッションを変更

  8. sudo vim /etc/ssh/sshd_configコマンドを実行し、sshd_configファイルに下記内容を追記して保存。

    Port {ポート番号} # 22から別の空き番号に変更(変更後の番号は次回ログインから使用)
    AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 # 公開鍵認証を有効にする
    PasswordAuthentication no # パスワード認証を無効にする
    
  9. sudo /etc/init.d/ssh restartコマンドで、sshサービスを再起動したら、いったんZeroからログアウト。

  10. ssh -p {ポート番号} {PiUser}@radikozero.localコマンドでZeroに接続し、公開鍵のパスフレーズでログインできればOK。

Radikoの録音環境セットアップ

ラジオを録音するためのシェルスクリプトがGithubにて公開されている。

  • radish(配信中のラジオをリアルタイム録音)
  • rec_radiko_ts(radikoのタイムフリー番組を保存)

今回は、radikoのタイムフリーを録音したいので、rec_radiko_tsを利用した。

rec_radiko_tsの準備

  1. Zeroにログイン。

  2. rec_radiko_tsに必要なパッケージのうちcurllibxml2はインストール済みだったので、残るffmpegsudo apt install ffmpegコマンドでインストール。

  3. git clone https://github.com/uru2/rec_radiko_ts.gitコマンドで、Zeroのホームディレクトリにrec_radiko_tsをクローン。

  4. クローンしたrec_radiko_tsフォルダからrec_radiko_ts.shファイルをホームディレクトリに移動。

  5. chmod 755 ~/rec_radiko_ts.shコマンドで、ファイルのパーミッションを変更。

  6. 下記コマンドで、録音テストをおこない、test.m4aというファイルが出力されたらOK。(放送局ID:http://radiko.jp/v3/station/region/full.xml

    ~/rec_radiko_ts.sh -s {放送局ID} -f {開始日時} -d 1 -o ~/test.m4a
    

定期的に番組録音をおこなうための設定

radiko録音スクリプト(rec_radiko_ts.sh)を定期的に実行するための設定をcrontabに記述し、cronサービスにて実行する。

  • 録音したファイルを一時保存するフォルダ:tmp_radiko
  1. Zeroにログイン。
  2. ホームディレクトリに録音ファイルを一時保存するためのフォルダを作成するため、mkdir ~/tmp_radikoコマンドを実行。
  3. crontab -eコマンドを実行し、使用するエディタを選択し、crontabを編集。(crontab -rで簡単に設定が削除されてしまうので、心配ならコピーとるとか、その辺は各自工夫して)
  4. crontabの末尾にrec_radiko_tsの定期実行内容を記述し、保存して終了。(下記は自分の設定例)
# 自分用メモ
# 深夜番組は前日基準で番組表が組まれているので、ファイル名に前日の日付を付ける
# 24時に終了する番組はタイムフリーだと録音開始が翌日になるので、録音開始日を前日で指定

# 毎週月 24~25時 空気階段の踊り場 -> 25時05分にダウンロード
05 01 * * 2 ~/rec_radiko_ts.sh -s TBS -f `date +\%Y\%m\%d`0000 -d 60 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-空気階段の踊り場.m4a"

# 毎週火 27~28時30分 オールナイトニッポン0(ぺこぱ) -> 28時35分にダウンロード
35 04 * * 3 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(ぺこぱ).m4a"

# 毎週水 24~25時 ほら!ここがオズワルドさんち! -> 25時05分にダウンロード
05 01 * * 4 ~/rec_radiko_ts.sh -s TBS -f `date +\%Y\%m\%d`0000 -d 60 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-ほら!ここがオズワルドさんち!.m4a"

# 毎週木 24時~24時58分 オールナイトニッポンX(週替わり) -> 25時10分にダウンロード
10 01 * * 5 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0000 -d 58 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポンX(週替わり).m4a"

# 毎週木 27~28時30分 オールナイトニッポン0(マヂカルラブリー) -> 28時35分にダウンロード
35 04 * * 5 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(マヂカルラブリー).m4a"

# 毎週金 27~28時30分 オールナイトニッポン0(三四郎) -> 28時35分にダウンロード
35 04 * * 6 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d`0300 -d 90 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポン0(三四郎).m4a"

# 毎週金 オールナイトニッポンGOLD -> 24時05分にダウンロード
05 00 * * 6 ~/rec_radiko_ts.sh -s LFR -f `date +\%Y\%m\%d --date '1 day ago'`2200 -d 120 -o ~/tmp_radiko/"`date +\%Y-\%m-\%d --date '1 day ago'`-オールナイトニッポンゴールド.m4a"

録音したファイルをNASに転送

Zeroに一時保存した録音ファイルをNASに転送する。利用するNASは、Synology DiskStation DS220j(以下、DS220jと記載)で、SMBサービスを有効にしてフォルダ共有をおこなっている。

DS220j側の事前準備

  1. ZeroからDS220jにアクセスをおこなうユーザーとパスワードをDS220jのコントロールパネルで設定。
  2. 録音ファイルを転送する共有フォルダを作成。
  • DS220jにアクセスするユーザー名:{NasUser}
  • DS220jにアクセスするためのパスワード:{NasPassword}
  • DS220jの共有フォルダ:RadikoBox

CIFSを使ってZeroからDS220jをマウント

  • DS220jのホスト名:ds220j
  • Zero側のマウント先となるディレクトリ:zero_nas
  1. Zeroにログイン。
  2. sudo apt install cifs-utilsコマンドでCIFSをインストール。(今回作成したRaspberry Pi Imageにはインストール済みだった)
  3. /etc/hostsファイルに、DS220jのIPアドレスとホスト名を対応させるための設定を{IPアドレス} ds220jの形式で書き込む。
  4. mkdir ~/zero_nasコマンドで、マウント先となるディレクトリを作成。
  5. sudo mount -t cifs //ds220j/RadikoBox ~/zero_nas -o username={NasUser}コマンド入力後、パスワードを聞かれるので{NasPassword}を入力。
  6. dffindmntコマンドで、DS220jの共有フォルダがマウントされていることを確認できればOK。
  7. いったんsudo umount ~/zero_nasでDS220jをアンマウント。

認証情報ファイルによるマウント

認証情報ファイル(例:.nascredential)を使って、マウント時にパスワード入力を省略する。

  1. sudo vim ~/.nascredentialコマンドで認証情報ファイルを作成し、下記の内容を書き込み、保存する。

    username={NasUser}
    password={NasPassword}
    
  2. sudo chmod 400 ~/.nascredentialコマンドで、パーミッションを所有者のみ読み取り可能に変更。

  3. sudo mount -t cifs //ds220j/RadikoBox ~/zero_nas -o credentials=~/.nascredentialでコマンドを実行。パスワードの入力を求められたら失敗。

  4. dffindmntコマンドで、DS220jの共有フォルダがマウントされていることを確認できればOK。

  5. いったんsudo umount ~/zero_nasでDS220jをアンマウント。

アクセス時に自動マウント、一定時間アクセスなしで自動アンマウント

マウント先にアクセスがあったときに自動でマウントし、一定時間アクセスがない場合に自動でアンマウントしてくれるautofsを利用する。

  1. sudo apt install autofsコマンドでZeroにautofsをインストール。

  2. sudo vim /etc/auto.master.d/direct.autofsコマンドで、direct.autofsファイルを作成。

  3. direct.autofsファイルに、下記の様式でマウント方法を指定するためのファイル名(例:auto.direct)と自動アンマウントする秒数を書き込む。--timeoutオプションをつけないと、デフォルトの時間(300秒くらい)でアンマウントする。

    /-  /etc/auto.direct --timeout=60
    
  4. sudo vim /etc/auto.directコマンドで、auto.directファイルを作成し、下記の内容を書き込む。(mountに渡すオプションは各自の好みに合わせて変更)

    # {マウント先フォルダ} {mountに渡すオプション} {NASの共有フォルダ}
    # ここでのディレクトリ指定には、ホームディレクトリとして"~"が使えないので、フルパスで指定
    /home/{PiUser}/zero_nas -fstype=cifs,rw,iocharset=utf8,credentials=/home/{PiUser}/.nascredential,vers=3.1.1,file_mode=0644,dir_mode=0755,uid=0,gid=0 ://ds220j/RadikoBox
    
  5. 下記コマンドで、autofsを起動。

    sudo systemctl enable autofs
    sudo systemctl start autofs
    # 起動後、/etc/auto.directの内容を反映するためにリスタート
    sudo systemctl restart autofs
    
  6. アンマウントの状態でsudo cp ~/{Zeroの適当なファイル} ~/zero_nasコマンドを実行し、自動マウントしてファイルがコピーされればマウント成功。

  7. マウント後、2分くらい放置してアンマウントされていればOK。(60秒で設定しても、きっちり60秒ではないみたい)

録音したファイルを定期的にDS220jに転送

rsyncコマンドを使って、録音したファイルをDS220jに転送し、転送が成功したら転送元(Zero)からファイルを削除する。この流れを定期的におこなう設定をcrontabに追加で登録する。

  1. crontab -eコマンドを実行し、crontabを編集。
  2. crontabの末尾に下記内容を追記し、保存して終了。(下記は自分の設定例)
# 毎朝5時5分にNASにファイルを転送、転送が成功したら転送元のファイルを削除
05 05 * * * sudo rsync -r --remove-source-files ~/tmp_radiko/ ~/zero_nas/

ラズパイって、今品薄なんだ…お手軽じゃなくなった

コメント

コメントなどありましたら、GitHubのディスカッションへお願いします。(書き込みには、GitHubのアカウントが必要です)
執筆者
"ぽぽろんち" @pporoch
pporoch120
Mono Worksの中の人。好きなことをつらつらと書き留めてます。
ギターを始めてから 練習動画をYouTubeにアップしてます。ご笑納ください。
"DQX@ぬここ(UD487-754)、コツメ(NO078-818)"
採用案内