Volumio を2台稼働させることに

Volumio2 を私がいる2階の部屋でのバックグラウンド・ミュージックのサーバーとして稼働させています。特に問題もなく安定しているので、1階の居間でも同様に稼働させようと思い立ちました。

もともと1年以上の間、追加で置こうとしている1階には、安定稼働の様子見のため古いバージョンでしたが、電源を入れたままで動作させていました。そのため里帰り的な事なので何の問題もないと思っていて、時間を無駄にする痛い目にも合いました。

複数台の Volumio

2台を識別するために、システム名を標準の Volumio の名称をそのまま残しておき、後に ‘-1F’ と ‘-2F’ を付加した名称にしました。1台の稼働のときは想像できなかったことですが、ブラウザからコントロールする時に、1つの接続からどちらをコントロールするのか選択して操作できることです。

上に表示され細い枠で囲まれているのが操作対象

Volumio の一般的操作

一般的な操作や設定だけなら、ブラウザで接続した状態からIPアドレスの設定や無線LANの設定、ボリュームアップダウンの刻み幅、DACの設定、電源オフ、再起動等ほとんどの操作ができます。

ブラウザでの操作だけなら、マウスやキーボード、モニタとなるテレビも不要です。とは言っても、自動で振られたIPアドレスが何になっているのかとか、確認したい場合もありますし、既に設定してあるデータを新しく立ち上げた側にコピーしたいこともあるでしょう。

リモートからコマンド操作するに

リモートでログインしてコマンドで操作する ssh ですが、有効にすると利用できるようになります。方法は、ブラウザで操作する接続先のアドレスの後に /DEV/ を指定すると設定する項目が表示されます。ここで ssh を有効にするための項目の [ENABLE] ボタンをクリックします。

コマンドで操作したいこともあると思います。最悪はローカルで直接ログインする方法ですが、機材を持込むか逆に機材のある場所に本体を持ってこないといけないので、ぜひとも ssh を有効にしておくことを勧めます。

パスワードに関する注意点

本体にモニタ、マウスとキーボードを取付けて、ユーザー名: volumio と パスワード: volumio が初期値ですが、それでログインすれば操作できます。重要な注意点としては、パスワードを変更する時に記号を含めると、キーボードの配置が想定と異なっていてログインできなくなる事があることです。これにはマジでハマります。

大きな画面と小さな画面の配置

Volumio の操作画面ですが、スマートフォンで操作する縦型で小さな画面と、パソコンで一般的な横に広い大きな画面で、配置される項目に大きな違いがあるようです。

スマートフォンの小さな画面

パソコンでもブラウザの横を縮めて小さくするとスマートフォンの表示と同じような配置になります。帯状のボタンが横一列に並び、左が一覧表示、真ん中がプレイバック、右がキューとなっているようです。そのボタンは、スマートフォンのように小さな画面では最上部に、大きな画面では最下段に表示されています。

大きな表示の画面

一般的な操作の選択

プレイバック (中)

3つの選択ボタンの真ん中のプレイバックが、イニシャルのデフォルト画面のようです。この状態の時にアーティストや曲名を表示していて、ウェブラジオならその下に放送局名が表示されているようです。また、mp3のような楽曲のデジタルデータでも登録されていれば同様に情報が表示されます。

小さな画面の場合

プレイバックが選択されている時に、複数台の Volumio が稼働している場合に、どの Volumio を操作するのかの選択ができるようです。

スクロールすると下にMultiroom Devices の項目内にリストされています。

小さな画面は縦に、大きな画面は横に並んでいるようです。

大きな画面の場合

一覧表示 (左)

左の一覧表示には、先端をホームとして色々な選択できる項目を表示し、そこから選ぶことができるようです。項目としては、|お好み|プレイリスト|音楽ライブラリ|アーティスト|アルバム|ジャンル|Media Servers|last 100|ウェブラジオ| とありますが、使い方がよく分かりません。

|ウェブラジオ|

ウェブラジオでは、Volumio の推奨の局やジャンル別、国別等とラジオ局を選べる項目がリストになっています。希望する局をクリックすると、右のキューの項目に転送されて受信が始まり、演奏が流れ出します。クリックする度にキューに蓄積して受信を開始します。ただし、局リストにあっても受信できない局もあるようで、その場合はエラーになります。

|プレイリスト|

プレイリストでは、自分で付けたグループ名で登録した項目が、一覧表示されています。いつも利用したい放送局をジャンル別や、利用頻度の多い局を集めたグループ等でまとめて登録しておくと、毎回ウェブラジオから選び出す必要が無くなります。

なお、プレイリストへの登録方法は、選択された結果の右のキューにリストされた項目をグループ名を付与して一括で登録することができます。

|音楽ライブラリ|

音楽ライブラリは、Volumio に登録した外部の共有ネットサーバー等のエリアを参照して楽曲を選択できるようにする項目のようです。

|last 100|

last 100 は、演奏した楽曲や選択した局がリストされているような気がしますが、どのタイミンクで取り込まれているのかよく分かりません。

|アーティスト|アルバム|ジャンル|お好み|Media Servers|

その他の項目は、今ひとつ利用方法が分かりませんが、音楽ライブラリから楽曲を選択すると、その後にその楽曲内にあった情報として、アーティスト、アルバム、ジャンルが対応するリストになっているようです。どのタイミングで取り込まれているのか不明です。

キュー (右)

キューへの追加

右のキューには、左の一覧表示から選曲した楽曲や、選択したウェブラジオ局が、その都度リストの最後に追加される仕組みのようです。複数回の繰り返しを行うと繰り返した分だけリストに追加されるようです。

キューにリストされたラジオ局の切替

ここにリストされた楽曲の場合は、該当の演奏が終わると次の楽曲に移りますが、ウェブラジオの選局では、別の局に変更されるまで受信が続きます。ここにリストされているウェブラジオ局は、クリックして別の局への受信切替が可能です。

キューからの消去と編集

ここにリストされている楽曲やウェブラジオ局は、各項目の右にある(x)で個々に消去することも、ゴミバケツマークのクリックでまとめて全て消去することも可能です。操作性が難しく上手く整理できないかもしれませんが、上下の入替えのような単純な編集が可能です。

プレイリストの新規作成、更新

キュー上にリストされた楽曲やウェブラジオ局は、フロッピーマークのクリックで、グループ名を付与して一括でプレイリストを新規作成することができます。ただし、注意点は新規名を付与しないで既存の名前を選択すると、以前に何が登録されていたのかに関係なく、現在のキューにリストされていたものと置き換えられます。言い換えれば強制的な更新となります。

プレイリストのバックアップと再利用

作成されたプレイリストのデータについては、労力が費やされているので障害での消去も考えてバックアップするなり、別の Volumio にコピーして再利用するなりしたいと思います。

その方法としては、 ssh 等によるリモートログインでコマンド操作を行い、/data/playlist/ の下に置かれたデータを扱います。コマンドとしては、rcp 等でコピーすれば良いと思います。

次に、普段使いのLinux PC で、自分のホームに取り込んだ1つの例を示します。

:~$ mkdir ~/volumio-playlist

:~$ rcp volumio@192.168.11.18:/data/playlist/* ~/volumio-playlist/
volumio@192.168.11.18's password: 
-普段のバック曲                                      100% 3242   420.1KB/s   00:00    
Guitar & piano                                              100% 1257   594.4KB/s   00:00    
Jazz                                                        100% 2166   695.2KB/s   00:00    
Relax & Easy listening                                      100% 1124   555.5KB/s   00:00    
Retro 50s-80s & Beatles                                     100% 3978   929.0KB/s   00:00    
Solo                                                        100%  713   387.4KB/s   00:00    
シンフォニー&クラッシック                       100% 3196   585.1KB/s   00:00    
ダンス系・スイング&タンゴ                       100% 3490   843.0KB/s   00:00    
ボサノバ & シャンソン                              100% 1887   376.8KB/s   00:00    
日本歌謡・アイドル他                              100% 2451   431.7KB/s   00:00    
映画                                                      100% 2234   766.9KB/s   00:00    

:~$ ls ~/volumio-playlist/
 -普段のバック曲          'Retro 50s-80s & Beatles'    'ボサノバ & シャンソン'
'Guitar & piano'           Solo                         映画
 Jazz                     'シンフォニー&クラッシック'   日本歌謡・アイドル他
'Relax & Easy listening'  'ダンス系・スイング&タンゴ'

プレイリストのデータは、キューから作成されたグループ毎に 1ファイルとして作られています。それと、キューにリストされた項目が1行ずつではなくて、グループ全体が 1行になっているようです。

1ファイル1行ですが、一応テキストエディタで編集は可能だろうと思います。ただ、実用的とは思えません。例として Jazz の内容を次に示します。

:~$ cat ~/volumio-playlist/Jazz
[{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1723864","title":"Smooth Jazz Florida","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1625448","title":"SmoothJazz.com Global","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1292701","title":"Jazz Lounge","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=959067","title":"The UK 1940s Radio Station  1920s 1930s 1940s","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1469526","title":"The Great American Songbook","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1151057","title":"Smooth Jazz - Tampa Bay","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1423641","title":"Deep Pockets Jazz","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1441882","title":"Swing Street Radio","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1638696","title":"1000 HITS Jazz","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=559409","title":"Jazz International","albumart":"/albumart"},{"service":"webradio","uri":"http://yp.shoutcast.com/sbin/tunein-station.m3u?id=1733465","title":"Smooth Sounds Radio","albumart":"/albumart"},{"service":"webradio","uri":"http://89.16.185.174:8000/stream","title":"Linn Jazz","albumart":"https://radio-directory.firebaseapp.com/volumio/src/images/radio-thumbnails/Linn Jazz.jpg"},{"service":"webradio","uri":"http://icy1.abacast.com:80/kplu-jazz24aac-64","title":"Jazz24","albumart":"https://radio-directory.firebaseapp.com/volumio/src/images/radio-thumbnails/Jazz24.jpg"},{"service":"webradio","uri":"http://8.38.78.173:8210","title":"Audiophile Jazz","albumart":"https://radio-directory.firebaseapp.com/volumio/src/images/radio-thumbnails/Audiophile Jazz.jpg"}]

最後に反省、アホなことしてました

Volumio の複製なんて簡単に設置できると思っていたら、意外に時間を取られて無駄な時間を使っていました。原因は、昨年の暮れになって家の中をリフォームしていたのと、光回線のキャリアの変更とか色々重なり、以前設置していた場所が家のネットワークやインターネットから切り離されていたのでした。

でもなかなかわからなかったのは、運悪く切り離された場所にもルータが置かれていて、イーサネットの接続ランプはリンクアップしているように時々点滅していたことです。思い込みは直さないと失敗の元です。

情けない!! アホなことをしてしまいました。

Volumio の情報メモ

ネットチューナー なのか ウェブラジオ なのか一般的な呼び名が分かりませんが、最近では私の居る部屋で常に バックグラウンド ミュージック を流しっぱなしのサーバーが置かれています。これについてのメモを残しておきます。

パソコンなどの広い画面からの操作

かなり完成度の高いシステムで、 Volumio 2 と言うシステムが公開されていて、それを単純にダウンロードして micro SD にコピーして利用しています。他の書き込みでメモしている部分もあるようなので、重複しているものもあるかと思われますが、適当にメモとして記述しておきます。

スマホやパソコンなどを利用した狭い画面

夜に重宝するのが、極端な強弱を伴わない静かなサウンドトラック等を常時流してくれる局で、ゆっくり聞きながら眠りにつけるのでとても重宝しています。


volumio@volumio1:~$ gpio -v
gpio version: 2.44
Copyright (c) 2012-2017 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Unknown 
  * Device tree is enabled.
  *--> Raspberry Pi 3 Model B Rev 1.2
  * This Raspberry Pi supports user-level GPIO access.


volumio@volumio1:~$ gpio readall
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | ALT0 | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 | ALT0 | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 1 | 37 || 38 | 0 | ALT0 | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | ALT0 | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+

この Volumio と呼ばれるシステムは、バージョンが 2 となって公開されているシステムで、raspbian OS が基になっているようですが、基本的にセキュリティアップデートを対象としていないようで、過去に古いレビジョンの Volumio で利用していてシステム内から最新版に更新したことがありました。結果は今一つな感じで仕切り直して新しくクリーンインストールした経験を持ちます。

単純に最新版をクリーンインストールすると、過去に選択した局の情報が引き継げないので、吟味して選択しながらまとめた情報はもったいないのでバックアップしておき、インストール後に戻すのが良いと思われます。

$ ssh volumio@volumio1.local
volumio@volumio1.local's password: 
                       ___                                      
                      /\_ \                        __           
         __  __    ___\//\ \    __  __    ___ ___ /\_\    ___   
        /\ \/\ \  / __`\\ \ \  /\ \/\ \ /' __` __`\/\ \  / __`\ 
        \ \ \_/ |/\ \L\ \\_\ \_\ \ \_\ \/\ \/\ \/\ \ \ \/\ \L\ \
         \ \___/ \ \____//\____\\ \____/\ \_\ \_\ \_\ \_\ \____/
          \/__/   \/___/ \/____/ \/___/  \/_/\/_/\/_/\/_/\/___/ 
        
             Free Audiophile Linux Music Player - Version 2.0

          C 2015 Michelangelo Guarise - Volumio Team - Volumio.org
                               

Volumio Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
volumio@volumio1:~$ 

ssh でリモート接続して参照した一部の情報を次に示します。

volumio@volumio1:~$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 282.6M  0 loop /static
mmcblk0     179:0    0  14.4G  0 disk 
|-mmcblk0p2 179:2    0   2.3G  0 part /imgpart
|-mmcblk0p3 179:3    0  12.1G  0 part 
`-mmcblk0p1 179:1    0    61M  0 part /boot

volumio@volumio1:~$ df
Filesystem                  Size  Used Avail Use% Mounted on
/dev/mmcblk0p2              2.4G  673M  1.6G  31% /imgpart
/dev/loop0                  297M  297M     0 100% /static
overlay                     274M  220M   34M  87% /
devtmpfs                    497M     0  497M   0% /dev
tmpfs                       509M     0  509M   0% /dev/shm
tmpfs                       509M   35M  475M   7% /run
tmpfs                       5.3M  4.1k  5.3M   1% /run/lock
tmpfs                       509M     0  509M   0% /sys/fs/cgroup
tmpfs                       509M   25k  509M   1% /tmp
tmpfs                       509M     0  509M   0% /var/spool/cups
tmpfs                        21M  9.7M   12M  47% /var/log
tmpfs                       509M     0  509M   0% /var/spool/cups/tmp
/dev/mmcblk0p1               63M   39M   25M  61% /boot
//RPI1-DISK/共有/volumio  317G  175G  143G  56% /mnt/NAS/共有
tmpfs                       102M     0  102M   0% /run/user/1000


volumio@volumio1:~$ sudo cat /etc/fstab
[sudo] password for volumio: 
proc            /proc           proc    defaults        0       0
/dev/mmcblk0p1  /boot           vfat    defaults,utf8,user,rw,umask=111,dmask=000        0       1
tmpfs   /var/log                tmpfs   size=20M,nodev,uid=1000,mode=0777,gid=4, 0 0
tmpfs   /var/spool/cups         tmpfs   defaults,noatime,mode=0755 0 0
tmpfs   /var/spool/cups/tmp     tmpfs   defaults,noatime,mode=0755 0 0
tmpfs   /tmp                    tmpfs   defaults,noatime,mode=0755 0 0
tmpfs   /dev/shm                tmpfs   defaults,nosuid,noexec,nodev        0 0


volumio@volumio1:~$ mount
/dev/mmcblk0p2 on /imgpart type ext4 (rw,relatime,stripe=1024,data=ordered)
/dev/loop0 on /static type squashfs (ro,relatime)
overlay on / type overlay (rw,relatime,lowerdir=/mnt/static,upperdir=/mnt/ext/dyn,workdir=/mnt/ext/work)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=485032k,nr_inodes=121258,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
tmpfs on /tmp type tmpfs (rw,noatime,mode=755)
tmpfs on /var/spool/cups type tmpfs (rw,noatime,mode=755)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
tmpfs on /var/log type tmpfs (rw,nodev,relatime,size=20480k,mode=777,uid=1000,gid=4)
configfs on /sys/kernel/config type configfs (rw,relatime)
tmpfs on /var/spool/cups/tmp type tmpfs (rw,noatime,mode=755)
/dev/mmcblk0p1 on /boot type vfat (rw,nosuid,nodev,noexec,relatime,fmask=0111,dmask=0000,allow_utime=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw,relatime)
//RPI1-DISK/共有/volumio on /mnt/NAS/共有 type cifs (ro,relatime,vers=default,cache=strict,username=sunao,domain=,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.11.23,file_mode=0666,dir_mode=0777,soft,nounix,serverino,mapposix,rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=99412k,mode=700,uid=1000,gid=1000)

各種データの格納先ディレクト

どこに何が格納されているのかは、はっきり言ってよく分かりません。また、どのようなフォーマットを必要としているのかも不明です。

ただ、選択したラジオ局のプレイリスト、演奏中や演奏待ちのキューは、 /data 下のディレクトリに集められているらしいので、コマンド tree をインストールしてディレクトリ部分だけをリストにしたものを次に示します。

volumio@volumio1:~$ tree -d /data
/data
|-- INTERNAL
|-- albumart
|   |-- folder
|   |-- metadata
|   `-- web
|       |-- 1.FM%20-%20Bossa%20Nova%20Hits%20Radio
|       |-- 1.FM%20-%20Movie%20Soundtracks%20Hits%20Radio
|       |-- 1000%20HITS%2070s
|       |-- 1000%20HITS%20Oldies
|       |-- 181.FM%20Christmas%20Swing
|       |-- FeLove%20Cl%C3%A1sica
|       |-- J-Pop%20Powerplay%20-%20Kawaii
|       |-- J-Pop%20Sakura
|       |-- J1%20Gold%20-%20Japan%27s%20Oldies
|       |-- JamendoLounge
|       |-- Japan%20Hits%20-%20Asia%20DREAM%20Radio
|       |-- Johann%20Sebastian%20Bach
|       |   `-- Goldberg%20Variations%20(feat.%20piano%3A%20Chen%20Pi-Hsien)
|       |-- Radio%20Caprice%20-%20Bossa%20Nova
|       |-- Radio%20Caprice%20-%20Swing
|       |-- Radio%20Caprice%20-%20Symphony
|       |-- Retro%20Oldies%20Radio
|       `-- Swinging%20Radio%20England
|-- backgrounds
|-- configuration
|   |-- audio_interface
|   |   `-- alsa_controller
|   |-- miscellanea
|   |   |-- alarm-clock
|   |   |-- albumart
|   |   |-- appearance
|   |   |-- my_music
|   |   `-- wizard
|   |-- music_service
|   |   |-- lms
|   |   |-- mpd
|   |   |-- squeezelite
|   |   |-- streaming_services
|   |   |   |-- services_configs
|   |   |   `-- services_tokens
|   |   |-- upnp_browser
|   |   `-- webradio
|   `-- system_controller
|       |-- i2s_dacs
|       |-- my_volumio
|       |-- network
|       |-- networkfs
|       |-- system
|       |-- volumio_command_line_client
|       `-- volumiodiscovery
|-- favourites
|-- playerstate
|-- playlist
`-- plugins
    |-- music_service
    |   |-- lms
    |   |   |-- i18n
    |   |   `-- node_modules
    |   |       |-- balanced-match
    |   |       |-- brace-expansion
    |   |       |   `-- node_modules
    |   |       |       `-- balanced-match
    |   |       |-- concat-map
    |   |       |   |-- example
    |   |       |   `-- test
    |   |       |-- fs-extra
    |   |       |   `-- lib
    |   |       |       |-- copy
    |   |       |       |-- copy-sync
    |   |       |       |-- empty
    |   |       |       |-- ensure
    |   |       |       |-- json
    |   |       |       |-- mkdirs
    |   |       |       |-- move
    |   |       |       |-- output
    |   |       |       |-- remove
    |   |       |       |-- util
    |   |       |       `-- walk
    |   |       |-- fs.realpath
    |   |       |-- glob
    |   |       |-- graceful-fs
    |   |       |-- inflight
    |   |       |-- inherits
    |   |       |-- ip
    |   |       |   |-- lib
    |   |       |   `-- test
    |   |       |-- jsonfile
    |   |       |-- kew
    |   |       |   `-- test
    |   |       |-- klaw
    |   |       |   `-- src
    |   |       |-- minimatch
    |   |       |-- multimap
    |   |       |   `-- test
    |   |       |-- once
    |   |       |-- path-is-absolute
    |   |       |-- rimraf
    |   |       |-- v-conf
    |   |       |   `-- node_modules
    |   |       |       |-- fs-extra
    |   |       |       |   `-- lib
    |   |       |       |       |-- copy
    |   |       |       |       |-- copy-sync
    |   |       |       |       |-- empty
    |   |       |       |       |-- ensure
    |   |       |       |       |-- json
    |   |       |       |       |-- mkdirs
    |   |       |       |       |-- move
    |   |       |       |       |-- output
    |   |       |       |       |-- remove
    |   |       |       |       |-- streams
    |   |       |       |       |-- util
    |   |       |       |       `-- walk
    |   |       |       `-- multimap
    |   |       |           `-- test
    |   |       |-- wireless-tools
    |   |       |   `-- test
    |   |       `-- wrappy
    |   `-- squeezelite
    |       |-- i18n
    |       |-- node_modules
    |       |   |-- balanced-match
    |       |   |-- brace-expansion
    |       |   |   `-- node_modules
    |       |   |       `-- balanced-match
    |       |   |-- concat-map
    |       |   |   |-- example
    |       |   |   `-- test
    |       |   |-- fs-extra
    |       |   |   `-- lib
    |       |   |       |-- copy
    |       |   |       |-- copy-sync
    |       |   |       |-- empty
    |       |   |       |-- ensure
    |       |   |       |-- json
    |       |   |       |-- mkdirs
    |       |   |       |-- move
    |       |   |       |-- output
    |       |   |       |-- remove
    |       |   |       |-- util
    |       |   |       `-- walk
    |       |   |-- fs.realpath
    |       |   |-- glob
    |       |   |-- graceful-fs
    |       |   |-- inflight
    |       |   |-- inherits
    |       |   |-- ip
    |       |   |   |-- lib
    |       |   |   `-- test
    |       |   |-- jsonfile
    |       |   |-- kew
    |       |   |   `-- test
    |       |   |-- klaw
    |       |   |   `-- src
    |       |   |-- minimatch
    |       |   |-- multimap
    |       |   |   `-- test
    |       |   |-- once
    |       |   |-- path-is-absolute
    |       |   |-- rimraf
    |       |   |-- v-conf
    |       |   |   `-- node_modules
    |       |   |       |-- fs-extra
    |       |   |       |   `-- lib
    |       |   |       |       |-- copy
    |       |   |       |       |-- copy-sync
    |       |   |       |       |-- empty
    |       |   |       |       |-- ensure
    |       |   |       |       |-- json
    |       |   |       |       |-- mkdirs
    |       |   |       |       |-- move
    |       |   |       |       |-- output
    |       |   |       |       |-- remove
    |       |   |       |       |-- streams
    |       |   |       |       |-- util
    |       |   |       |       `-- walk
    |       |   |       `-- multimap
    |       |   |           `-- test
    |       |   |-- wireless-tools
    |       |   |   `-- test
    |       |   `-- wrappy
    |       `-- unit
    `-- system_controller
        `-- backup_restore
            |-- i18n
            `-- node_modules
                |-- balanced-match
                |-- brace-expansion
                |-- concat-map
                |   |-- example
                |   `-- test
                |-- fs-extra
                |   `-- lib
                |       |-- copy
                |       |-- copy-sync
                |       |-- empty
                |       |-- ensure
                |       |-- json
                |       |-- mkdirs
                |       |-- move
                |       |-- output
                |       |-- remove
                |       |-- util
                |       `-- walk
                |-- fs.realpath
                |-- glob
                |-- graceful-fs
                |-- imurmurhash
                |-- inflight
                |-- inherits
                |-- jsonfile
                |-- kew
                |   `-- test
                |-- klaw
                |   `-- src
                |-- minimatch
                |-- multimap
                |   `-- test
                |-- once
                |-- path-is-absolute
                |-- rimraf
                |-- slide
                |   `-- lib
                |-- v-conf
                |   |-- node_modules
                |   |   `-- fs-extra
                |   |       |-- docs
                |   |       `-- lib
                |   |           |-- copy
                |   |           |-- copy-sync
                |   |           |-- empty
                |   |           |-- ensure
                |   |           |-- json
                |   |           |-- mkdirs
                |   |           |-- move
                |   |           |-- move-sync
                |   |           |-- output
                |   |           |-- remove
                |   |           `-- util
                |   `-- test
                |-- wrappy
                `-- write-file-atomic

242 directories

作成したプレイリストの格納先

自分でカスタマイズしたり好みのリストを作れるプレイリストについて次に示します。

最初の画面の右側中の [プレイリスト] をクリックするとリストが出てきます。2番目の画面でリストの下に隠れている [日本歌謡・アイドル他] をクリックすると3番目の画面になります。

3番目の画面は、各放送局を選択する画面です。ここでクリックした局が選択され、キューにコピーされて放送の受信が始まります。クリックされる度にキューにコピーされるようです。

実際のデータ格納先は、 /data/playlist 以下のディレクトリに保存されるようです。ただ単純に ls コマンドで表示すると、 ls が持つ気配り(?)で日本語文字が、??? の並びで表示されてしまうようです。

volumio@volumio1:~$ ls /data/playlist/
Guitar & piano           ??????????????????&??????????????????
Jazz                     ???????????????????????????&?????????
Relax & Easy listening   ???????????? & ???????????????
Retro 50s-80s & Beatles  ??????????????????????????????
Solo                     ??????

回避策はコントロールキャラクタも表示させるオプションを指定するか、 cat でパイプして表示すれば漢字で表示できるようです。

volumio@volumio1:~$ ls --show-control-chars /data/playlist/
Guitar & piano  Relax & Easy listening   Solo  ダンス系・スイング&タンゴ    日本歌謡・アイドル他
Jazz            Retro 50s-80s & Beatles  シンフォニー&クラッシック     ボサノバ & シャンソン  映画


volumio@volumio1:~$ ls /data/playlist/ | cat Guitar & piano Jazz Relax & Easy listening Retro 50s-80s & Beatles Solo シンフォニー&クラッシック ダンス系・スイング&タンゴ ボサノバ & シャンソン 日本歌謡・アイドル他 映画
右上のボタンでキューに移動

放送を受信しているラジオ局は、画面右の選択ボタンで表示しているキューにリストされています。

普段聞いている放送局ならここのキューにリストされているので、そこをクリックして選択するだけで簡単に放送局の切り替えができます。

左のアイコン上に薄緑の三角が表示されているのが、受信中の放送局ですが、一部をキューから削除したり、リストの順番を上下に移動したりすると表示位置の追従ができないようです。

プレイリストの生成

プレイリストを作成するには、前節で説明しているキューにリストされている放送局全体に新しいグループ名を付与して生成します。

注意点は、すでに作成されている下に並ぶ名称をクリックすると、一瞬で置換されます。

ウェブラジオからプレイリストの Jazz を作成

Volumio から、標準で提供されているウェブラジオの放送局があります。ここでは、お薦めや国別、ジャンル別等の色々な切り口からリストになっていて、選んでもエラーになって受信できないものや好みの合わないものも多数あります。

実際に聞いてみて自分の好みで選択して、必要なものをキューに残して、後で分かりやすいグループ名(今回は Jazz)を付与してプレイリストを作成します。

まずは、左のボタンで一覧表示にして、家のマークのホームボタンをクリックし、中からウェブラジオをクリックします。

ウェブラジオ内の項目を辿って、好みに合う放送局を探しながらキューに移します。

受信できない放送局も多数残るので、キューに移された放送局を個々に選びながら吟味して不要な放送局は、右の(☓)マークで削除しながら整理します。

好みの Jazz 放送局が集められたので、プレイリストにグループ名 Jazz で登録します。不要なプレイリストは右の点をクリックして削除可能です。

ラズパイにUPS機能を組込む

目指すものは

ラズパイ1B+ネットワーク共有サーバーとして、バッテリーバックアップを行いながら常時起動しておくことを考えています。

利用する部材は

アマゾンで購入の手作りUPSは、2,499円で購入しました。最近出荷されているモデルのラズパイのボード本体を固定する穴位置と重なる同じ穴位置形状の制御ボードです。ラズパイとの接続は、IOの 40ピンコネクタにそのまま重なる HAT と呼ばれる一連の製品群で、板状のバッテリーが付属していて信じられないくらい安いと感じます。

しかし、一般的な国内メーカーが販売するような完成されたパッケージ品とは大きく異なり、付属資料は全く無くて適当なキーワード(例えば UPS HAT) を元にネットで検索すると、それらしい情報が見つかり色々と提供されているサンプル類は、自分の責任で確認してバグ取りや性格に合わせたカスタマイズ作業が必要です。

完成したサーバーのイメージは

今回のネットワーク共有サーバーシステムは、2TBの2.5インチHDDと組合せて、100均のケースに組んで動作させています。ケースからは、AC100VからDC5V-2.4Aに変換した Micro USB のケーブル、イーサネットの RJ-45 のケーブルの2本だけが出ています。

バッテリー監視用のサービスソフト

以前、普段使いのノートPCのLinux(Ubuntu)立上げ後に、ネットワーク共有サーバー上に自動的に、Windowsファイルの一部をバックアップするsystemdのサービスを追加したことがあり、同様に常時起動のラズパイ1B+バッテリー監視のサービスを起動しようと考えました。

今回の作業背景

何となくネットで見付け、半信半疑の思いつきで購入した安価な製品で、ラズパイに装着できる制御ボードバッテリーのセットです。付属の説明書類は一切無いもので、使うにはどのようにするのかも含めて、頭をフル回転して情報収集から始めました。

Raspi UPS HAT Board と呼ばれているようで、資料が公開されています。

この公開資料では色々と説明されていて、サンプルコードも多数提示されているのですが、何か詰が甘くて動作を検証しても期待したような結果が出ません。公開されているサンプルのままで期待した結果だったモジュールは、C言語で記述された File:Ups-hat-c.zip だけでした。これはモジュールとして解説の手順でコンパイルすると、ups-read が作成されます。

この ups-read の利用方法としては、引数を [付ける/付けない] により少し異なりますが、バッテリー電圧とバッテリー容量が取得できます。ただ信用できない値が渡されることが多いのですが、そこを考慮すれば簡単に bash とか一般的なシェルからバッテリーの情報を取得できるため、色々な処理を自分で記述するのが簡単にできます。

解説の中には、root権限で実行するためにパスワード無しの sudo を冠して実行するための /etc/sudoers の追加記述がありますが、最新の raspbian では単純にユーザー権限のままでも実行できるようでした。

バッテリーの充放電の検証

引数無しでは、バッテリー容量がパーセンテージで表した整数値のみで返されます。これはバッテリー制御ボードから直接受け取った情報を特定の関数で変換していると思われますが、ちょっとした落とし穴があって、パーセンテージから判断して 0 〜 100 と思い込みますが、0〜100 ではない場合があり、 割合を表す数値としてはありえない 120 とか 112 とかになっていることがあります。

さらに雑音のような、前後の読み取りからはかけ離れた突発的な数値、197 とか 213 とかありえない値が渡されることがあり、その辺りの対策も必要です。

なお、サンプルの中でのステートメントのロジックでは、100%ならのような表現を色々な箇所で使っていますが、実際に渡される情報と一致しないため期待した結果にならないようです。

引数には、vc が指定でき、両方指定すれば電圧と容量が、当てにならない小数点以下6桁で、3.498750V 9.480469% のように表示されます。10秒毎に読み取ってリストにして確認してみましたが、電圧の変化と容量の変化にはある程度の相関関係があるようです。

実際の制御ボードには、バッテリーの充電や放電の状況を直接見える LED が付けられているのですが、私が持つ個体では完全充電されていてもそれを表す表示になることがないようで、かなりいい加減です。その程度に思って利用した方が良いようです。

ちなみに、バッテリー容量が 0.000000% でも動作していますが、電圧値が、3.000000V を下回った頃に、一気に電力不足でシステムが異常停止しているようでした。バッテリー容量が 5.000000% 以下になったのを見て正常な停止処理に移行させた方が良さそうです。

作ろうとしている私のネットワーク共有サーバーとしての動作環境は、ラズパイ1B+ 2TB 2.5インチ HDD で構成されています。フル充電から 5.0% まで容量が減衰する動作継続時間は、優に1時間を越えています。ある程度バッテリーが劣化しても余裕がありそうです。

先程の公開資料ですが、その中で提供されているサンプルは、ほぼ python で記述されていて、I2Cインタフェースからバッテリーの電圧と容量を取得するルーチンが紹介されています。


正常な停止処理に移行させるには

その中に UPS のバッテリーを監視して shutdown を起動するサンプルが次の項目に紹介されています。

Driver and Sample code

  • File:Rpi-ups-hat.zip
  • File:UserManual.pdf

zip を解凍すると、rpi-ups-hat ディレクトリ下に example.py と raspiupshat.so があります。raspiupshat.so が、UPSのバッテリー電圧と容量を取得できるライブラリです。

example.py では、そのライブラリを利用して、無限ループで容量をチェックして、5% を切ると shutdown コマンドが起動される例として記述されています。

残念なことにサンプルでは、os.system(“sudo shutdown”) の行で、ライブラリ os が import されていないため、エラーメッセージを表示して正常終了には移行せず、アブノーマルエンドしてしまいます。

UserManual.pdf は、英語と中国語?で書かれた利用条件の説明です。その中で wiringPi のインストールが必須として書かれていますが、最新の raspbian では事前にセットアップされているようです。

これを流用させて頂き、UPS制御として組込みます。


バッテリー監視の常駐サービス

systemd のサービスとして起動する方法については、次のサイトを参考に制作しますが、一度私のノートPCで作成した経験があるので、自分の備忘録も見返しながらの作業になります。

参考にしたサイトは、作り方を事細かく説明してくれています。


ここからが作業の本題

Raspbian 起動時に、一度だけ起動して常時バッテリーを監視して、容量が 5% を下回った時に shutdown プロセスを起動させます。

systemd に登録するサービスの指示書が、ユニットファイルと呼ばれます。

  • パッケージ名: UPS-Watch-shut
  • ユニットファイル名: ups-watching.service

サービス(ユニットファイル)の登録は、 /etc/systemd/system/ups-watching.service で、この中には登録するサービスの情報を決められた書式で記述します。

そして実際に動作させるプログラムは、パッケージ名で管理するディレクトリに集めるようで、 /opt/UPS-Watch-shut/bin に置きます。バッテリーの情報を取得するライブラリ raspiupshat.so もここに置きます。

systemd のサービスとして組込み

カレントで作成して、それを該当するディレクトリにコピーして、所有者を root に変更したり、アクセス権の変更をします。

まずは、ユニットファイルの作成です。

$ vi ups-watching.service
[Unit] 
Description = UPS Watching AutoRun
After=network-online.target remote-fs.target nss-lookup.target
ConditionPathExists=/opt/UPS-Watch-shut/bin

[Service]
ExecStart=/opt/UPS-Watch-shut/bin/startup-1st.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target

追加するサービスの準備を行います。

$ sudo cp ups-watching.service /etc/systemd/system
$ sudo chown root:root /etc/systemd/system/ups-watching.service
$ sudo chmod 644 /etc/systemd/system/ups-watching.service

サービスから最初に起動するモジュールを作成します。

$ vi startup-1st.sh
#!/bin/sh
exec /usr/bin/env python /opt/UPS-Watch-shut/bin/ups-shutdown.py

パッケージをまとめるディレクトリを作成します。

$ sudo mkdir -p /opt/UPS-Watch-shut/bin
$ sudo chmod 755 /opt/UPS-Watch-shut/bin
$ sudo cp startup-1st.sh /opt/UPS-Watch-shut/bin
$ sudo chown root:root /opt/UPS-Watch-shut/bin/startup-1st.sh
$ sudo chmod 755 /opt/UPS-Watch-shut/bin/startup-1st.sh

シャットダウンプログラム

提供されていた python のサンプルプログラムは、サンプルの指示手順で解凍すると pythonの原形とバッテリー情報取得ライブラリ raspiupshat.so が提供されています。少し手を加えて、動作するように直し、単体ではシャットダウンが行われることを確認できました。

$ vi ups-shutdown.py
#!/usr/bin/env python

# Raspi UPS Hat

# We only provide 2 interface to get battery information;
#
#Interface 1:
#Function: get current battery voltage
#Return value: battery voltage;
#float getv();

#Interface 2:
#Function:    get battery capacity
#Return value: 0~100+
#float getsoc();
#

import sys
# import Raspi UPS Hat library
import raspiupshat
import os
import time
import datetime

# init Raspi UPS Hat
raspiupshat.init();

# Get info
now = datetime.datetime.now()
print("{0:%Y-%m-%d %H:%M:%S} ; ".format(now) + "Voltage:%5.2fV ; Battery:%5i%%" % (raspiupshat.getv(), raspiupshat.getsoc()))

if raspiupshat.getsoc() >= 100:
        print "Battery FULL"
if raspiupshat.getsoc() < 20:
        print "Battery LOW"
while 1:
        if raspiupshat.getsoc() < 5:
                print "System will shutdown now,bye!"
                os.system("sudo shutdown -h 0")  
        # now = datetime.datetime.now()
        # print("{0:%H:%M:%S} ; ".format(now) + "Voltage:%5.2fV ; Battery:%5i%%" % (raspiupshat.getv(), raspiupshat.getsoc()))
        # time.sleep(10)

無限ループ内の最後の3行は、確認時に10秒毎に時間とバッテリー電圧値、バッテリー容量を表示するためのものです。必要なら先頭のコメント ‘#‘ を消すことでデバッグ行の表示ができます。
それとバッテリー情報収集用のライブラリ raspiupshat.so を同じ場所に配置します。

$ sudo cp ups-shutdown.py /opt/UPS-Watch-shut/bin
$ sudo chown root:root /opt/UPS-Watch-shut/bin/ups-shutdown.py
$ sudo chmod 755 /opt/UPS-Watch-shut/bin/ups-shutdown.py
$ sudo cp raspiupshat.so /opt/UPS-Watch-shut/bin
$ sudo chown root:root /opt/UPS-Watch-shut/bin/raspiupshat.so
$ sudo chmod 755 /opt/UPS-Watch-shut/bin/raspiupshat.so

サービスとして定義している ups-watching.service により startup-1st.sh が起動されます。その中で単純にシャットダウンプログラムの ups-shutdown.py を起動しています。


ユニットファイルを systemd に登録

ここからは、systemd へのサービス(ユニットファイル)の登録と検証作業です。ユニットファイル等を追加や変更した後には、必ず次のコマンド sudo systemctl daemon-reload を実行します。

そして一緒にステータスも確認しておきます。

$ sudo systemctl daemon-reload
$ sudo systemctl status ups-watching.service
● ps-watching.service - UPS Watching AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

ステータスで表示される Loaded: 行のカッコ内の1つ目と2つ目のセミコロンの間の disabled となっているのは、自動起動が無効になっているということのようで、自動起動できるように設定します。

自動起動が行われるように設定

$ sudo systemctl enable ups-watching.service
Created symlink /etc/systemd/system/multi-user.target.wants/ups-watching.service → /etc/systemd/system/ups-watching.service.
$ sudo systemctl status ups-watching.service
● ups-watching.service - UPS Watching AutoRun
Loaded: loaded (/etc/systemd/system/ups-watching.service; enabled; vendor preset: enabled)
Active: inactive (dead)

ユニットファイルの定義内に、[ Install ] の WantedBy= で定義しているユニットにリンクが張られ、先ほどの /etc/systemd/system/ups-watching.service; の後の disabledenabled に変わっています。

これで再立ち上げで自動実行されるようになっているはずですが、その前にコマンドで起動して確認したり、停止させる操作をして動作を確認します。


$ ls -l /opt/UPS-Watch-shut/bin/
-rw-r--r-- 1 root root 7416 1月 25 11:07 raspiupshat.so
-rwxr-xr-x 1 root root   76 1月 24 22:49 startup-1st.sh
-rwxr-xr-x 1 root root  987 1月 25 11:06 ups-shutdown.py

$ sudo systemctl daemon-reload
$ sudo systemctl start ups-watching.service
$ sudo systemctl status ups-watching.service
 ups-watching.service - UPS Watching AutoRun
Loaded: loaded (/etc/systemd/system/ups-watching.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2019-01-26 08:57:28 JST; 5h 36min ago
Main PID: 367 (python)
CGroup: /system.slice/ups-watching.service
└─367 python /opt/UPS-Watch-shut/bin/ups-shutdown.py

1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:08 ; Voltage: 4.34V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:18 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:28 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:38 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:48 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:31:58 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:32:08 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:32:18 ; Voltage: 4.35V ; Battery: 100%
1月 26 14:32:48 rpi1-disk startup-1st.sh[367]: 14:32:28 ; Voltage: 4.35V ; Battery: 100%

上記の結果では、実際に shutdown 動作を行う python のプログラムの ‘#’ のコメントを取り除き、メッセージ書き出しのステートメントを有効にし組込みました。

systemd の動作に不慣れで、正しく理解できていないのですが、systemctl status コマンドでは、処理中で書き出されたメッセージが直接表示されているわけではないようで、別に journalctl -u コマンドで表示できるようです。

書き出されたメッセージが、キューかバッファのような所に蓄積されていて、 systemctl status の実行時に移されて、journalctl -u で見られる場所に蓄積していくような感じです。そのため、最新の情報を確認するためには、systemctl status を先に実行してから journalctl -u を実行して確認する必要があるようです。

メッセージの各行先頭には、systemctl status で移された日時が記述されているようで、前回の確認から今回新しく加えられた行を判別することが可能なようです。なお、操作方法は less コマンドの操作と同じなので、‘/’ で文字列を検索したり、行をスキップしたり、‘1G’ で先頭行に移動したり、‘G’ で最終行に移動することもでき、上下の矢印キーで前後にメッセージを辿ることができます。

実際の動作検証作業

本番でのシステム終了動作を確認するために、ssh でリモート接続したまま、バッテリーの情報を 10 秒毎に表示して確認しましたが、5% になった後の1分後くらいにセッション切断のメッセージと共に、4% を表示して停止していました。

期待したシステム終了が行われているようで一安心です。メッセージが蓄積されている journalctl -u コマンドの結果例を次に示します。このコマンドは一般ユーザーで確認できるようです。

$ journalctl -u ups-watching.service

 1月 26 08:57:28 rpi1-disk systemd[1]: Started UPS Watching AutoRun.
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 2019-01-26 08:57:32 ; Voltage: 3.77V ; Battery:
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: Battery LOW
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 08:57:32 ; Voltage: 3.77V ; Battery:    5%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 08:57:42 ; Voltage: 3.78V ; Battery:    5%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 08:57:52 ; Voltage: 3.77V ; Battery:    5%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 08:59:54 ; Voltage: 3.77V ; Battery:    5%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:04 ; Voltage: 3.77V ; Battery:    5%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:14 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:24 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:34 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:44 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:00:54 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:05 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:15 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:25 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:35 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:45 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:01:55 ; Voltage: 3.78V ; Battery:    6%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:02:05 ; Voltage: 3.78V ; Battery:    7%
 1月 26 09:14:56 rpi1-disk startup-1st.sh[367]: 09:02:15 ; Voltage: 3.78V ; Battery:    7%
lines 1-22

今回のUPSバッテリー監視と shutdown では、特にプログラムやサービスについての依存関係は無いので、これで完了です。

次は、UPSバッテリーの充放電に伴う携帯メールへの通知についての対策を考えています。

ラズパイで ネットチューナー

長く生きていると誰にでもじわじわと押し寄せる老朽化ですが、私の頭もご多分に漏れず処理能力がかなり落ちていると思います。処理は遅いし途中で別の優先事項が割り込むと、元の作業が長期中断したり継続の見込みのない保留になったりしています。

仕掛り中のラズパイ1B+のネット共有サーバーも少し保留で、1年以上前に設定して有効な利用もないまま据え置かれたラズパイがあり、こちらは妻が使用しているステレオに接続して試用をして、その後そのまま据え置かれていました。

ラズパイに専用のDACを重ねて、ミュージックサーバーの専用OS – Volumio2を入れて利用する物です。WiFi経由でネットに接続したら音飛びが酷くて、経過見で置かれてそのままになってしまったようです。忘れましたが、WiFi機能があるのでラズパイ3B でしょうね。

ラズパイもサーバーとして長く稼働していると、原因が相性なのか性能なのか不明ですが、 SD のシステムやデータが壊れるのを度々経験していて、ちょっと心配です。そんなこともあって、相性が良いと評判の東芝製 microSD をわざわざ購入して設定しました。今回は稼働したまま1年以上置かれていましたが、壊れてはいませんでした。

妻が独身時代から利用していたステレオが老朽化して、電解コンデンサや機械的に可動するボリューム類も対応不能な状況になって、当時手軽な価格でネットで購入できるメインアンプとしてマランツの PS3001 を購入しました。これが、接続もされないままひっそりと片隅に置かれたままになっていました。

それをバックグラウンド・ミュージックのシステムとして使おうと考えて、スピーカーも購入していました。邪魔にならないように静かに音が流れるだけの環境での使用なので、大きなスピーカーの必要もなくて安い手頃なものを購入していました。これが今回は日の目を見ることになりました。

自分の部屋にマランツの大きくて重いアンプと小さな Volumio のラズパイを運びスピーカーを接続しました。日の目を見たミュージックサーバーは何の問題もなく音を出し始めました。

1年以上前にセットアップしたシステムなので、当然のように新しいシステムが提供されていました。悩むところですが今後のこともあるので、経験としてアップデートしてどのような結果になるのか興味があるし知りたいところです。そんなわけで、Volumio2 システムのアップデートも試してみました。

見た目は問題なくアップデートできたようです。この時点で止めといても良かったのですが、ネット上には NHK のラジオを組込む記事なども見付けることができ、プラグインを2つ組込んで対応できたようなので試してみようと考えました。
プラグインの組込みを実行すると、どれを選んでも同じエラーになります。古いシステム情報との競合のようです。ssh でログインして、update や upgrade を試してみましたが、システム全体の作りが元は同じ raspbian を使用しているもののモジュールの更新は考慮していないようです。

そこで最初からのクリーンインストールを試して、動作の違いを検証してみようと思い立ちました。そこで問題なのが選択してせっかく作った playlist を保存しておき、最新の Volumio2 のインストール後に戻すことができるかです。

置かれたディレクトリの情報をネットで色々と調べました。でも肝心なディレクトリの情報になかなか辿り着けないで困りました。

全てがそうなのかは分かりませんが、ルート下の data ディレクトリに置かれているようです。例えば、/data/playlist/ の中に、オーナーが volumioユーザーとして、プレイリストのタイトル項目毎にファイルとして分かれて置かれていました。

リモートで作業しているノートPCから、scp コマンドで取り出すことも、戻すことも問題なく出来るようです。例えば、保管用のディレクトリを確保してから、次のようなコマンドで取り出して、新しいシステムをセットアップします。

$ mkdir -p ~/volumio/playlist
$ scp -r volumio@192.168.22.33:/data/playlist/*  ~/volumio/playlist/

作業しているノートPCの volumio/playlist/ に取り出せているので、新しいシステムをクリーンインストール後に、戻すために scp コマンドを利用します。

$ scp -r ~/volumio/playlist/*  volumio@192.168.22.33:/data/playlist/

最新の Volumio2 をセットアップした後で、悩んだことをメモしておきます。それは基本的なことで、ssh したかったのにできなくて困りました。1年前もたしか悩んだような記憶があります。方法はブラウザで、Volumio の /DEV にアクセスして、ssh を有効にする [enable] ボタンをクリックすることです。

なお、初期値のパスワードは、volumioroot も ‘volumio‘ になっているので置き換えを実行しておきます。

最新版の Volumio2 をクリーンインストールしたので、できなかったプラグインは問題なくインストールまでできました。しかし、ネットで紹介された手順の途中で、:9000 番ポートにアクセスして操作するように説明されているのですが、そのポートでは機能が待ち受けていないようで、この作業は保留になりました。

暇ができたら頭の体操としてこの続きを進めたいと思いますが、ただのネットチューナーとしてだけでも十分なバックグラウンド・ミュージックサーバーとして働いています。この先も暇などできないと思うのでこの件は長期保留ですね。

最初からリストされている多くの放送局は動作保証されてませんが、感覚的には半分くらいはまともに機能しているようで、日本の歌謡曲やアイドルの局を流している放送局もあります。時折少し訛った日本語で日本の天気予報や鉄道情報が流れるのもありましたし、曲目や歌手名が漢字で表示されるのもあります。

バックグラウンドで適当に色々な曲が流れるのは私の性に合っているのかもしれません。特に信仰する歌手や曲があってこだわるわけでもないので、わざわざ選んだり入替えたりする手間も必要なくとても合理的です。今はこんな曲が欲しいと大雑把に放送局を選ぶだけで事が済みます。

音量のボリューム操作や放送局の選択は、離れたPCからのブラウザ操作でも、スマホからの操作でもできるし、もし必要なら曲名やアーティスト名の確認も簡単な内容ですが一応できます。今現在は、こんな曲もあったよなぁ〜と思うような懐かしい青春時代の曲が次から次へと流れています。

家に置かれたアナログの固定電話でもバックではデジタルのネットワーク経由だし、すでにラジオも時代は電波を使って放送する時代からネットワークを経由する時代に移行しているのですね、有料放送の NHK はこだわりから時代に遅れてますが今後どうなるのでしょうね。
放送局は、聞ききれないほどの選択量があるので、飽きたら変えるとか気分で変えるとか、良い悪いの判断は一度選んでみないと分からないので、埋もれる局が溢れてます。

ラズパイUPSのメール

ラズパイ1B+のネット共有サーバー化で、UPSバッテリーの減少や充電の経過をメール送信させて、スマホで確認したい、との対策の続きです。

メール機能は、今迄のサーバー設定の流れからpostfixでの設定になりますが、以前の実績のあるサーバーの設定と比較しながら今回も設定しました。一応動作したように感じたのですが、送られてくるはずのログが届きませんでした。

postfixのバージョンも上がっていて、項目が少し増えているようです。丹念に見直すと一部がコメントのままになっている項目とか別に誤りとか、数件気になる場所が見つかりました。

そこを直して立ち上げ直すと、期待しているような送信が行なわれているような印象です。届かなかったログも時間を置いて再送信されたようで、数時間後に届きました。

メモとして、コメントを除いた有効行をリストしておきます。

$ cat /etc/postfix/main.cf
compatibility_level = 2
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = rpi1-disk.sunao-mita.pgw.jp
mydomain = sunao-mita.pgw.jp
myorigin = $myhostname
inet_interfaces = all
mydestination = rpi1-disk, DebianPogo, DebianPogo.$mydomain, $myhostname, localhost, $mydomain
local_recipient_maps = unix:passwd.byname $alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = host
mynetworks = 127.0.0.0/8, 192.168.11.0/24, [::ffff:127.0.0.0]/104 [::1]/128, [240d:1a:34d:7f00::0]/64
relayhost = [smtp.nifty.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/nifty.auth
smtp_sasl_security_options = noanonymous
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/bin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
inet_protocols = ipv4, ipv6
message_size_limit = 10485760
mailbox_size_limit = 1073741824
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, permit_sasl_authenticated, reject
mua_client_restrictions = permit_sasl_authenticated,reject
mua_helo_restrictions = permit_sasl_authenticated,reject
mua_sender_restrictions = permit_sasl_authenticated,reject

mailコマンドでメールするのに、以前は問題なく送信できていたのに、最近のバージョンではサーバー名が短縮されて送信されるようで、リレー先の@niftyでエラーになってしまいます。

どこかの定義で変更できるのかと思い調べたのですが、私には見つけられませんでした。対策としては、-r オプションで、リターンアドレスをフルアドレスで明示して指定することで回避できました。

メールで経過を送信できる目処が立ったので、どのように作るかですが、作成したups-readでバッテリーの容量が取得できるので、単純なシェルスクリプトで容量の変化を検知してメールを作成させることにしました。

バッテリーの減少検知では、50%を切ったら10%減少毎にメールをスマホに送信します。充電では、50%を越えたら15%充電毎にメールをスマホに送信します。

起動方法は、cronにより適当なインターバルで、毎回起動し過去と比較判定して該当すればメールを作成して終了します。

起動された前回の容量とメールを作成した時の容量をファイルに記録しておいて比較する方法です。経過をモニタしながらのデバッグで分かったことは、ups-readから渡される容量が、有り得ない数値を頻繁に表示します。

0 〜 100の範囲を超えて、120 程度は想定内と認識しますが、217 とか 193 などといった異常な数値が頻繁に出てきます。観察すると異常な数値に混じって正常な数値も有るようです。

異常な数値を排除した 0 〜 120 の範囲に入る数値は 、安定していて変化の少ない数値で推移しています。期待するバッテリーの容量と判断しても良さそうです。

対策としては、120 を超える異常な数値の時には前回の数値と置換えて無視することにしました。

$ cat bin/ups-check-mail.sh
#!/bin/bash

T='## UPS Battery Capacity ##'
Msg='UPS Battery Capacity '
DW='*Down* : '
UP='*Up* : '
Rt='sunao@rpi1-disk.sunao-mita.pgw.jp'
To='sunao*****@yahoo.**.jp'    # スマホのメールアドレス

FC='UPS-Check/UPSCap.txt'      # 前回の容量メモ
FM='UPS-Check/UPSCap-msg.txt'  # メール生成時の容量メモ

C=`ups-read`
test -f $FC || echo 100 > $FC  # メモファイルが無い場合
test -f $FM || echo 100 > $FM  # メモファイルが無い場合

UPSCap=`cat $FC`
UPSmsg=`cat $FM`
test $C -gt 120 && C=$UPSCap  # 120% を越えていれば異常と判断し、前回値に補正

if [ $C -lt $UPSCap ]; then  ### 放電 ; 前回との減少変化を検知
  if [ $C -lt 50 ] && [ $((C+9)) -lt $UPSmsg ]; then  # < 50% ; 10% 減少毎にメール作成
    echo $C > $FM

    Tl=`echo "$T" | sed -r "s/( ##)$/ *DOWN* ( $C% )\1/"`  # 減少メールのタイトル作成
    # echo "タイトル: $Tl"  # debug 確認用
    echo -e "`date`\n$Msg$DW$C %" | mail -s "$Tl" -r "$Rt" "$To"    # メールの転送
  fi
else
  if [ $C -gt $UPSCap ]; then  ### 充電 ; 前回との増加変化を検知
    if [ $C -gt 50 ] && [ $((C-14)) -gt $UPSmsg ]; then  # 50% < ; 15% 増加毎にメール作成
      echo $C > $FM

      Tl=`echo "$T" | sed -r "s/( ##)$/ *UP* ( $C% )\1/"`  # 増加メールのタイトル作成
      # echo "タイトル: $Tl"  # debug 確認用
      echo -e "`date`\n$Msg$UP$C %" | mail -s "$Tl" -r "$Rt" "$To"    # メールの転送
    fi
  fi
fi
echo $C > $FC  # 今の容量を記録

AC100V電源を止めても、2時間近くはバッテリーで動作していますが、しばらく待っているとスマホにメールが送られてきます。

備忘録として、単体での起動なら例えば /home/sunao/bin/ の下にスクリプトを置いて起動できますが、cron からの起動ではスクリプトが見付けられずにエラーとなります。cron では、最低限のPATH設定となっているからです。

crontab -e で、起動時間や起動スクリプトを編集する定義の中で、さらに先の行に、PATH= 定義を記述して実行モジュールを読み込むディレクトリをリストしておくとパスが省略されていても起動できるようです。

$ crontab -e

# m h  dom mon dow   command
PATH=/home/sunao/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

##### UPS バッテリーの変化でメール作成 ######
*/5 * * * * ups-check-mail.sh > /dev/null

スマホには、8 〜 9 分間隔で 10%減のメールが届きます。逆に充電時は、11 〜 12 分間隔で 15%増のメールが届きます。気休めですがメールが送られると少し安心できます。

まだ手を加えたい箇所はあるもののネット共有サーバーとして利用できそうな状況になってきました。

ラズパイで共有サーバー

前回で記述している初期のラズパイ1B+に、デスクトップ用のOS Raspbianをセットアップして、バッテリーバックアップモジュールと2.5インチHDDを組合せて、ネットワーク共有サーバーとして立上げます。

ラズパイも一気に普及したために、皆さんラズパイで色々な物を作っていますが、私には余裕がないので、昔から定番であるディスク容量に少し余裕を持たせたNASを作って、利用しようと思っています。

ディスク容量は 2TBです。割引で購入しましたが、安くなったものです。ラズパイの不満としてはディスクのIOインタフェースが、USBで少し遅く単体構成でRAID2のミラー化は無理っぽいですよね。

立上げのブートは仕方無く公開されている microSD ですが、システムとしてのルートパーティション以降はディスク内に配置して処理します。

ディスクはパーティション分割して、システムの置かれるルートパーティションは適度な大きさ30GBで、同様にスワップも適度に確保して、それ以外を300GB程度の複数に分割して、立上げ時に自動マウントしています。

NASとしてのデータをバックアップする方法としては、ディスクのミラーに代わる方法として、夜中から明方に毎日他のサーバーにコピーする方法で確保します。

初期システムとしては、デスクトップ用として立上げましたが、sshでリモート操作できるのを確認できてから、モニタのHDMIケーブル、キーボードとマウスのUSBケーブルを取り去りました。

今まで共有サーバーとして使用しているサーバーを継続で使用すれば、何も苦労は要らないと思うのですが、実は先日システムを構成しているケーブルに接触したらしく、システムがダウンしていて気が付かないまま数日置かれたことがありました。

そんな訳で、バッテリーバックアップを含めて安定したサーバーを作りたいと考えてます。新旧サーバー間でデータをコピーして置き換える準備をしています。

少し触れたり触っても停止しないように、ケースで覆う必要があり、安くて良さそうな物を百均セリエで見付けてきました。安っぽいですがこれで十分です。

バッテリーに電源供給するケーブルイーサネットケーブルの2本のケーブルだけが出ていて、バッテリーからの電源供給と遮断を行うマイクロスイッチにアクセスできる小さな穴を開けました。

ラズパイの進化は早くて凄い

何となくAmazonを見ていたら、ラズパイにバッテリーで供給できるキットが出ていたので購入しました。

ネット上には、そのキットに関する情報の公式ブログが立上げられているようで、ラズパイへの電源供給を制御できる小さなプッシュスイッチがあることもわかりました。

日本国内で最初に発売されたラズパイ1Bでは、ボード固定用のネジ穴位置がユニーク過ぎて、このキットとは親和性が良くないと思われるので、1B+と組合せて共有サーバーとして立上げることにしました。

ラズパイ公式OSのRaspbianの選択ですが、本家のページを見ると3種類あるようで、色々詰込んだデスクトップ用基本のデスクトップ用、サーバー用途だと思われる最小構成、過去にデスクトップ用では痛い経験があるものの、今回は基本のデスクトップ用で作ってみようと決めました。

2018-11-13 / 4.14 / Raspbian stretch with desktop です。ダウンロードして展開しながら、microSDに書込みました。作業はLinux上なので、パイプで繋いだ1行のコマンド例が出ていたので、それを参考に作業しました。

microSDラズパイ1B+に挿入して、バッテリー供給キットの充電が途中なのが、LEDランプの点滅位置でわかります。

ラズパイ1B+には、USBポートが4つあります。USB接続のマウスとキーボードを用意し接続して、HDMIケーブルをテレビのモニターに繋ぎ、バッテリー供給キットのスイッチでラズパイに電源供給しました。

立上りが遅いので心配にはなりますが、暫く待つとデスクトップ画面が表示され、そのまま見ていると勝手にダイアログが表示され、microSDの空き一杯にエリアを拡張しているようです。

その後も必要な設定が自動的に起動され、パスワード変更ロケーションの設定が行われました。久し振りに触れましたが凄い変化です。今迄の経験では日本語化で苦労していましたが、ちょっと選択をしただけで、日本語化が完了して、漢字入力もできてしまいました。

驚きの連続です。最後の安定までは時間が掛かりますが、アップデートも最新になっているし、時間も日本時間になっていて、再起動後の立上げ直後にも日本時間になっていて、セットアップの進化に感服しました。

久し振りにラズベリーパイ

いつかは忘れたけど、家のネットに共有サーバーとして立上げたラズパイ3Bが、安定稼働数カ月の後に勝手にシステムアップデートして、危篤になり脳死の植物状態になってしまいました。

サーバー用途に、デスクトップを含むフルセットのRaspbianで、セットアップしたのが悪かったのかと反省してます。

そのラズパイ3Bは、共有サーバーとして利用途中でも、何度か同様のアップデートが行われ、止まっても後から介入して、何度かは元気に立ち直らせていたのです。

最後の時は、思い付く色々な手を尽くしても駄目でした。それ以来、不安定なラズパイは実運用に向かないと考えて、そのラズパイ3Bを放置してました。

その後、仕方なく手持ちの初期の頃の古くて遅いラズパイ1Bに、最小構成のRaspbianを入れて共有サーバーとしてセットアップしました。

別な場所で、ラズパイ2Bに同じ最小構成のRaspbianを入れて、夜間に共有サーバーのデータを自動でバックアップするサーバーとして立上げました。

こちらは安定して動作しています。自動でシステムアップデートは行われませんが、時々思い出したように手動でアップデートしてます。対象のアップデートは全て適用してますが、今まで問題は起きていません。

初期の遅いラズパイでも、共有サーバーとして稼働しているだけなら何のストレスも感じません。外付けディスクから直接立上げる方法は公開されていないので、最初にSDmicroSDで立上げて、外付けディスクに移る方法で利用してます。

ネット共有サーバーとしてmp4の動画も入れて、スマホやパソコンから再生してますが、特に高画質の大きな動画ではないので、問題なく利用できています。

そうは言っても、初期のラズパイの1Bは、USBバスパワーで外付けディスクを稼働させるのは不可能で、セルフパワーのHUBや電源を必要とするため、色々と煩雑で100均のケースに入れてますが、近くの配置を変えていた時に触れたのかシステムダウンしてました。

そんな事もあり、ラズパイB+に、UPSとして利用できそうなバッテリーを含むオプションとかを組合せて、外付けディスクの容量も倍にして共有サーバーを置き換えようかと考えてます。

安定してた共有サーバーダウン

昨日たまたま sshで操作ついでに思い立ち、通常のセキュリティアップデートのつもりで久し振りのコマンド操作後にリブートしたら、安定して運用中の Raspberry Pi 1B の共有サーバーが死にました。

学習しないで同じ轍を踏むとは自分でも悲しいです。最新版の Raspbian は、要注意だという事を改めて再認識させられました。

他にも Raspberry Pi のサーバーが稼働していますが、少し前の Raspbian をセットアップしたサーバーなので、単純にセキュリティアップデートだけが行われたらしく、そのままに稼働しています。

以前のメモを頼りに復活させますが、最新のOSで作って良いのか悩みます。

頭を冷やして少し考えてから判断したいと思います。

ラズパイ1B で共有サーバーの構築 (5/)

  1. リモートメンテに必須の byobu / screen の設定
  2. いよいよ念願の共有サーバー samba の設定

キーボードもモニタも無いサーバーを操作するには、他のパソコンからのリモートメンテナンスが必須ですが、操作も並行して同時に別のコマンドを実行させたいことはよくあることです。素のままだと ssh 等を複数起動してセッションを張らないと出来ません。また長く掛かるコマンドの実行中にセッションが切れたり、クライアント側を停止するとサーバー側もエラーで停止します。

過去の記事でこれらについての対策方法として、仮想端末について触れているので、その部分を見直しながらコピーしておきます。

仮想端末と呼ばれるジャンルには、 byobu / tmux / screen と言ったソフトがあって、byobu は tmux や screen のラッパープログラムとして機能します。

何が便利かと言うと、 ssh 等で直接リモートログインした状態で、サーバー側のコマンドを利用して処理を行っている時に、何かの要因で通信路に障害が起きてセッションが切れると、実行中の処理も異常終了してしまいます。しかし、これらの仮想端末を利用して処理していると仮に通信路で障害が発生しても、再接続するだけで元の処理は継続して実行したままなので途中の経過表示も含めて元の続きを継続できます。

メリットを言い換えると、時間のかかる処理をリモートサーバー上で起動しておいて、操作するクライアント側では電源を落とす等の方法で接続を切ってしまい、時々接続して途中経過を確認したり、時間を置いてから最終結果の確認だけを行うことも可能になります。それと、複数の ssh 接続が必要なことも時としてありますが、例えば速度が遅く不安定なインターネットを経由した先のサーバー接続等を考えた場合には、直接の接続セッションは単一なのに、複数の仮想端末内で色々な処理を並行して実行できるのは安心感があります。

そんな訳で byobu を導入します。一般的に byobu は通常 tmux を伴って仕事をするのですが、私の場合は昔から screen を利用していた経緯があって、他に設置のサーバーでも byobu と screen の組合せで稼働しています。

$ ssh 192.168.11.21    .....クライアントからのssh接続要求

Linux rpi1-com2 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l

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: Mon Nov 20 20:26:12 2017 from 192.168.11.43
$ byobu      .....リモート接続されたラズパイで byobu を起動

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.

Welcome to the light, powerful, text window manager, Byobu.
You can toggle the launch of Byobu at login with:
'byobu-disable' and 'byobu-enable'

For tips, tricks, and more information, see:
* http://bit.ly/byobu-help

$

 

 

 

 

 
              ...... F6 キーの押下で byobu 終了 ⇒ 起動前に戻る
[detached (from session 1)]

実際のデフォルトで起動した byobu の画面は次のイメージです。 byobu+tmux の形式です。

そして byobu の裏で screen が動作するように変更します。

$ byobu-select-backend
Select the byobu backend:
1. tmux
2. screen

Choose 1-2 [1]: 2

これで screen と連携した byobu の設定が完了しました。
byobu+screen のイメージは次の画面です。操作した感じでは問題なさそうです。

これらの仮想端末ソフトには、コマンド入力を受付けるシェル画面、例えば bashの画面が表示されていますが、そのまま文字を入力する以外に、外枠としての仮想端末自体を制御するためのコマンド文字が存在します。例えば、新しくシェル画面を追加したり、並行処理している複数のシェル画面を切り替えたりします。その制御用の文字を、エスケープ文字と呼びますが、これを各サーバーで色々だと誤操作等の支障が出るので変更して統一しておきます。

エスケープ文字の変更は、byobu が起動している画面で F9 キーを押下するとメニューのダイアログが起動します。 screen との相性が悪いらしく、表示が崩れますが変更は出来るようです。変更した結果のファイルを確認すると文字列が追加されていました。

$ vi .byobu/keybindings

source $BYOBU_PREFIX/share/byobu/keybindings/common
bindkey "^B"
escape "^Bb"
register x "^B"
~

ただし、このままでは sshでリモートログインしても自動的に byobu は起動しないし、 byobu を終了しても sshでログインした状態のままになります。

$ byobu-enable

The Byobu window manager will be launched automatically at each text login.

To disable this behavior later, just run:
byobu-disable

これでクライアントからの ssh リモート接続でセッションが確立すると、自動的に byobu が起動して、過去に操作していたなら以前の状態の継続になります。リモートでの操作を終えるために F6 キーによる終了で、 ssh によるリモート接続も自動的に切断します。

byobu の操作は、新規に仮想端末を追加で開くには F2 キー、別画面に移動するには、左回り右回りで F3 / F4 キーで行います。

これで仮想端末 byobu の設定は完了です。