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 で登録します。不要なプレイリストは右の点をクリックして削除可能です。

gpio ラズパイ特有のコマンド

ラズパイ特有のコマンドに、GPIOを操作するコマンドがありますが、これの利用でラズパイ自身のバージョンが確認できるようです。

sunao@radio:~$ gpio
gpio: At your service!
Type: gpio -h for full details and
gpio readall for a quick printout of your connector details

sunao@radio:~$ gpio -h
gpio: Usage: gpio -v
gpio -h
gpio [-g|-1] …
gpio [-d] …
[-x extension:params] [[ -x …]] …
gpio [-p] …
gpio …
gpio
gpio readall
gpio unexportall/exports
gpio export/edge/unexport …
gpio wfi
gpio drive
gpio pwm-bal/pwm-ms
gpio pwmr
gpio pwmc
gpio load spi/i2c
gpio unload spi/i2c
gpio i2cd/i2cdetect
gpio rbx/rbd
gpio wb
gpio usbp high/low
gpio gbr
gpio gbw


sunao@radio:~$ gpio readall
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 1 | 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 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+


sunao@radio:~$ gpio -v
gpio version: 2.46
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Embest
Device tree is enabled.
*--> Raspberry Pi 2 Model B Rev 1.1
This Raspberry Pi supports user-level GPIO access.

ls*** 色々な情報を確認

Linux OS の色々な情報を確認できそうなコマンドをメモしておきます。

一番単純な ls だけのコマンドは、一番お世話になる使用頻度の高いディレクトリの参照ですが、その後に続く文字列により色々な情報が得られるようです。ただし、環境によって使えるコマンドには制限があるようです。

常用している非力なノートPCで利用できるコマンドは次のとおりです。

sunao@MITA-NY40S:~$ uname -a
Linux MITA-NY40S 4.15.0-45-generic #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

sunao@MITA-NY40S:~$ ls ls lsdiff lsmod ls2ti3 lshw lsns ls_ubuntu-sv_ftpuser-bkup lsinitramfs lsof lsattr lsipc lspci lsb_release lslocks lspcmcia lsblk lslogins lspgpot lscpu lsmem lsusb

現在公開に利用しているPogoPlug では次のとおりです。

pogo:~$ uname -a
Linux DebianPogo 3.18.5-kirkwood-tld-1 #1 PREEMPT Thu Feb 5 17:58:07 PST 2015 armv5tel GNU/Linux

pogo:~$ ls ls lsblk lsinitramfs lsmod lspgpot lsattr lscpu lslocks lsof

手持ちの非力な Raspberry pi では次のとおりです。

sunao@rpi1-disk:~$ uname -a
Linux rpi1-disk 4.14.79+ #1159 Sun Nov 4 17:28:08 GMT 2018 armv6l GNU/Linux


sunao@rpi1-disk:~$ ls ls lsb_release lscpu lsipc lslogins lsns lsusb lsattr lsblk lsinitramfs lslocks lsmod lspgpot


sunao@rpi1-disk:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk
├─sda1 8:1 0 1G 0 part
├─sda2 8:2 0 32G 0 part /
├─sda3 8:3 0 1G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
├─sda5 8:5 0 300G 0 part /home
├─sda6 8:6 0 300G 0 part /share1
├─sda7 8:7 0 300G 0 part /share2
├─sda8 8:8 0 300G 0 part /pic-bkup
├─sda9 8:9 0 300G 0 part /home/bkup
└─sda10 8:10 0 329G 0 part /working
mmcblk0 179:0 0 7.5G 0 disk
├─mmcblk0p1 179:1 0 43.9M 0 part /boot
└─mmcblk0p2 179:2 0 7.5G 0 part /media/pi/rootfs

sunao@rpi1-disk:~$ lscpu
Architecture: armv6l
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
Model: 7
Model name: ARMv6-compatible processor rev 7 (v6l)
CPU max MHz: 700.0000
CPU min MHz: 700.0000
BogoMIPS: 697.95
Flags: half thumb fastmult vfp edsp java tls

利用している環境によって、利用できるコマンドはそれぞれのようです。

ラズパイに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バッテリーの充放電に伴う携帯メールへの通知についての対策を考えています。

少しだけドライブです

信州物味湯産手形の有効期限が迫って来て、このままでは少し勿体無いと焦る気持ちで出掛けることにしました。 日付は 2019-02-20 水曜日です。

1年間有効な温泉手形

手形入浴の対象で利用できる近くの温泉では、佐久ホテルが見つかりました。ネットで調べると老舗で寄ってみたいと思わせる由緒ある温泉のようで、利用できる時間制限が書かれていました。

妻と妻の母親が同伴ですが、妻より付近の観光施設を探せとの命題を仰せつかりました。

佐久市は、信州方面に出掛ける場合の通過点なので、普段は寄ることもなく通り過ぎる場所になっています。いつも通り過ぎるだけの私としてはなかなかの難題です。

ネットを探すと鎌倉彫記念館道の駅ヘルシーテラス南佐久とが目に止まりました。ゆっくり一般道を走り、昼飯と少し見学で温泉に浸かれば十分と考えて出掛けた次第です。

いつも利用するカメラも持参したのですが、妻と義母との移動では、カメラを取出すタイミングも無く、美術館とか記念館は基本的に作品の写真撮影は出来ないので、写す機会も結局なくて写真がありません。


最初に佐久市鎌倉彫記念館に行きました。あまり宣伝はしていないようですが、中庭を囲むように展示された小さな記念館です。入館料100円で、簡単なパンフレットとお茶もご馳走になりました。

管理しているのは気さくな女性で、若すぎず老けすぎずの適任な主婦といった感じの方で、地元出身のようで、色々と話をしてくれました。

館内には個人持ちの植木鉢が置かれ、華を添えていました。中に入った場所に、一時ブームがあった大きな金の成木の鉢植が置かれていて、小さな花をたくさん付けていました。

鉢植えの植物としては何度も見ているものなので、当然知っていましたが、花が咲くのを知らなかったので、まず最初に驚きました。

入って左の部屋には、地元市民のギャラリーが置かれているとの事で、色々なものが対象になって展示されるとのことです。たまたま今回訪れた時には、病気で身体が不自由になった高齢の方の彫刻作品が展示されていました。

この方は、小野澤四郎さんという方で、39歳の時に神経障害によって全身がまひするギランバレー症候群にかかったとのことで、地元の新聞の取材の記事もありました。

これも鎌倉彫のような立体に彫られた木彫りの作品群です。彫られた柿やヒマワリ、蛍袋、フキノトウ等の力作が展示されていました。なお、ここのギャラリーを見るのは只です。

自分の作品を絵柄にした本に挟むシオリも置かれ、配布していましたので頂いてきました。帰ってからネット検索したら、木彫り作品展が開かれるとの記事と本人の写真もありました。


本題の鎌倉彫記念館の展示物は、木内翠岳氏と弟の木内晴岳氏の作品が置かれ、季節によって入れ替えているとの説明でした。大きな作品は常設展示ですが、季節に合う題材の物を3ヶ月毎に展示するのだそうです。

常設の大きな物は迫力があります。大きな作品を作るには基になる木も、割れを防ぐために中心を避けて4分割して利用するため、大きな木が必要で、今では入手も難しいのだそうです。

竹とか、波とかの題材が彫られていました。時間を掛けての彫刻と漆の重ねで作られている作品です。季節による別の展示も見てみたいと思いました。


その後、道の駅ヘルシーテラス南佐久に行きました。前を通っていても一度も寄ったことのない道の駅です。

食事は軽食ならできそうなのですが、中でパンを焼いていて、並べられているのでそちらを食べて昼食にすることにしました。

目に付いた色々なパンを買って、ヨーグルト、それと梅を刻んで混ぜた赤飯も1つ購入して、館内のテーブルを借りて、千切りながら3人で食べました。色々な味を堪能でき、中々贅沢な昼食だと思います。

リンゴの時期もそろそろ終わりですが、サンふじに混ざって、ぐんま名月が置かれていました。まさかここでお目にかかるとは夢にも思いませんでした。当然一袋を買って帰りました。

秋のもぎたての新鮮さは有りませんが、家に帰ってから早速食べました。貴重で十分な美味しさでした。人により好みは別れますが、私にはやはり甘いリンゴが最高です。


一休みして、次は温泉です。楽しみにしていた佐久ホテルに着きましたが、水曜日は休みだと断られてしまいました。手形の条件には休みの記載がありませんでしたが、途中で運用が変わることはありますよね。

仕方無く、上田のふれあいさなだ館に行きました。停められている車の多さにちょっと引きましたが、温泉利用者だけの駐車ではなさそうです。

我々は物味湯産手形での温泉ですが、一般的な利用では 500円のようです。プールやジム等のスポーツ施設もあるようで、色々な施設の利用もでき500円は安いのでしょうね。

そこでは肉に巻いて食べたり、サラダに敷いたりするサンチュと呼ぶのかな、包菜が30円で置かれていたと妻が買ってきました。他にも緑の紫蘇の葉が安かったと言ってました。私の目には止まらない食材です。

久し振りに夕方まで、充実した1日を過ごしました。

ネット環境の独り言

このブログシステムであるWordPressをよく理解していないまま、メモを残せるところが欲しくて、『ブログ』をキーにしたネット検索のヒット情報から、思い付きで導入してしまったのが、今の利用の切っ掛けです。

そのような訳なので、管理のノウハウももちろん無いまま、運用方法も設定方法もわからないまま今日に至ってしまっています。あまり意識しないままシステムの更新も重ねバージョンも上がっています。

それはそれで良かったのですが、サーバーを移行したいとか、色々と気になることもあるのですが、対応する方法とか手順とか知識がなく分からないので心配の種がつきません。

そんな状況ですから、追加でCSSの設定ができることを知ったのも最近でした。投稿用のエディタの使い方もわからないままとりあえず利用していたのです。

WordPressのエディタが変更されました

そんな中で投稿用のエディタを使いこなす前に、新しいエディタの公開が始まり置き換えられました。今までのエディタはクラッシックとしてプラグインで残されていて利用も選択も可能のようです。

新しいエディタでは段落毎に分割されブロックとして扱われ、間の追加や入替え、写真やライブラリの追加も容易らしく、今までの慣れを持たない初心者が新しく慣れるには最適なのかもしれません。

しかし、以前の投稿内容を複製して、新しいエディタで変更していたら、ぐちゃぐちゃに書き換えられたり、ごっそり消え去ったりと大変な目にあいました。以前のタグによる記述のできるクラッシックブロックと言われる扱いもあるらしいのですが、知識がないと使いこなし方が分かりません。

自己防御に必要で、仕方無くネットから多少の基本的な知識を得ました。新しいエディタがグーテンベルクと名前の付いたエディタで、以前のものをクラッシックエディタと称しているようで、選択して利用できるようにしました。

デフォルトでは新しいエディタが選ばれた状態ですが、選べばクラッシックに変更も可能です。新しいエディタが便利なのは、適当に書き込んでいると下書きの状態が自動で保存されるようです。クラシックの操作では意識して自分で保存する必要があったように思います。

ネットからのアタック多発でコメント禁止に

プライベート写真の公開は、ブログのWordPressの機能を利用していませんので、いつからかを忘れるくらい前からネット上に公開しています。それに追加するイメージで、メモ書きができるようにWordPressのこのブログを立上げました。

当初から悪意のあるアタックがログに多数記録されていましたが、SQLデータベースも利用していないし、SSHのログインではパスワード認証を受け付けていないので、ネットワークトラフィックの増加程度しか影響もなく無視していました。

しかし、『群馬のじゆうじん』さんの歩きによる日本縦断の頃に、ブログ機能を追加してからはアタックが極度に増加して、毎日のログに多数のアタックが書き込まれ、日本語以外のスパムコメントが多数追加されるようになり、時々の管理では削除するのも手が回らなくなり、仕方無くコメントの受付を禁止しました。

--------------------- httpd Begin ------------------------
 Requests with error response codes
    400 Bad Request
       /: 4 Time(s)
       null: 1 Time(s)
    401 Unauthorized
       /: 4 Time(s)
       /menu.js: 1 Time(s)
    403 Forbidden
       /.php: 1 Time(s)
    404 Not Found
       /blog/index.php/2015/08/03/wp-setup-1/: 9 Time(s)
       /x.php: 5 Time(s)
       /1.php: 4 Time(s)
       /confg.php: 4 Time(s)
       /qq.php: 4 Time(s)
       /test.php: 4 Time(s)
       /blog/20190117_121630582/: 3 Time(s)
       /cmd.php: 3 Time(s)
       /z.php: 3 Time(s)
       /2.php: 2 Time(s)
       /MCLi.php: 2 Time(s)
       /api.php: 2 Time(s)
       /blog/index.php/2015/08/04/syslog-cron-1/: 2 Time(s)
       /conflg.php: 2 Time(s)
       /hell.php: 2 Time(s)
       /hello.php: 2 Time(s)
       /help.php: 2 Time(s)
       /log.php: 2 Time(s)
       /manager/html: 2 Time(s)
       /paylog.php: 2 Time(s)
       /q.php: 2 Time(s)
       /robots.txt: 2 Time(s)
       /s.php: 2 Time(s)
       /shell.php: 2 Time(s)
       /sitemap.xml: 2 Time(s)
       /test123.php: 2 Time(s)
       /wp-login.php: 2 Time(s)
       /xx.php: 2 Time(s)
       /zxc1.php: 2 Time(s)
       /.well-known/assetlinks.json: 1 Time(s)
       /.well-known/security.txt: 1 Time(s)
       //MyAdmin/scripts/setup.php: 1 Time(s)
       //myadmin/scripts/setup.php: 1 Time(s)
       //phpMyAdmin/scripts/setup.php: 1 Time(s)
       //phpmyadmin/scripts/setup.php: 1 Time(s)
       //pma/scripts/setup.php: 1 Time(s)
       /1111.php: 1 Time(s)
       /1213.php: 1 Time(s)
       /123.php: 1 Time(s)
       /1hou.php: 1 Time(s)
       /1q.php: 1 Time(s)
       /3.php: 1 Time(s)
       /51.php: 1 Time(s)
       /51314.php: 1 Time(s)
       /5201314.php: 1 Time(s)
       /56.php: 1 Time(s)
       /666.php: 1 Time(s)
       /7.php: 1 Time(s)
       /777.php: 1 Time(s)
       /92.php: 1 Time(s)
       /9510.php: 1 Time(s)
       /9678.php: 1 Time(s)
       /HX.php: 1 Time(s)
       /MyAdmin/index.php: 1 Time(s)
       /PMA/index.php: 1 Time(s)
       /PMA2/index.php: 1 Time(s)
       /Ss.php: 1 Time(s)
       /_query.php: 1 Time(s)
       /a.php: 1 Time(s)
       /aa.php: 1 Time(s)
       /aaaa.php: 1 Time(s)
       /aaaaaa1.php: 1 Time(s)
       /admin/PMA/index.php: 1 Time(s)
       /admin/index.php: 1 Time(s)
       /admin/mysql/index.php: 1 Time(s)
       /admin/mysql2/index.php: 1 Time(s)
       /admin/phpMyAdmin/index.php: 1 Time(s)
       /admin/phpmyadmin/index.php: 1 Time(s)
       /admin/phpmyadmin2/index.php: 1 Time(s)
       /admin/pma/index.php: 1 Time(s)
       /admn.php: 1 Time(s)
       /ak.php: 1 Time(s)
       /ak47.php: 1 Time(s)
       /ak48.php: 1 Time(s)
       /angge.php: 1 Time(s)
       /aotu.php: 1 Time(s)
       /aotu7.php: 1 Time(s)
       /app.php: 1 Time(s)
       /appserv.php: 1 Time(s)
       /bak.php: 1 Time(s)
       /blog//wp-content/plugins/wp-special-textb ... tb-uploader.php: 1 Time(s)
       /blog/?author=2: 1 Time(s)
       /blog/?author=4: 1 Time(s)
       /blog/index.php/2015/08/31/kawashimo/: 1 Time(s)
       /blog/index.php/2015/09/22/numanodaira/: 1 Time(s)
       /blog/index.php/2015/10/29/windows-vista/: 1 Time(s)
       /blog/index.php/2016/03/22/gun/: 1 Time(s)
       /blog/index.php/2016/09/04/rpi3-setup-8/: 1 Time(s)
       /blog/index.php/category/raspberry-pi/page/3/: 1 Time(s)
       /boots.php: 1 Time(s)
       /cacti/plugins/weathermap/editor.php: 1 Time(s)
       /cadre.php: 1 Time(s)
       /cainiao.php: 1 Time(s)
       /caonma.php: 1 Time(s)
       /cc.php: 1 Time(s)
       /ceshi.php: 1 Time(s)
       /cgi-bin/config.exp: 1 Time(s)
       /claroline/phpMyAdmin/index.php: 1 Time(s)
       /cmdd.php: 1 Time(s)
       /cmv.php: 1 Time(s)
       /cn.php: 1 Time(s)
       /cnm.php: 1 Time(s)
       /conf.php: 1 Time(s)
       /conf1g.php: 1 Time(s)
       /core.php: 1 Time(s)
       /cxfm666.php: 1 Time(s)
       /data.php: 1 Time(s)
       /db.init.php: 1 Time(s)
       /db.php: 1 Time(s)
       /db/index.php: 1 Time(s)
       /db__.init.php: 1 Time(s)
       /db_cts.php: 1 Time(s)
       /db_dataml.php: 1 Time(s)
       /db_desql.php: 1 Time(s)
       /db_pma.php: 1 Time(s)
       /db_session.init.php: 1 Time(s)
       /dbadmin/index.php: 1 Time(s)
       /default.php: 1 Time(s)
       /defect.php: 1 Time(s)
       /desktop.ini.php: 1 Time(s)
       /dexgp.php: 1 Time(s)
       /diy.php: 1 Time(s)
       /errors.php: 1 Time(s)
       /erwa.php: 1 Time(s)
       /fack.php: 1 Time(s)
       /favicon.ico: 1 Time(s)
       /fb.php: 1 Time(s)
       /feixiang.php: 1 Time(s)
       /fusheng.php: 1 Time(s)
       /general.php: 1 Time(s)
       /godkey.php: 1 Time(s)
       /h1.php: 1 Time(s)
       /hack.php: 1 Time(s)
       /hacly.php: 1 Time(s)
       /help-e.php: 1 Time(s)
       /hh.php: 1 Time(s)
       /hm.php: 1 Time(s)
       /horde/imp/test.php: 1 Time(s)
       /horde3/imp/test.php: 1 Time(s)
       /htdocs.php: 1 Time(s)
       /htfr.php: 1 Time(s)
       /imp/test.php: 1 Time(s)
       /index.php: 1 Time(s)
       /index1.php: 1 Time(s)
       /indexa.php: 1 Time(s)
       /info.php: 1 Time(s)
       /info1.php: 1 Time(s)
       /infoo.php: 1 Time(s)
       /infos.php: 1 Time(s)
       /ip.php: 1 Time(s)
       /j.php: 1 Time(s)
       /java.php: 1 Time(s)
       /knal.php: 1 Time(s)
       /l6.php: 1 Time(s)
       /l7.php: 1 Time(s)
       /l8.php: 1 Time(s)
       /lala-dpr.php: 1 Time(s)
       /lala.php: 1 Time(s)
       /ldw.php: 1 Time(s)
       /license.php: 1 Time(s)
       /lindex.php: 1 Time(s)
       /linux.php: 1 Time(s)
       /linux1.php: 1 Time(s)
       /linuxse.php: 1 Time(s)
       /logon.php: 1 Time(s)
       /lol.php: 1 Time(s)
       /lost.php: 1 Time(s)
       /lx.php: 1 Time(s)
       /m.php: 1 Time(s)
       /m.php?pbid=open: 1 Time(s)
       /miao.php: 1 Time(s)
       /min.php: 1 Time(s)
       /mm.php: 1 Time(s)
       /muhstik-dpr.php: 1 Time(s)
       /muhstik.php: 1 Time(s)
       /muhstik2.php: 1 Time(s)
       /muhstiks.php: 1 Time(s)
       /muieblackcat: 1 Time(s)
       /mx.php: 1 Time(s)
       /myadmin/index.php: 1 Time(s)
       /myadmin2/index.php: 1 Time(s)
       /mysql-admin/index.php: 1 Time(s)
       /mysql/admin/index.php: 1 Time(s)
       /mysql/dbadmin/index.php: 1 Time(s)
       /mysql/index.php: 1 Time(s)
       /mysql/mysqlmanager/index.php: 1 Time(s)
       /mysql/sqlmanager/index.php: 1 Time(s)
       /mysql_admin/index.php: 1 Time(s)
       /mysqladmin/index.php: 1 Time(s)
       /mz.php: 1 Time(s)
       /nuoxi.php: 1 Time(s)
       /okokok.php: 1 Time(s)
       /ou2.php: 1 Time(s)
       /p.php: 1 Time(s)
       /pe.php: 1 Time(s)
       /php.php: 1 Time(s)
       /phpAdmin/index.php: 1 Time(s)
       /phpMyAbmin/index.php: 1 Time(s)
       /phpMyAdm1n/index.php: 1 Time(s)
       /phpMyAdmin+++---/index.php: 1 Time(s)
       /phpMyAdmin-4.4.0/index.php: 1 Time(s)
       /phpMyAdmin.old/index.php: 1 Time(s)
       /phpMyAdmin/index.php: 1 Time(s)
       /phpMyAdmin/phpMyAdmin/index.php: 1 Time(s)
       /phpMyAdmin/scripts/db___.init.php: 1 Time(s)
       /phpMyAdmin/scripts/setup.php: 1 Time(s)
       /phpMyAdmin1/index.php: 1 Time(s)
       /phpMyAdmin123/index.php: 1 Time(s)
       /phpMyAdmin__/index.php: 1 Time(s)
       /phpMyAdmina/index.php: 1 Time(s)
       /phpMyAdminold/index.php: 1 Time(s)
       /phpMyAdmion/index.php: 1 Time(s)
       /phpMyadmi/index.php: 1 Time(s)
       /phpMyadmin_bak/index.php: 1 Time(s)
       /phpMydmin/index.php: 1 Time(s)
       /phpStudy.php: 1 Time(s)
       /phpadmin/index.php: 1 Time(s)
       /phpinfi.php: 1 Time(s)
       /phpma/index.php: 1 Time(s)
       /phpmy/index.php: 1 Time(s)
       /phpmyadm1n/index.php: 1 Time(s)
       /phpmyadmin-old/index.php: 1 Time(s)
       /phpmyadmin/index.php: 1 Time(s)
       /phpmyadmin/phpmyadmin/index.php: 1 Time(s)
       /phpmyadmin/scripts/db___.init.php: 1 Time(s)
       /phpmyadmin/scripts/setup.php: 1 Time(s)
       /phpmyadmin0/index.php: 1 Time(s)
       /phpmyadmin1/index.php: 1 Time(s)
       /phpmyadmin2/index.php: 1 Time(s)
       /phppma/index.php: 1 Time(s)
       /phpstudy.php: 1 Time(s)
       /plugins/weathermap/editor.php: 1 Time(s)
       /pma-old/index.php: 1 Time(s)
       /pma.php: 1 Time(s)
       /pma/index.php: 1 Time(s)
       /pmamy/index.php: 1 Time(s)
       /pmamy2/index.php: 1 Time(s)
       /pmd/index.php: 1 Time(s)
       /pmd_online.php: 1 Time(s)
       /post.php: 1 Time(s)
       /ppx.php: 1 Time(s)
       /program/index.php: 1 Time(s)
       /public/20040606.yunomaru/publicindex.html: 1 Time(s)
       /pwd/index.php: 1 Time(s)
       /python.php: 1 Time(s)
       /qa.php: 1 Time(s)
       /qaq.php: 1 Time(s)
       /qaz.php: 1 Time(s)
       /qq5262.php: 1 Time(s)
       /qw.php: 1 Time(s)
       /qwe.php: 1 Time(s)
       /qwq.php: 1 Time(s)
       /qwqw.php: 1 Time(s)
       /repeat.php: 1 Time(s)
       /ruyi.php: 1 Time(s)
       /s/index.php: 1 Time(s)
       /s1.php: 1 Time(s)
       /scripts/setup.php: 1 Time(s)
       /sean.php: 1 Time(s)
       /sha.php: 1 Time(s)
       /shaAdmin/index.php: 1 Time(s)
       /she.php: 1 Time(s)
       /sheep.php: 1 Time(s)
       /shopdb/index.php: 1 Time(s)
       /ss.php: 1 Time(s)
       /ssaa.php: 1 Time(s)
       /sss.php: 1 Time(s)
       /system.php: 1 Time(s)
       /text.php: 1 Time(s)
       /tiandi.php: 1 Time(s)
       /tomcat.php: 1 Time(s)
       /tools/phpMyAdmin/index.php: 1 Time(s)
       /toor.php: 1 Time(s)
       /typo3/phpmyadmin/index.php: 1 Time(s)
       /u.php: 1 Time(s)
       /up.php: 1 Time(s)
       /uploader.php: 1 Time(s)
       /users-online/: 1 Time(s)
       /uu.php: 1 Time(s)
       /uuu.php: 1 Time(s)
       /v/index.php: 1 Time(s)
       /ver.php: 1 Time(s)
       /w.php: 1 Time(s)
       /wan.php: 1 Time(s)
       /wanan.php: 1 Time(s)
       /wb.php: 1 Time(s)
       /wc.php: 1 Time(s)
       /wcp.php: 1 Time(s)
       /web/phpMyAdmin/index.php: 1 Time(s)
       /webdav/: 1 Time(s)
       /webmail/imp/test.php: 1 Time(s)
       /webslee.php: 1 Time(s)
       /weixiao.php: 1 Time(s)
       /win.php: 1 Time(s)
       /win1.php: 1 Time(s)
       /wp-admins.php: 1 Time(s)
       /wp-config.php: 1 Time(s)
       /wp-content/plugins/portable-phpmyadmin/wp-pma-mod/index.php: 1 Time(s)
       /wpc.php: 1 Time(s)
       /wpo.php: 1 Time(s)
       /wshell.php: 1 Time(s)
       /wuwu11.php: 1 Time(s)
       /www/phpMyAdmin/index.php: 1 Time(s)
       /xampp/phpmyadmin/index.php: 1 Time(s)
       /xiao.php: 1 Time(s)
       /xiaodai.php: 1 Time(s)
       /xiaohei.php: 1 Time(s)
       /xiaoma.php: 1 Time(s)
       /xiaomae.php: 1 Time(s)
       /xiaomar.php: 1 Time(s)
       /xiaomo.php: 1 Time(s)
       /xiaoyu.php: 1 Time(s)
       /xp.php: 1 Time(s)
       /xshell.php: 1 Time(s)
       /xw.php: 1 Time(s)
       /xw1.php: 1 Time(s)
       /xxx.php: 1 Time(s)
       /xz.php: 1 Time(s)
       /yao.php: 1 Time(s)
       /yj.php: 1 Time(s)
       /yumo.php: 1 Time(s)
       /zshmindex.php: 1 Time(s)
       /zuo.php: 1 Time(s)
       /zuoindex.php: 1 Time(s)
       /zuos.php: 1 Time(s)
       /zuoshou.php: 1 Time(s)
       /zuoshss.php: 1 Time(s)
       /zuoss.php: 1 Time(s)
       /zxc0.php: 1 Time(s)
       /zxc2.php: 1 Time(s)
       /zzk.php: 1 Time(s)
    405 Method Not Allowed
       /: 1 Time(s)
       /blog/xmlrpc.php: 1 Time(s)
       133.130.126.119:43: 1 Time(s)
    408 Request Timeout
       null: 1 Time(s)
 ---------------------- httpd End -------------------------
 --------------------- SSHD Begin ------------------------
 Illegal users from:
    undef: 164 times
    23.226.82.76: 11 times
    37.49.225.93: 31 times
    88.214.26.15: 2 times
    95.78.163.55 (95x78x163x55.static-business.chel.ertelecom.ru): 11 times
    113.124.142.159: 1 time
    155.4.252.84 (h-252-84.A259.priv.bahnhof.se): 1 time
    156.220.114.220 (host-156.220.220.114-static.tedata.net): 1 time
    178.135.245.108: 1 time
    183.101.51.180: 1 time
    193.201.224.218: 213 times
    195.88.208.72 (208-72.static.spheral.ru): 4 times
    195.88.208.247 (208-247.static.spheral.ru): 4 times
    222.138.93.66 (hn.kd.ny.adsl): 1 time

こんなのが毎日記録されていて、さすがに慣れっこになってしまいます。

まだ固定電話の工事が残っているので、正式には移行が完了していませんが、ブラスト光に環境は置き換えていて、支給されているルーターは中国共産党の汚染問題が懸念されているファーウェイ製です。機種名は HG8045Qとなっています。ログインして項目を見ると色々な設定ができるようです。

その前にワイモバイルで契約したソフトバンク支給ルーターは、設定できる項目が少なく、かつ少し働くと勝手に眠りにつくらしいDNSで、スマホでネット情報を検索したくても繋がらなくて、日に何度もルーターをリセットしていたことを考えると嘘のような使い物にならない困り物でした。そしてクレームしたくても問合せ先が不明でした。

せめてDHCPサーバーの機能で、 DNSサーバーを指定する項目があれば、スマホからでも WiFiでインターネットが利用できるのですが、独自に立てているDNSサーバーを活かすこともできなくて、1つの回避策は WiFiを利用しないで有料の4G/3Gの専用線を常時利用することです。これってソフトバンクの政策でしょうか、詐欺的商法に思えます。

それを考えるとファーウェイのHG8045Q は、排除するIPアドレスも簡単に指定できるようになったので、とても使い勝手が良くなりました。そこで先程の話題で触れた異常に回数の多いアタックのIPアドレスをブロックしてみようかと考えました。

様子を見ながら少しずつアタック IPを追加してブロック

今回のアタック対策では、同一IPアドレスから複数回 22番ポートのSSHに対して行われているものを対象としてブロックしてみましたが、やはり効果はあるようです。ブログやプライベート写真公開へのアタックも同様に激減しているように思えます。

次の懸念材料は、スパムコメントの対策です。どんどん追加されるコメントで溢れ意味もわからないまま追われました。何のコメントを追加してくれたのかと思い、必死に日本語にしてみると何のことはない内容で、バイアグラが安いとか、ランジェリーが何だとかの宣伝をコメントに書き込んでいるだけでした。

機械的にスパムコメントを送りつけているだけの対策ですが、ネットを調べていると日本語の含まれないコメントをスパムとして排除する方法で、初期設定のままでも結果が満足だと紹介している情報に行き当たりました。

私の公開しているWebにスパム以外のコメントが付いた経験もなく、日本語以外のコメントが付けられること自体がありえないことのようなので、私に完璧に一致している対策のようです。

その対策用プラグインは、Throws SPAM Away と付けられたもので、導入すると管理用のメニューに設定変更の項目が追加され、色々な適用項目の選択ができるようになるようです。まずはそのまま変更無しで利用してみます。

スパムコメント対策を実施して、コメント受付を試す

そして最近の投稿にだけコメントの追加ができるように変更してみました。一応メモを蓄積するブログなので、コメントを受付けるのが筋かと思いますので、今後は様子を見ながら対策のカスタマイズをしたいと思います。

Linux 立上げで自動バックアップ

以前 systemd の実習を兼ねて、立上げ時に1度だけ実行させるサービスを組込んでいますが、その備忘録の整理と一部の拡張が必要なために修正と補足を追加してまとめます。

バックアップ先の選択が必要になり修正

普段使いのノートPC がデュアルブートで、時々裏の Windows10 を利用することがあります。普段は Linux の Ubuntu が立上がったまま稼働し利用しています。
そこで Linux が立上がった時に、Windows システム側の ntfs ファイルシステムの作業領域として更新される一部を自動的にバックアップしようと考えて、すでに組み込んで運用しています。
今回は、UPS バッテリーが追加された NET共有サーバーとしてラズパイ1B+を立上げていますが、これを主となるマスターとして位置付けて、今までのサーバーをシステムバックアップ用のスレーブとして共存することにしました。
ラズパイも接続される HDD が内部バスで高速なら、戸惑いなく RAID2 のミラーで利用するのですが、さすがに USB2.0 のインターフェース HDD でミラーを組むのは無理があると思い、2台のラズパイをマスターとスレーブで利用して、マスターが故障した場合にはスレーブに接続を切り替えることにしました。
データの同期については、夜中から明方にかけて毎日コピーすることで同期させます。
そのため、決め打ちだったバックアップ先のサーバーアドレスを柔軟に切り替えられる必要に迫られました。

以前まとめた内容を修正しながらシンプルに整理

実際に Windows を利用していたかは問題外として、Linux が起動した後に1度だけ ntfs の一部とサーバーのバックアップエリアの同期を取ります。その時に、バックアップを実行したタイムスタンプをバックアップエリア内に残しておくこととします。
パッケージ名: NoteStartUpRun で、指定する場所に実際の実行モジュール等を配置します。
ユニットファイル名: note-startup-1st.service が、サービスの性格を定義する仕様書の位置付けです。このサービス名をキーにして、実行結果のログ確認や動作状況の確認ができます。
サービス(ユニットファイル)の登録は、 /etc/systemd/system/note-startup-1st.service です。
サービスとして実際に実行するモジュールは、パッケージ名で指定するディレクトリ /opt/NoteStartUpRun/bin に集めます。
まずサービスの仕様書となるユニットファイルの作成ですが、一般ユーザーのホームで作成して、systemd のシステム領域にコピーします。

$ vi note-startup-1st.service
[Unit]
Description = Note Private AutoRun
After=network-online.target remote-fs.target nss-lookup.target
ConditionPathExists=/opt/NoteStartUpRun/bin
[Service]
ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh
Restart=no
Type=simple
[Install]
WantedBy=multi-user.target

作成したサービスを systemd 領域にコピーして、所有者とアクセス権の変更をします。

$ sudo cp note-startup-1st.service /etc/systemd/system
$ sudo chown root:root /etc/systemd/system/note-startup-1st.service
$ sudo chmod 644 /etc/systemd/system/note-startup-1st.service

サービスから起動するモジュールをシェルスクリプトで作成します。
これは単純にバックアップするスクリプトに制御を移しているだけです。後から引数の追加・変更等のカスタマイズが容易になると思われます。今回は、バックアップ先サーバーのIPアドレスを与えています。

$ vi note-stup-1st.sh
#!/bin/sh
exec /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup  "192.168.11.23"

パッケージをまとめるディレクトリを作成して、所有権とアクセス権の設定を行い、起動するスプリクトを配置します。

$ sudo mkdir -p /opt/NoteStartUpRun/bin
$ sudo chmod 755 /opt/NoteStartUpRun/bin
$ sudo cp note-stup-1st.sh /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/note-stup-1st.sh
$ sudo chmod 755 /opt/NoteStartUpRun/bin/note-stup-1st.sh

実際にバックアップを実行するスクリプトを作成します。

$ vi sunao-note_Windows-Documents-bkup
#!/bin/bash
server='192.168.11.23' # バックアップ先サーバー
test -z "$1" || server="$1"
echo "-- bkup to $server"
bkup_D="$server:/home/bkup/sunao-sp/sunao-Win-Doc/" # バックアップ先位置
mntS='/mnt/ntfs'
bkup_S="$mntS/Users/sunao/Documents/" # バックアップ元のベース
sleep 300 # 安定するように 5分待つ
/bin/mount $mntS
echo "実行タイムスタンプ `date`" > $bkup_S/TimeStamp.txt
/usr/bin/rsync -av --delete $bkup_S $bkup_D
/bin/umount $mntS

バックアップを実行するスクリプトを配置して、所有権とアクセス権を設定します。

$ sudo cp sunao-note_Windows-Documents-bkup /opt/NoteStartUpRun/bin
$ sudo chown root:root /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup
$ sudo chmod 755 /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup 

処理の流れとしては、サービスとして定義している note-startup-1st.service により note-stup-1st.sh が起動されます。その中で単純にバックアップ実行スクリプトの sunao-note_Windows-Documents-bkup を起動しています。


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

ここからは、systemd へのサービス(ユニットファイル)の登録と検証作業です。
ユニットファイル等を追加や変更した後には、必ず次のコマンド sudo systemctl daemon-reload を実行します。systemd への登録や登録内容の更新作業が必要になるようです。
そして一緒にステータスも確認しておきます。

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

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

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

$ sudo systemctl enable note-startup-1st.service
Created symlink from /etc/systemd/system/multi-user.target.wants/note-startup-1st.service to /etc/systemd/system/note-startup-1st.service.
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

ユニットファイルの定義内に、[ Install ] の WantedBy= で定義しているユニットにリンクが張られ、先ほどの /etc/systemd/system/note-startup-1st.service; の後の disabledenabled に変わっています。
これで再立ち上げで自動実行されるようになっているはずですが、その前にコマンドで起動して確認します。

systemd の手動起動の確認

ユニットファイル名を指定したコマンド sudo systemctl start note-startup-1st.service で起動できます。

$ sudo systemctl start note-startup-1st.service
$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabl
Active: active (running) since Sat 2019-02-09 20:40:50 JST; 19s ago
Main PID: 15710 (sunao-note_Wind)
Tasks: 2 (limit: 3787)
CGroup: /system.slice/note-startup-1st.service
├─15710 /bin/bash /opt/NoteStartUpRun/bin/sunao-note_Windows-Documents-bkup 192.168
└─15711 sleep 300
2月 09 20:40:50 MITA-NY40S systemd[1]: Started Note Private AutoRun.
2月 09 20:40:50 MITA-NY40S note-stup-1st.sh[15710]: -- bkup to 192.168.11.23
lines 1-11/11 (END)

起動されて ‘– bkup to 192.168.11.23′ のメッセージまでが書きだされて、’Active: active (running) since ….’ と表示して実行中なのがわかり、’└─15711 sleep 300′ で止まっているのが確認できます。
待ち時間の5分が経過したので、再び確認してみます。

$ sudo systemctl status note-startup-1st.service
● note-startup-1st.service - Note Private AutoRun
   Loaded: loaded (/etc/systemd/system/note-startup-1st.service; enabled; vendor preset: enabl
   Active: inactive (dead) since Sat 2019-02-09 20:45:57 JST; 24min ago
  Process: 15710 ExecStart=/opt/NoteStartUpRun/bin/note-stup-1st.sh (code=exited, status=0/SUC
 Main PID: 15710 (code=exited, status=0/SUCCESS)
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Version 2017.3.23 integrated FUSE 28
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mounted /dev/sda4 (Read-Write, label "Windows", NT
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,g
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mount options: rw,noexec,nosuid,nodev,user,allow_o
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Global ownership and permissions enforced, configu
 2月 09 20:45:55 MITA-NY40S note-stup-1st.sh[15710]: sending incremental file list
 2月 09 20:45:56 MITA-NY40S note-stup-1st.sh[15710]: TimeStamp.txt
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,75
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
lines 1-16/16 (END)

コマンドによる起動では問題なく実行されて、正常終了しているようです。
ログに書き出されている内容から、最初の status では sleep 300 で停止しているので、その時点までの echo メッセージが確認でき、次の status では、その後の ntfs ファイルのマウントや rsync コマンドによる転送や ntfs ファイルのアンマウントが記録されています。
もし更新ファイルのバックアップで、更新されていれば、ここにファイル名がリストされていると思います。
この処理は、起動されてバックアップ動作が終わると、毎回終了するので ‘Active: inactive (dead)’ と表示して、その後に終了した日時が記録されています。

一般ユーザーでジャーナルを確認

次にプログラムの出力ログを確認できる journalctl コマンドがあるので確認してみます。

$ journalctl -u note-startup-1st.service
 2月 09 20:40:50 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 09 20:40:50 MITA-NY40S note-stup-1st.sh[15710]: -- bkup to 192.168.11.23
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Version 2017.3.23 integrated FUSE 28
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mounted /dev/sda4 (Read-Write, label "Windows", NT
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,g
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Mount options: rw,noexec,nosuid,nodev,user,allow_o
 2月 09 20:45:51 MITA-NY40S ntfs-3g[15727]: Global ownership and permissions enforced, configu
 2月 09 20:45:55 MITA-NY40S note-stup-1st.sh[15710]: sending incremental file list
 2月 09 20:45:56 MITA-NY40S note-stup-1st.sh[15710]: TimeStamp.txt
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,75
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
lines 285-306/306 (END)

ジャーナルの表示では、status で分割されていたログ内容が続けて表示され、 20:40 で処理が始まり、時間が飛んで 20:45 から ntfs のマウントが始まっているので、5分待っているのが確認できます。

システム再起動による自動起動の確認

いよいよ待望の Linux の立上げによる自動起動の確認になります。ノートPCを再起動してジャーナルを確認します。

$ journalctl -u note-startup-1st.service
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: sent 4,207 bytes  received 61 bytes  948.44 bytes/s
 2月 09 20:45:57 MITA-NY40S note-stup-1st.sh[15710]: total size is 37,355,511  speedup is 8,752.46
 2月 09 20:45:57 MITA-NY40S ntfs-3g[15727]: Unmounting /dev/sda4 (Windows)
-- Reboot --
 2月 09 22:00:30 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 09 22:00:30 MITA-NY40S note-stup-1st.sh[1281]: -- bkup to 192.168.11.23
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Version 2017.3.23 integrated FUSE 28
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,use
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonemp
 2月 09 22:05:31 MITA-NY40S ntfs-3g[3854]: Global ownership and permissions enforced, configuration type
 2月 09 22:05:34 MITA-NY40S note-stup-1st.sh[1281]: sending incremental file list
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: TimeStamp.txt
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: sent 4,207 bytes  received 61 bytes  948.44 bytes/se
 2月 09 22:05:35 MITA-NY40S note-stup-1st.sh[1281]: total size is 37,355,511  speedup is 8,752.46
 2月 09 22:05:35 MITA-NY40S ntfs-3g[3854]: Unmounting /dev/sda4 (Windows)
lines 295-319/319 (END)

‘– Reboot –‘ の記録以降が新しく追加されたログですので、問題なく起動されて正常終了しているようです。


実際の立上げによるバックアップの注意点

順調にバックアップ動作が機能したわけではなく、色々な試行錯誤の結果として問題の解決ができています。
立上げ直後は、ネットワークの安定に問題があるらしくエラーになっていました。対策としては起動されてから 5分の待ち時間の追加で問題が解決しました。
次は ‘sleep 300’ の待ち時間が追加される前に出ていたエラーのジャーナル内容です。

$ journalctl -u note-startup-1st.service

-- Logs begin at 火 2018-01-09 16:24:34 JST, end at 火 2018-01-09 16:27:17 JST. --
 1月 09 16:25:12 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Version 2015.3.14AR.1 integrated FUSE 28
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,user
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonempty,relatime,default_permissi
 1月 09 16:25:14 MITA-NY40S ntfs-3g[1071]: Global ownership and permissions enforced, configuration type 7
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: ssh: connect to host 192.168.11.21 port 22: Network is unreachable
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync: connection unexpectedly closed (0 bytes received so far) [sender]
 1月 09 16:25:16 MITA-NY40S note-stup-1st.sh[1039]: rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
 1月 09 16:25:16 MITA-NY40S ntfs-3g[1071]: Unmounting /dev/sda4 (Windows)

それ以外のエラーとして、バックアップ先のサーバーを変更したらエラーになりました。
理由は root ユーザーで接続し転送していますが、 root から root での ssh での接続実績がなく、確認キー待ちになってエラーしていたようです。事前にサーバーへの接続確認をしておく必要があるようです。

-- Reboot --
 2月 07 23:09:20 MITA-NY40S systemd[1]: Started Note Private AutoRun.
 2月 07 23:09:20 MITA-NY40S note-stup-1st.sh[1330]: -- bkup to 192.168.11.23
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Version 2017.3.23 integrated FUSE 28
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Mounted /dev/sda4 (Read-Write, label "Windows", NTFS 3.1)
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Cmdline options: rw,noexec,nosuid,nodev,uid=1000,gid=1000,use
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Mount options: rw,noexec,nosuid,nodev,user,allow_other,nonemp
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Global ownership and permissions enforced, configuration type
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: Host key verification failed.
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: rsync: connection unexpectedly closed (0 bytes recei
 2月 07 23:14:21 MITA-NY40S note-stup-1st.sh[1330]: rsync error: error in rsync protocol data stream (co
 2月 07 23:14:21 MITA-NY40S ntfs-3g[2633]: Unmounting /dev/sda4 (Windows)

『紅はるか』で焼き芋

久し振りに今回は焼き芋について、一時期焼き芋にはまり、色々な品種の焼き芋を自分で作ってましたが、最近ではしっとり系の紅はるかが主流になりました。

ほとんどが茨城県産のようです。昔からの焼き芋屋さん御用達の紅あずまのホクホクも欲しくなることがありますが、水飴状の透明なねっとりとした汁を吹き出した紅はるかのとろりとした甘い焼き芋は絶品です。

最近は話題として取り上げませんでしたが、四季を通して、冬以外にも焼くのは多いです。

長く奉公してくれていた電子レンジが老衰でお暇したので、ピチピチした新顔を雇いました。この機能に焼きいものメニューも書かれていて、実際に使って焼いてみました。家庭でもそこそこに美味しく焼けることが分かりました。

でもじっくり時間を掛けて、焼け具合を見ながら少しずつ回して、香りを確かめながら焼くフライパンの焼き芋から離れることができませんでした。焼く時間は、1時間位を目安としています。

一般的なガスレンジで、フライパンの底に当たる温度センサーで勝手に弱くなったり戻ったりしながらフライパンの底を加熱します。安全機能が働くようで、焼く途中で何度か自動消火してしまいますが、焼く芋の回転もありその都度点火しています。

焼き始めは、芋の全体に熱が回るように少量の水を底に入れ蓋をして焼き始めます。しばらくすると入れた水は蒸発して無くなります。その後も蓋の裏に水滴が多数付きますが、熱せられた芋から吹き出す水分で、時間と共に痩せ細っていきます。

写真の最初は、焼き始めて30分位経過した頃でしょうか、2枚目は芋からの水分が蓋の下に付いている写真、水分が貯まると中がぐちゃぐちゃになるので時々蓋に付いた水分は捨てています。最後が1時間後の頃で、水分が抜けて痩せ細っている芋です。

焼いているときには、常時フライパンに耐熱ガラスの蓋をしていて、水蒸気の出具合を確認できます。そして、1時間も火を通すと水分が抜けて皮がシワになってきます。

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

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

仕掛り中のラズパイ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%増のメールが届きます。気休めですがメールが送られると少し安心できます。

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