放置していたデスクトップPC

色々と時間の成約があって、手を掛けてやれなかったデスクトップが有ったんですが、何とか起動しようと試みて、大変な状況になっていたことを知りました。

放置していた理由

何で使わなかったかといえば、電源スイッチを押しても反応がなくて電源が入れられなかったことに問題があったのですが、何度もさらには何十回も挑戦すれば入ることもありました。
何としても立ち上げたいと考えた時には、別のPCから俗に言うマジックパケットを発行してネット越しに起動していました。
別に起動した機器からの立上げになり、本当に必要とした時だけの利用でした。

そんな状況では利用しようとの考えもしぼみがちで、当然のこと利用機会が遠ざかっていくことになりました。
起動しないのは電源スイッチの問題だとの認識があったので、時間が自由になっている現在、復旧させて利用しようと考えました。

再利用しようと思った理由

メモリ搭載が贅沢な 12GB

放置するのがもったいないのは、実はメモリを12GBと贅沢に搭載していて遅いプロセッサながら、内蔵ディスクもRAID構成でそこそこ動く代物でした。

電源ピンをショート

そして最初の対策が筐体を開けて、電源スイッチの繋がるピンをショートしたのですが、CPUの冷却ファンが回り始めて3秒程度で止まってしまいます。この時にはキーボードとマウスは接続しているもののモニタの接続をしていませんでした。

すぐに止まるのはこれが原因かと考えて、VGAコネクタやHDMIコネクタでモニタを接続してみたのですが、ここには関係ないようで変化は見られませんでした。

電源スイッチを仮設して操作

その後、電源スイッチのピンに単体でオンオフできるスイッチを取付けて操作できるように改善して試すも、同様に3秒程度で止まります。理由がわからないのでBIOSのメモリクリアも試しました。後々これが別の問題を起こしていたかもしれません。

あまり気にしたことがなかったのですが、電源スイッチってオンしっぱなしではなく、短期間にオンで、その後はオフを継続するものなのでしょうか、そんなシーケンスでスイッチを操作すると電源が入って立ち上がるようになりました。

と言ってもBIOS メモリクリアしたのが悪かったようで、日付は2002年頃の状態で色々な設定が飛んでしまったようで、内蔵メモリの不具合を示すランプも点灯したり、色々な問題対処も必要になりました。

無知というのは恐ろしいものです

考えれば、電源の強制停止には、電源スイッチを5秒間押しっぱなしにするのが定説ですので、電源スイッチは少しのオンで電源が入り少しのオンで電源が停止するのは当たり前ですよね、よくよく考えてみれば当然です。

そうこうしていると起動を示すバナーがモニター上に流れて、GRUBの起動するシステムを選択するメニューが表示されるところまでは進みました。しかし、どれを選択してもカーネルのパニックを表示してすぐに止まります。

BIOS クリアでディスクの順番が変化したらしい

起動の始めに [del] キーを連打して BIOS の設定画面を表示して、ディスクの認識する順番を入替えても、 grub rescue > と入力待ちになったり、多少の変化はあるもののどれも正常な起動までは行われませんでした。

諦めて、再インストールを決断

仕方無く、レスキュー用のメディアも検討したのですが、新しく OS をインストールしてみることにしました。候補に上げたのが、普段使い慣れている Ubuntu です。 USBブート用の USBメモリを持っていたのですが、そこから読み込んで立ち上げができなかったので、 Ubuntu 18.04 LTD 日本語 Remix をダウンロードして DVD メディアに焼きました。

四苦八苦の復旧作業

まずは、RAIDの復旧を試みる

ライブメディアとして起動した Ubuntu

以前稼働していた頃には、ソフトウェアRAIDの設定で集めたデータも格納されていて、Ububtu の OS も RAID1 で問題なく動作していました。気持ち的には復旧させたいとの願いも心の底にあって、まずは DVDメディアで起動して、モジュールのアップデート、そしてソフトRAIDのmdadmのインストールを行いました。
mdadmが入っただけではRAID設定のディスクを認識できないようで、各モジュールの最新への更新が完了した頃には、元からあった RAIDの構成が勝手に認識されていました。

ライブメディアから RAID への GRUB 設定は無理

インストール前に、システムが入るエリアのマウント位置の ‘/’ と ‘/boot’ を RAID1 に設定したのですが、最終的なブートで使用される GRUB のインストールで障害になりました。

RAID の中にパーティションを構成できるらしい

興味深いのは、ディスクへのインストーラが RAID定義したファイルをあたかも LVM のような1つのディスクのように認識していて、その中にパーティションを分割するように振る舞うことです。昔ソフトRAIDを使用していた頃の感覚からすると別世界のような感覚です。

たまたま GRUB のインストールには失敗したのですが、そこまでのシステムのインストール状況も気になって、 /dev/md0 として作成し、その中に /dev/md0p1 と /dev/md0p2 がそれぞれ ‘/boot’ と ‘/’ に対応していました。
誤って mount に /dev/md0 を指定したらマウント対象ではないようなエラーが吐き出され失敗しました。
そして、/dev/md0p1 と /dev/md0p2 の mount では、問題なくマウントできたようです。内容も思っていた内容で、確かにパーティション分割されているようです。

GRUB を修復する grub-rescue

ブートの GRUB を修復できるソフトがあるらしく、それは grub-rescue と呼ばれ公開されているようで、インストールをネット公開情報から試みましたが、日本語Remixの環境ではインストール自体ができませんでした。
そこで、単体でメディアから起動して動作する grub-rescue をネットから入手して試しましたが、結果的に自動での修復は無理でした。これは Ubuntu 17.10 だったかな? の中にインストールされている単体動作の専用ツールです。
自動修復は無理でしたが、でもこのツールは解析の履歴が事細かく記録されているようで、http://paste.ubuntu.com/p/…. に残されて後からゆっくりと確認できることです。

他にも、’/boot’ を外出しにして、’/’ を RAID エリアにしても、GRUB のインストールはできるのですが、やはり起動はできないようです。
何日にも及ぶほど時間を掛けたのですが、インストール先に RAIDエリアは利用できないとの結論になりました。
そう言えば、昔々公開サーバーに バッファローのネット共有ディスクを改造して、Debian をインストールして RAID にするのに、最初は普通に入れてから片側を半端な RAID に定義して、そっちに全てをコピーしてから、元のディスクを RAID に追加してリビルドさせて、最終的に RAID になったシステムが完成したような気がします。

デスクトップ用メディアでは少なくも RAID構成は無理らしい

最近のインストーラも RAID は想定外なので、正規のシステムが立ち上がる前に利用される一時的なシステムに、RAIDを認識できる部分が組み込まれていないのだろうと思います。

したがって最初は単純にインストールして、徐々にカスタマイズしないと RAID の組込みはできないということのようです。

単純にデスクトップをインストール

少なくもデスクトップ用で RAID は無理

仕切り直して、単純に Ubuntu 18.04 LTS 日本語Remix を入れるところから始めました。時間がかかったけど想定した位置に入れ込むことができました。

/dev/sda1 — ‘/boot’
/dev/sda3 — ‘/’

インストールで、画面枠からはみ出て選択ができない

これも簡単ではなく、苦労したのは既に作成されているパーティション分割に合わせてマウントポイントを指定するのですが、モニタに利用したテレビ画面から作業を選択するボタンが表示枠の範囲外になってしまい、スクロールもできず選択不能です。
タブキーとエンターキーを画面の想像で操作するのですが、何度も取り消されてしまい、振り出しに戻されての繰り返しで、先に進む方法に辿り着けません。

やっとインストールされた初期の状態で立ち上がりました。その後のパッチ類を全て適用して、やっとスタート台に立った状態です。

単純なインストール後に、RAIDソフトを追加

その後、ソフトRAID の mdadm、ソフト検索のため aptitude 、エディタとして vim、リモートログインに openssh-server をインストールしました。
元々のデータが収まっていた 500GB 程度の RAID1 の内容を確認すると ‘/home’ の内容のようなのを確認できたので、 /etc/fstab ファイルを修正して ‘/home’ にマウントされるように定義して、reboot で正しくマウントされて立ち上がるのを確認しました。

システムを RAID 構成にと考え、結局挫折

しばらく放置したPCを復旧させるって難題ですね。以前はルートのシステム部分もRAID1で構成されていたので、その状態に戻したくて四苦八苦して悪あがきをしたのですが、結果は惨敗でした。記憶では、RAID1を片肺にしてコピーしてから /etc/fstab や /boot/grub/grub.cfg を書き換えて片肺の RAID1 をシステムに無理やり組込んでいたように覚えてます。

最近の GRUB の設定方法が理解できていない

最近の作法としては、grub.cfg は update-grub のようなツールで生成されるもののようで、強制的に書き換えて機能するものなのかも理解していません。生成されている grub.cfg を見ると該当するディスクは基本的に UUID で指定されているようで、これをどのように引っ張ってきたのかも理解できていません。

何かの定義を変更すると立ち上げ対象のディスクが置き換えられるのかと思い、あちこち調べたのですが思い当たるものには到達できませんでした。強制的に grub.cfg を書き換えて仮に立ち上げてから RAID1 を正常に整備してから update-grub を実行して RAID1 にシステムを入れた状態で、正常に立上がるのかは検証できていません。

生成された grub.cfg を一時的にカスタマイズできるの??

強制的に grub.cfg を書き換えて立上がるものなのかもわかっていません。時間を作って試してみたいと思います。

復旧しようと考えた PC のマザーボードですが、新しいものではなく、かと言ってディスクに IDE インターフェースでマスターとスレーブの4台が組み込まれるほどの古さでもない微妙な物です。 プロセッサは、’AMD Athlon(tm) II X4 605e Processor’ で、 DD3 メモリが、12GB 搭載されているので再利用できれば程度の考えです。

ただ、IDE のコネクタも1つあり、当時はSATAインターフェースの CD-ROM がなくて、そのためのコネクタだったような気がします。
SATS1 / SATA2 / SATA3 / IDE / SATA5 / SATA6 と続きます。昔の IDE 接続だった頃のディスクの場合、セカンダリーのスレーブに CD-ROM を繋いでいた名残にも見えます。

昔のディスクは順番が接続で固定された

昔のシステムは単純で、ディスクの装着位置で順番が決まっていたので、UUID でディスクを特定する必要がなかったのでしょうね、今復旧している PC も立上がるタイミングや BIOS の定義で順番がコロコロと置き換わるようです。
さすがに動作しながら順番が異なることはなさそうな気もしますが、でも USB-HDD を挿入したタイミングで処理中だった物が、対象機器を見失ったような混乱で、障害で停止したのかと思う動きもあって気になりました。

あまりに古いPCなので、レストアを考えたい

とりあえず電源がオンオフできる筐体

筐体もパワースイッチが入らなくなるような状況で、整形されたプラスチック類も加水分解状態の物も目に付くような状況から検討することにしました。マザーボードは、サイズが少し大きめで ATX 、電源は昔ではちょっと大きめな高速なプロセッサに対応した容量の物でした。そのまま再利用できそうなので筐体だけ入れ替えようと探しました。

今のマザーボードが収まるのは ATX の筐体

筐体の価格も高価なものから低価格な庶民的なものまでピンキリのようで、フルの ATX なので小型のものは望めませんでしたが、Amazon で手頃な中国製を購入しました。ちょっと派手で、片側が透明なプラスチックのミドルタワー型です。製品名は、 ‘Thermaltake Versa H26 Black/w casefan’ とかで、送料サービスで 4,163円でした。

今のマザーボードの規格に合っている筐体

久し振りに自作用の筐体を入手しましたが、価格の割に良くできていてファンも 2個装着済で、コネクタをマザーボードに挿すだけでした。その前に使っていた古い筐体にもファンは取付けられていましたが、ディスク等に供給する電源コネクターに接続するようになっていて、結局使わないままでした。

最近の自作筐体って人に見せるためにあるの??

購入した筐体は派手な作りのようで、筐体正面のファンにはブルーのLEDが付けられていて、筐体自体も風通しが良くなるメッシュが随所に組み込まれていて、埃除去のフィルターも簡単に取り外しできる構造です。
筐体の片面が透明なプラスチックで中がスケスケなため、夜になるとギンギラギンでまばゆい状態です。派手過ぎてちょっと自分の好みではないけど、価格が安いですのでこれもオーケーでしょう。
配線も裏にまとめやすく作られていて、見える透明なプラスチック側は綺麗に見せられるように、裏からの配線が近くから表側に導き出せるよう随所に穴が作られています。

筐体前面の電源スイッチの並びには、マイクやスピーカー等のオーディオ系コネクタやUSB2.0✕2 や USB3.0✕2 のコネクタもあり、USB2.0✕2 とオーディオ系は、そのままマザーボード上のコネクタに挿入できましたが、USB3.0✕2 には挿入できる機能がありません。
使えないコネクタが前面にあるのもちょっと気になるため、乗りかかった船なので、増設用ボードの手配もしました。ただ、Amazon経由で台湾のメーカーらしく、船便でゆっくり届くと思われます。
しばらく後になっての取付けですが、安いのでこれもありかと思います。

見える筐体なので、綺麗に収めようと思ったら

廃棄した古い筐体の方には、2.5インチで 1TBのディスクが 2台あり、これが RAID1 の構成に利用されていましたが、何故か 3.5インチベイの片側に寄せた形でネジ止めされていました。組んだ時が昔なのですっかり記憶から抜けています。

他に 2.5インチのディスクを 2台づつ装着でき、外から簡単に挿入したり、抜き出したりできるケースがあるにも関わらず、使わずに単体で 3.5インチベイにネジ止めしていたので不思議に思っていたのですが、取り付けようとして理由がわかりました。
ディスクの厚さが 13mmあって、9.5mm厚に対応しているケースには入れられなかったようです。当時は 1TBクラスの 2.5インチディスクは厚くないと製造できなかったようです。

筐体の最下部に簡易トレイ

とりあえず新しく購入した筐体にも、電源の置かれた最下部の前側には、ペラペラのプラスチックのトレイに入れて SSD やディスクの設置が可能です。
最近は価格も下がり普及してきた SSD を入れるために考えられたと思われる場所です。
そこに厚さが 13mm の 2.5インチのシステムディスクを 2台とりあえず入れることにしました。

収まるのかは心配ですがマウンターを購入

穴位置のサイズが公表されて無く、写真から 13mm 厚の2.5インチのディスク2台を収納できるようにも見える 3.5インチ用のマウンターも購入しました。
本当に厚い2台装着できるのかは心配です。賭けですね、無駄な買い物になってしまうかもしれません。

リモートで利用するサーバーとしてカスタマイズ

デスクトップとしてインストールしていますが、リモートからの電源オンオフも含めて、リモート操作を想定したサーバーとしての利用なので、これからのカスタマイズも含めてまだまだ楽しめそうです。

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

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

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

旭川市からの便り

昨年は厚真の大地震が発生した頃から長期滞在していたキャンプ場である旭川市21世紀の森 運営協議会からの便りが届きました。

過去にも新しく作られたパンフレットとか受取った事はありました。外側の封筒は過去に受取った物と似たイメージでしたが、中に入っていた物が少し異なりました。

雪の中にあるキャンプ場のカラー写真を配置した冬景色の1ページの1枚と、ふるさと納税を説明している両面印刷の1枚が入っていました。

あさひかわ応援寄附金(ふるさと納税)とタイトルが付けられています。

実は昨年アンケートを渡されていて、キャンプ場も有料に切替える検討が行われている事を知っていました。そのため、その事を伝える内容かと思って封を切りました。

今回はどこにもその事には触れていないので、まだ保留になっているのでしょうか。キャンプ場の有料/無料にかかわらずふるさとのフレーズには弱いです。

何しろ夏から秋にかけては、毎年のように何度も長期滞在して、居住地のような生活を送っていた身としては、多少の寄付では恩恵を賄いきれないです。

とは言っても年金生活者で、働きも少なく、寄付による減税の効果も期待できないので、気持ちだけの金額でご勘弁願いましょうか。

太っ腹な旭川市には本当にお世話になりっぱなしです。キャンプ場、森の湯、旭山動物園、科学館サイパルと、いつも有難う御座います。

WWWアタックをカウント

設置時からずっと気になるのは、セキュリティーホールを探るアタックが多いことです。

ポート22を攻めるSSHは、ごく一般的な基本の攻撃なので驚きはしませんが、ここで公開しているこのブログは標準でDBを使用するので、更新したり セットアップしたりする操作が想定できるセキュリティホール全ての事を、端から試すアタックを受け続けています。

暫く長期で旅行の予定は無いので、家の外からの操作もなく、あまりにウザいアタックなので、ポート22を無効にしています。更に、写真の公開については、特に外部からの情報を受け付けない仕様なので問題外です。

問題はこのブログへのアタック

問題はこのブログへのアタックです。毎日のLogwatchのレポートに多数のエラー404が記録されていて、同じIPアドレスから呆れるくらいの数の悪意な接続がリストされています。

どのような内容かと言うと、セットアップしたり初期化する時に、予め使用が考えられそうな操作やコマンドが全て試されているような状況です。

毎日作成されるレポートには、ログから概要がリストされていますが、IPアドレス単位で回数のカウントまでをまとめたレポートまではありません。そこでアクセスログから集計してみました。

毎日ではウザいので、1週間単位に集計して、テキスト形式で共有サーバーのフォルダに自動蓄積するようにしました。そこから転記して覚書として、ここにまとめてみようかと思います。

 回数 :  アドレス
108 : 18.220.66.54 ec2-18-220-66-54.us-east-2.compute.amazonaws.com. アメリカ
410 : 59.36.169.180 180.169.36.59.broad.dg.gd.dynamic.163data.com.cn. 中国 450 : 61.160.215.38 逆引き 登録なし 中国
108 : 66.24.164.33 cpe-66-24-164-33.stny.res.rr.com. アメリカ
436 : 79.8.64.93 host93-64-static.8-79-b.business.telecomitalia.it. イタリア
108 : 79.120.133.202 逆引き 登録なし ハンガリー
108 : 83.28.183.131 bkp131.neoplus.adsl.tpnet.pl. ポーランド
437 : 94.191.10.62 逆引き 登録なし 中国
  436 : 94.191.71.240 逆引き 登録なし 中国
227 : 103.27.61.244 逆引き 登録なし ベトナム
450 : 103.123.161.50 逆引き 登録なし 中国 108 : 104.34.26.102 cpe-104-34-161-50.socal.res.rr.com. アメリカ
420 : 114.116.94.28 ecs-114-116-94-28.compute.hwclouds-dns.com. 中国
410 : 116.193.155.7 逆引き タイムアウト 中国 436 : 118.89.57.149 逆引き 登録なし 中国
431 : 122.114.186.8 逆引き 登録なし 中国
396 : 122.114.240.241 逆引き 登録なし 中国 410 : 123.207.237.141 逆引き 登録なし 中国
467 : 124.156.167.231 逆引き 登録なし シンガポール
478 : 125.27.179.27 node-zdn.pool-125-27.dynamic.totbroadband.com. タイ 436 : 132.232.44.27 逆引き 登録なし 中国
465 : 132.232.200.165 逆引き 登録なし 中国
416 : 132.232.211.14 逆引き 登録なし 中国 408 : 134.175.30.72 逆引き 登録なし 中国 409 : 139.199.23.198 逆引き 登録なし 中国 405 : 139.199.125.47 逆引き 登録なし 中国
397 : 146.71.56.226 逆引き 登録なし アメリカ
436 : 148.70.130.190 逆引き 登録なし 中国
  449 : 159.192.220.60 逆引き 登録なし タイ
418 : 160.19.49.95 逆引き 登録なし 香港 108 : 182.164.172.192 182-164-172-192f1.shg1.eonet.ne.jp. 日本
416 : 188.131.128.163 逆引き 登録なし 中国 396 : 188.131.181.62 逆引き 登録なし 中国
450 : 188.131.204.15 逆引き 登録なし 中国
108 : 188.192.161.111 ipbcc0a16f.dynamic.kabel-deutschland.de. ドイツ
228 : 192.185.82.119 xenon.websitewelcome.com.
108 : 196.201.197.69 逆引き 登録なし ジブチ
450 : 201.117.251.50 customer-201-117-251-50.uninet-ide.com.mx. メキシコ
420 : 210.89.52.233 Sublime-52-233.pacenet-india.com. インド
437 : 218.161.75.200 218-161-75-200.HINET-IP.hinet.net. 台湾
381 : 220.135.141.52 220-135-141-52.HINET-IP.hinet.net. 台湾
114 : 220.146.236.244 nttkyo699244.tkyo.nt.ngn.ppp.infoweb.ne.jp. 日本
397 : 222.179.152.117 逆引き 登録なし 中国
478 : 222.186.136.116 逆引き 登録なし 中国
450 : 222.192.60.40 逆引き 登録なし 中国
200 : 222.255.46.171 static.vnpt.vn. ベトナム
205 : 2a02:4780:bad:3:fced:1ff:fe03:166 逆引き 登録なし LT:Lithuania

アタックするIPアドレスは、まんべんなく分散しているようです。間隔の狭いアクセスは、1秒に10回程度の機械的な接続を試みています。普通に人が操作しても数秒も掛かる操作を連打されている感じでしょうか。

元々が普通に遅いサーバーなので、処理能力の50倍や100倍の強制操作となっていて、レスポンスに時間がかかるのは当然のようです。

アメリカの amazon aws とかありますけど、クラウドの貸出サーバーでしょうか、アタックするために借りているのかなぁ…、汚染された結果なのか、脆弱な放置システムの検索のために公務で利用しているとか????

日本国内からもアタックがありました。正規に逆引き登録もされているシステムから、回数は 100回程度で少ないのですが記録されています。

リスト更新日 : 2019-04-19

ファイルシステムの検査・修復 fsck

一般的な検査と修復に利用する fsck コマンドがありますが、その利用で badblocks の機能を伴って、不良セクタをリカバリする機能があることを知りました。

その機能の学習を兼ねて、不良ディスクとして保留していたハードディスクを使って実行してみました。

$ sudo fsck -vcck /dev/sdb2
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern: done                                                 
system: Updating bad block inode.
Pass 1: Checking iノードs, blocks, and sizes
Pass 2: Checking ディレクトリ structure
Pass 3: Checking ディレクトリ connectivity
Pass 4: Checking reference counts
Pass 5: Checking グループ summary information

system: ***** ファイルシステムは変更されました *****

          11 inodes used (0.00%, out of 2621440)
           0 non-contiguous files (0.0%)
           0 non-contiguous directories (0.0%)
             # of inodes with ind/dind/tind blocks: 0/0/0
             Extent depth histogram: 3
      242382 blocks used (2.31%, out of 10485760)
           0 bad blocks
           1 large file

           0 regular files
           2 directories
           0 character device files
           0 block device files
           0 fifos
           0 links
           0 symbolic links (0 fast symbolic links)
           0 sockets
------------
           2 files

前述が実行結果です。

時間は長く掛かりましたが、以前頻繁にエラーを吐き出していたパーティション位置に対して非破壊型の読み書きテストだとのことです。

このパーティションは、mkfs.ext4 で1度ファイルを生成したのですが、気になるメッセージが最終行にあって、再び mkfs.ext4 で書き直した直後に、前述の fsck を実行しています。

途中に『system: ファイルシステムは変更されました 』の文脈がありますが、不良箇所があって一部が変更されたということでしょうか。初めての実行なので詳細が分かりません。

次にパーティションをファイルに生成した時の1度目と、気になって再実行した2度目のメッセージについて次に示します。

$ sudo mkfs.ext4 -L system /dev/sdb2
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 10485760 4k blocks and 2621440 inodes
Filesystem UUID: 3cf7fb03-0d7d-491b-8d6b-8265e2798161
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information:        
Warning, had trouble writing out superblocks.
$ sudo mkfs.ext4 -L system /dev/sdb2
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 10485760 4k blocks and 2621440 inodes
Filesystem UUID: 789bf9e8-5e1d-4dbc-ae81-a8d25a02529b
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done   

元々不良ディスクとして、使わずに置かれていたディスクなので、多少なりとも利用できれば学習も兼ねて儲けものかもしれません。

障害発生のハードディスク

数年前にラズパイに搭載していたハードディスクがありました。ラズパイ発売当初の頃、今となってはかなり昔の話になります。ラズパイの使い方は今も変わらないと思いますが、SD あるいは micro SD にシステムを入れて立ち上げ利用します。

その当時、たまたま手持ちの SD 類が低品質だったのか、ラズパイとの相性の問題なのかは今でも納得できないでいますが、使い始めてこれからと思う所まで作業を進めた頃に必ずシステムが飛んでしまい、操作や定義した内容が成果として残らないことが多々ありました。

そのようなこともあり、ラズパイの初期利用の頃からOSの raspbian を最初のboot パーティションを除きハードディスクのパーティションに移して運用していました。それ以降はずっと安定してラズパイを利用していたのですが、ある時1台のラズパイが不安定になり、原因がラズパイのハード本体か、ハードディスクか、SD のブートなのかと疑い、多分ハードディスクだろうとの結論になりました。

当時ハードディスクの確認方法に、どのようなものがあるのか、調べたものの時間もなく『不良』と張り紙して捨てずに残しておきました。

そのハードディスクを見付けて、そう言えば保留で放置していたなと思い出して、調べてみることにしました。

$ sudo fdisk /dev/sdb

fdisk (util-linux 2.31.1) へようこそ。                                                        
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。


コマンド (m でヘルプ): p
ディスク /dev/sdb: 931.5 GiB, 1000204886016 バイト, 1953525168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 33553920 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xab9fb81c

デバイス   起動   開始位置   最後から     セクタ サイズ Id タイプ
/dev/sdb1             2048    2099199    2097152     1G  b W95 FAT32
/dev/sdb2          2099200   44042239   41943040    20G 83 Linux
/dev/sdb3         44042240   48236543    4194304     2G 82 Linux スワップ / Solaris
/dev/sdb4         48236544 1953525167 1905288624 908.5G  5 拡張領域
/dev/sdb5         48238592  635441151  587202560   280G 83 Linux
/dev/sdb6        635443200 1222645759  587202560   280G 83 Linux
/dev/sdb7       1222647808 1953525167  730877360 348.5G 83 Linux

コマンド (m でヘルプ): q

$ sudo blkid
  --
     途中省略
              --
/dev/sdb1: UUID="7C91-A3DA" TYPE="vfat" PARTUUID="ab9fb81c-01"
/dev/sdb2: UUID="83670319-849c-459b-84aa-fe7f3f776145" TYPE="ext4" PARTUUID="ab9fb81c-02"
/dev/sdb3: UUID="c3a4d72a-7866-4ffe-a864-5a3f24fb889f" TYPE="swap" PARTUUID="ab9fb81c-03"
/dev/sdb5: LABEL="home" UUID="35786e95-ea9a-4975-aa39-c10ba1d47e3f" TYPE="ext4" PARTUUID="ab9fb81c-05"
/dev/sdb6: LABEL="data" UUID="217555fc-a5d3-4cd8-9702-06f1b5c77f6d" TYPE="ext4" PARTUUID="ab9fb81c-06"
/dev/sdb7: LABEL="bkup" UUID="8aec4e2f-e576-4b73-9aa1-38b905c68dc1" TYPE="ext4" PARTUUID="ab9fb81c-07"

$ sudo fsck /dev/sdb1
fsck from util-linux 2.31.1
fsck.fat 4.1 (2017-01-24)
/dev/sdb1: 0 files, 1/261629 clusters

$ sudo fsck /dev/sdb2
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
/dev/sdb2: clean, 15/1310720 files, 285254/5242880 blocks

$ sudo fsck /dev/sdb5
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
home: clean, 953/18350080 files, 1202987/73400320 blocks

$ sudo fsck /dev/sdb6
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
data: clean, 703/18350080 files, 1345817/73400320 blocks

$ sudo fsck /dev/sdb7
fsck from util-linux 2.31.1
e2fsck 1.44.1 (24-Mar-2018)
bkup: clean, 11/22847488 files, 1483745/91359670 blocks

前述のように、一般的なパラメータ無しで fsck コマンドを実行しても何のエラーも表示されません。しかし、システムを稼働させるとシステムダウンを起こすほどの不安定な動きをします。

昔は、色々な物が手作りのようで、低レベルフォーマットの話も聞いたことがありますが、時代は変わり、現在は一般利用者が利用できるレベルでもないようです。調べるとディスクドライブ全域にスペースを書き込む方法については見つかりました。

昔の記事の中には、使えるものがメーカーで異なっていたとか、ガードが掛からずスーパーブロックまで消去されてしまい大問題になったらしいた記事等もありました。

なお、Linux システムで、 /dev/sdb ドライブに ‘0’ を充填するコマンドは次のコマンドです。

# dd if=/dev/zero of=/dev/sdb bs=1M

ディスクの修復等をキーワードで検索すると、『Linuxでディスクのエラーや不良セクタのチェックと修正をする方法』を見付けました。

その記事では、 fdisk えふでぃすく | hdparm えいちでぃーぱーむ | badblocks ばっどぶろっくす | e2fsck いーつーえふえすしーけー | fsck えふえすしーけー について記述されていました。

私が使ったことのない初めて知るようなコマンドも説明してくれています。 hdparm は昔何かの講習会で聞いたような気もしますが、すでに記憶からは飛んでいました。

ハードディスクの情報を取得

その中で、ハードディスクのモデルを表示するコマンドを見付けましたが、試してみると残念ながら再現しませんでした。コマンドが変わったのか、ディスクの情報の持たせ方が変わったのか、詳細は分かりませんが時代の変化なのかもしれません。

$ sudo hdparm -i /dev/sdb1 |fgrep Model
 Model=Hitachi HDS5C3020ALA632, FwRev=ML6OA5C0, SerialNo=ZZZZZZZZZZZZZZ

前述が説明のサンプルですが、実際の結果が次になります。

$ sudo hdparm -i /dev/sdb |fgrep Model
 HDIO_GET_IDENTITY failed: Invalid argument

hdparm のオプションを -I に変えて実行すると、色々な情報が表示されるので、何かが変わったのでしょうね。

$ sudo hdparm -I /dev/sdb

/dev/sdb:

ATA device, with non-removable media
        Model Number:       ST1000LM024 HN-M101MBB                  
        Serial Number:      S30EJ9GF304434      
        Firmware Revision:  2BA30001
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0
Standards:
        Used: unknown (minor revision code 0x0028) 
        Supported: 8 7 6 5 
        Likely used: 8
Configuration:
        Logical         max     current
        cylinders       16383   16383
        heads           16      16
        sectors/track   63      63
        --
        CHS current addressable sectors:    16514064
        LBA    user addressable sectors:   268435455
        LBA48  user addressable sectors:  1953525168
        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes
        Logical Sector-0 offset:                  0 bytes
        device size with M = 1024*1024:      953869 MBytes
        device size with M = 1000*1000:     1000204 MBytes (1000 GB)
        cache/buffer size  = 16384 KBytes
        Form Factor: 2.5 inch
        Nominal Media Rotation Rate: 5400
Capabilities:
        LBA, IORDY(can be disabled)
        Queue depth: 32
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = ?
        Advanced power management level: disabled
        Recommended acoustic management value: 254, current value: 0
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4 
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
           *    SMART feature set
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
                Advanced Power Management feature set
                Power-Up In Standby feature set
           *    SET_FEATURES required to spinup after power up
                SET_MAX security extension
                Automatic Acoustic Management feature set
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    SMART error logging
           *    SMART self-test
           *    General Purpose Logging feature set
           *    64-bit World wide name
           *    IDLE_IMMEDIATE with UNLOAD
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Gen3 signaling speed (6.0Gb/s)
           *    Native Command Queueing (NCQ)
           *    Phy event counters
           *    Idle-Unload when NCQ is active
           *    NCQ priority information
                DMA Setup Auto-Activate optimization
                Device-initiated interface power management
           *    Software settings preservation
           *    SMART Command Transport (SCT) feature set
           *    SCT Read/Write Long (AC1), obsolete
           *    SCT Write Same (AC2)
           *    SCT Error Recovery Control (AC3)
           *    SCT Features Control (AC4)
           *    SCT Data Tables (AC5)
Security: 
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        194min for SECURITY ERASE UNIT. 194min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 50004cf20ca73d80
        NAA             : 5
        IEEE OUI        : 0004cf
        Unique ID       : 20ca73d80
Checksum: correct

説明されていた hdparm のパラメータを変更した結果が次です。

$ sudo hdparm -I /dev/sdb |fgrep Model 
        Model Number:       ST1000LM024 HN-M101MBB

不良セクタを調べる方法も説明されていて、せっかくなのでそれを試してみました。不良箇所が多くて時間がかかったのか、1TB 2.5インチディスクの実行に丸1日以上かかりました。212箇所の不良ブロックでした。

$ sudo badblocks -v -s /dev/sdb | tee /tmp/badblocks.txt 
Checking blocks 0 to 976762583
Checking for bad blocks (read-only test): 6154392 done, 6:03 elapsed. (0/0/0 errors)
6154393 done, 6:37 elapsed. (1/0/0 errors)
6154394 done, 7:12 elapsed. (2/0/0 errors)
6154395 done, 7:45 elapsed. (3/0/0 errors)
6250116 done, 8:59 elapsed. (4/0/0 errors)
6250117 done, 9:34 elapsed. (5/0/0 errors)
6250118 done, 10:08 elapsed. (6/0/0 errors)
   --
       途中省略
                 --
329269885one, 6:23:07 elapsed. (205/0/0 errors)
329269886one, 6:23:42 elapsed. (206/0/0 errors)
329269887one, 6:24:17 elapsed. (207/0/0 errors)
329370036one, 6:25:04 elapsed. (208/0/0 errors)
329370037one, 6:25:38 elapsed. (209/0/0 errors)
329370038one, 6:26:12 elapsed. (210/0/0 errors)
329370039one, 6:26:46 elapsed. (211/0/0 errors)
done                                                 
Pass completed, 212 bad blocks found. (212/0/0 errors)

前述の方法で収集した情報を利用して、不良セクタをマークするとのこと試してみます。ただ良く理解できていないのは、説明されている例では、パーティションを対象に操作しています。

でもディスクドライブに対して不良セクタを除く必要があるようにも思うのですが…、それとスーパーブロックと呼ばれる領域は、各ファイルの中に作られるものでしょうか。
だとするとディスクドライブ全体に操作すること自体が間違いなのかとも思います。知識不足から釈然としませんが、その出力から次の結果となりました。

$ sudo e2fsck -l /tmp/badblocks.txt /dev/sdb
e2fsck 1.44.1 (24-Mar-2018)
ext2fs_open2: Bad magic number in super-block
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/sdb

The superblock could not be read or does not describe a valid ext2/ext3/ext4
ファイルシステム.  If the device is valid and it really contains an ext2/ext3/ext4
ファイルシステム (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 
 or
    e2fsck -b 32768 

Found a dos partition table in /dev/sdb

ディスクドライブに対しての操作ですが、そもそも e2fsck 自体が、ext2 ext3 等のファイルに対するチェックや修復のコマンドなので、私の操作そのものが誤りなのでしょうね。

$ sudo e2fsck -b 32768 /dev/sdb
e2fsck 1.44.1 (24-Mar-2018)
e2fsck: Bad magic number in super-block while trying to open /dev/sdb

The superblock could not be read or does not describe a valid ext2/ext3/ext4
ファイルシステム.  If the device is valid and it really contains an ext2/ext3/ext4
ファイルシステム (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 
 or
    e2fsck -b 32768 

Found a dos partition table in /dev/sdb

同様のメッセージが繰り返されるだけでした。パラメータを少し変えたりしながら試しましたが、同じメッセージが出されるだけでした。

そこで、ディスクドライブの全域に ‘0’ を書き込んでみることにしました。時間が掛かるのは当然としても想像していたよりは早く完了しました。

$ sudo dd if=/dev/zero of=/dev/sdb bs=1M
dd: '/dev/sdb' の書き込みエラー: デバイスに空き領域がありません
953870+0 レコード入力
953869+0 レコード出力
1000204886016 bytes (1.0 TB, 932 GiB) copied, 32963.1 s, 30.3 MB/s

当然ですが、定義してあったパーティションの情報は消去されています。

$ sudo fdisk /dev/sdb

fdisk (util-linux 2.31.1) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

デバイスには認識可能なパーティション情報が含まれていません。
新しい DOS ディスクラベルを作成しました。識別子は 0x53cc047d です。

コマンド (m でヘルプ): p
ディスク /dev/sdb: 931.5 GiB, 1000204886016 バイト, 1953525168 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 33553920 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x53cc047d

コマンド (m でヘルプ): q

次に、不良セクタを再び調べると、完了するまでの時間も短く、エラーしたメッセージは1つもありませんでした。実行時間が短いのは、リトライでの繰り返しが無くなっての短縮かと思われます。

$ sudo badblocks -v -s /dev/sdb | tee /tmp/badblocks.txt
Checking blocks 0 to 976762583
Checking for bad blocks (read-only test): done                                                 
Pass completed, 0 bad blocks found. (0/0/0 errors)

これで、色々なパーティションを作成してまともに利用できるのかは不明ですが、もう少し検証してみたいと考えています。


badblocks の修復説明サイト

別な情報を検索していると、badblocks の修復について説明しているサイトを見付けました。

ここの説明を見ると mkfs でファイルを作成する時や、 fsck でファイルをチェックする時に、badblocks で収集した不良セクタの情報を適用できるように説明されています。

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