DietPi Raspberry Pi Zero(w)

Raspbian liteより軽量と言われているディストリビューションDietPiをインストールしてみました。

DietPi https://www.dietpi.com/
ちょっとワルそうなイメージロゴですがベースはdebian buster,リポジトリは(Raspberry Pi)raspbianを使ってセキュリティーアップデートその他特に問題ないようです。

Raspberry Pi Zero(w)はヘッドレスとしてインストール、設定後はvnc serverをインストールしてRaspberry Pi Zeroに挿し替えてPi3のサブシステムとします。

インストール

DietPiのホームページからダウンロード、展開します。

$ wget https://dietpi.com/downloads/images/DietPi_RPi-ARMv6-Buster.7z
$ 7za x DietPi_RPi-ARMv6-Buster.7z


DietPi_v6.25_RPi-ARMv6-Buster.img
ddで書き込みカードを作成します。

起動オプション

起動する前に/boot/dietpi.txtと/boot/dietpi-wifi.txtを編集(当サイトの設定)
冒頭にあるとおり初回起動時1回のみこれらのファイルが適用されます。
ラングとタイムゾーンを設定(ディスプレイのある環境ではディフォルトのままがいいでしょう)
WiFiを有効 (AUTO_SETUP_NET_WIFI_ENABLED=1)
固定IPに設定 (AUTO_SETUP_NET_USESTATIC=1)
固定IPに設定した場合以下のIPなど環境に合わせて適切に設定しないと繋がらないネットワークになります。
デフォルトのswapfile設定は1=autoになっておりzeroでは1568M(1.53G)作成されます。cui用途や少容量のカードを使いたい場合などは直接値を指定します。(MB)
/boot/dietpi.txt

#-------------------------------------------------------------------
# D I E T - P I
# DietPi-Automation settings, applied on first boot of DietPi only, ONCE!
#------------------------------------------------------------------------
##### Language/Regional Options #####
AUTO_SETUP_LOCALE=ja_JP.UTF-8
# Timezone
AUTO_SETUP_TIMEZONE=Asia/Tokyo
##### Networking Options #####
AUTO_SETUP_NET_ETHERNET_ENABLED=1
AUTO_SETUP_NET_WIFI_ENABLED=1
# Enter your Static Network details below, if applicable.
AUTO_SETUP_NET_USESTATIC=1
AUTO_SETUP_NET_STATIC_IP=192.168.0.100
AUTO_SETUP_NET_STATIC_MASK=255.255.255.0
AUTO_SETUP_NET_STATIC_GATEWAY=192.168.0.1
AUTO_SETUP_NET_STATIC_DNS=8.8.8.8
##### Misc Options #####
# Swapfile size to generate: 0=disable | 1=auto (2GB-RAM = size) | 2+=manual (MB)
AUTO_SETUP_SWAPFILE_SIZE=1024

/boot/dietpi-wifi.txt wifi接続情報

# - Entry 0
# WiFi SSID (Case Sensitive)
aWIFI_SSID[0]='xxxxx-xxxxxxx-x'
# Key options: If no key (open), leave this blank
aWIFI_KEY[0]='xxxxyyyyzzzzz'

編集が済んだらカードをセットして起動 Pi3から接続
dietpiはavahi-daemonが動いていないのでIPかhostnameで接続するにはhostsまたはdnsで名前解決する必要があります。

ssh root@192.168.0.100
password: dietpi

ダイアログが出現してセットアップウイザードがスタートしますが…

カードの読み込みが終わって初回WiFiを認識するまで3分位かかるようです。WiFiの認証に時間がかかっているようです。
pingを打って反応があるのを確認してログインするのがいいと思います。


apt update && apt upgrade
約20分くらい


turbo option
取り敢えず No


survey
取り敢えず Ok


global software password
Cancel


Change user pssword
Cancel あとで
userはroot以外にdietpi(password:dietpi)が登録されています。


Serial Console disable
Cancel


DietPi Software
Install Ok


minimal image でいいか
Ok


セットアップ終了
所要時間 35分〜40分(ログインしてから)
再起動もなくここまできます。


かなりシンプルな構成でイイ感じ
pythonなどもインストールされていません。


ネットワークはnetworking.serviceがデーモンとして動いています。raspbian wheezyの頃の設定方法ですね。
dietpi.txtのネットワーク設定は/etc/network/interfacesに記載されます。
インストール後の設定変更はdietpi-configまたはこのファイルを編集します。


# dietpi-config
3 : Performance Options
ARM Initial Turbo : [20 seconds]
turbo optionはこの項目に数値(デフォルト 20)を入れることで有効になるようです。(効果は不明)
設定値は/DietPi/config.txtに保存された後/boot/config.txtに反映されます。直接編集する際は/DietPi/config.txtを編集することになります。

DietPiはデフォルトで1000MHz – 700MHzのクロック設定になっています。Raspbianと比較してキビキビ動く要因の一つとしてここらにもあるようです。

DietPi Zero(W)


正常にインストールが完了して最低限の環境が整えば通常のraspbianと同様にアプリケーションのインストール、設定が可能になります。
今回はraspbian liteからdietpiに置き換えが目的です。
Zeroの主な用途としてはPi3のサブシステムとしてまたローカル内のサーバーなどのsshクライアントのマスターとして常時運用しています。

vncserverはtightvncserverをインストールしています。
dietpiのsshはdropbearが採用されていますが使い慣れたopensshにインストールし直しています。
opensshにすることでデフォルトではrootログインは不可になります。

# apt -y purge dropbear-bin && apt -y install ssh

dietpiではオートマウント(udiskie)をうまく動かすことができませんでした。
raspbianと比較するとdietpiはハード(パフォーマンス)主体の印象があります。
余計なデーモンが動いていない分メモリ消費も少なく動作も明らかに軽いと思います。
今後はサーバー用途など特定の目的にはdietpiを使ってみようと思います。

通常は各タグにローカル内のマシンと常時ssh接続しています。
Pi3からはZeroをvncviewerで呼ぶことで即ローカル内のマシンを管理することができます。

SimulRadio JCBA mpc playlist

最近になってサイマルラジオ(JCBA)をMPDで再生するとplaylistから消えてしまう現象が発生しています。
再生自体は正常でCSRAその他は今までのとおり特に問題無いことからJCBA(musicbird)側に何らかの変更が有ったものと思います。

playlistにurlが無いとON AIR情報を取得、表示できない。またラジオ局ごとの音量設定もできないことから手直し、対応してみました。


playボタンクリック時は正常にplaylistに登録
このときON AIRボタンは正常に取得、表示


10数秒後playlistから消去、再生は継続
ON AIRボタンはハイフン( – )のみの表示
音量設定ボタン(オートボリューム)もNG

simul.py

playボタンクリックでJCBAのIDを取得、変数(jcb_play)に取り込んで以降この値を参照するようにします。
また再生を開始してプログラムを終了すると変数の値も失うためID(JCBA)をファイルに書き出してこのファイルから読み込むようにします。(/tmp/jcm_play)

simul-vol.py

音量設定は最初に/tmp/jcm_playをチェックします。
mpc playlistに挙がっているときは今までどおり、消えたときは別ルートで取得ボリュームリストから読み込みます。

参考 変更関連箇所
pythonプログラムは~/bin/ リストなどは~/radio/に置いています。
simul.py.jcba-playlist
simul-vol.py.jcba-playlist

1週間ほど使用してみましたが以前のとおり動作しています。
タイミングの関係で稀にオートボリューム設定が適用されないのは仕様です。

SimulRadio – 音量設定(4) – (mpc volume)

先日の台風19号ではサイマルラジオ局もいろいろ対応(活躍)していましたね。対応はラジオ局(地域)によってマチマチですがローカル局ならではの報道と思います。

当サイトのサイマルラジオもだいぶ設定ができてきました。
CSRA(ListenRadio)はかなり安定して接続するのですがJCBA(musicbird)は時間帯などで接続タイムもバラツキがあるようです。使い始めて2回ほどサーバー停止(不安定)を聴激しています。
ラジオ局による音量差をカバーするためボリュームリストを作成して音量値を設定しているのですが確実にオートボリューム設定が適用するようループ処理を追加してみました。
音量ボタン(手動)が効いてボリュームリストがある程度できているものとします。

プログラム

~/bin/killall.sh は適度にsleepを入れておきます。(設定値は適宜変更)

#!/bin/sh
pactl -- set-sink-volume 0 20% # pulseaudioを利用している場合
sleep 0.2
mpc pause 1>/dev/null 2>/dev/null
sleep 0.2
mpc volume 20 1>/dev/null 2>/dev/null
sleep 0.2
mpc clear 1>/dev/null 2>/dev/null
killall -q mpv
killall -q mplayer
killall -q ffplay

~/bin/simul.py
当サイトの環境での設定例です。

# ListenRadio time.sleep(0.2)
# NHK mms time.sleep(1)
# JCBA time.sleep(3)


音量の適用は再生開始とほぼ同じが自然ですね。
ListenRadio NHK mmsは普段使っていて適用される確率の高い値を設定しています。
JCBAは3秒で接続することは少ないのですが最短の値を設定しておいて後述のループ処理で適用します。

~/bin/simul-vol.py
追記したのはimport timeと# loop以下

#!/usr/bin/python3
import subprocess
import re
import time

# default volume
vol = "mpc volume 20"

# mpc volume
command = ("mpc volume | grep -oP 'volume.{4}'")
vol_level = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
vol_level = vol_level[8:]
vol_level = vol_level.strip()

# loop
print("Input " + vol_level) # input vol
if vol_level == 'n/':
    i = 0
    while vol_level == 'n/':
        time.sleep(1)
        command = ("mpc volume | grep -oP 'volume.{4}'")
        vol_level = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
        vol_level = vol_level[8:]
        vol_level = vol_level.strip()
        i += 1
        if i >= 5: # max retry
            break
        print(i)

実行
ターミナルからsimul.pyを実行します。

$ ~/bin/simul.py &


ListenRadio
volume: n/a
time.sleep(0.2) simul-vol.py
Input 20 simul-vol.py print(“Input ” + vol_level)で表示
volume: 20% default volume設定
volume: 26% ボリュームリスト適用


JCBA
volume: n/a
time.sleep(3) simul-vol.py
Input n/ ループ処理開始
1 – 4 4秒後にmpc volume取得 再生開始
volume: 20% default volume設定
volume: 35% ボリュームリスト適用

simul-vol.pyがvolume: n/aで受け取ればループ処理を実行してそれ以外はパスして次の処理を実行します。(ListenRadio NHK mmsも同様)
retry回数を指定しないとラジオ局が休止しているときは無限ループ、制御不能になります。
simul.pyのtime.sleep(3)を長めに取るとretry回数も減ります。
各設定値は環境に合わせて変更します。
ラジオ局によっては放送時間帯による音量差が大きいところがあります。メインの独自番組を基準に合わせるのがいいと思います。
音量が揃ってくるととても使いやすくなってきます。
1台設定しておくと防災やそれ以外でも充分使えます。

Python3 dd-tool(2) for Raspberry Pi 3(Orange Pi 3)

前回作成したdd-toolは書き込み可能なカード(ディスク)を制限するためまた条件を付けやすいこともあり/dev/disk/by-uuidに登場したカードを対象にしています。
/dev/disk/by-uuidには正しくフォーマットされたカードがデバイスとして挙がってきます。
このdd-tool.pyを作成するにあたりパーティションを削除したり未フォーマットのカードを読み込ませると/dev/disk/by-uuidにはデバイス情報が挙がってきません。
実際カードの中に何らかの関係でフォーマット情報などが失われたカードがどのくらい存在するのかわかりませんが今後の実験目的も含めてそんなカードにも対応できるよう少し追加してみました。

デバイス情報

fdiskでパーティションを削除をします(/dev/sda)

lsblkするとOSからは認識しています。(/dev/sda)
/dev/disk/by-uuidには挙がっていません。当然マウントもできません。
sudo blkidからは見えますが基本の条件を変更することは表示形式も違うため簡単に登録、リスト出力が難しくなります。
lsblkから見えてby-uuidからは見えない/dev/sdXを抽出すればいいのですがヘタレな当サイトには簡単にできませんでした。lsblkとby-uuidを一旦ファイルに出力して差し分けを取ってみました。

$ lsblk -f | grep sd | grep -v - | awk '{print substr($0, 1, 3)}' | sort
$ ls -l /dev/disk/by-uuid | grep -oP 'sd.{0,2}' | awk '{print substr($0, 1, 3)}' | awk '!a[$0]++' | sort
$ diff /tmp/device1 /tmp/device2 | awk '{print substr($0, 3, 3)}' | grep sd

lsblkからデバイス名を3文字取り出します。
/dev/disk/by-uuidも同様に3文字取り出します。パーティションを切っていると同じデバイス名ができるので重複した名称はawkで削除
diffで差分をとってファイルに出力、pythonから読み込みます。

カードをUSB端子に接続、lsblkから見えているけどリストに表示されない場合はSEARCHボタンをクリックするとフォーマット実行メッセージボックスが表示されます。
デバイス名は必ず確認すること。
デバイス名はボタンをクリックする度にコマンドを実行、ファイルに書き出します。
該当デバイスに間違いが無ければ実行します。


フォーマットが完了するとリロードしてリストに反映されます。
lsblkで確認するとオートマウントされています。

Tkinter(Entry)

ボタンは少し格好良く配置してみました。(Terget Device)はDEVICEボタンで選択
Tkinterの基本書式は以下のサイトを参考にしています。(いつもお世話になっています)
https://python.keicode.com/advanced/tkinter.php

イメージファイルの入力、デバイスの表示にEntry(テキストボックス)を使っています。

frame2を設定
# Entry box イメージファイル入力
# Button frame2 ボタンを移動(ボタンの動作は変わりません。名称変更)
入力したファイルはflash_selectionでget
terget deviceはlabel3 = ttk.Label(frame2, text=dev)で表示

参考(raspberry pi) dd-tool-sample.py

149     # Frame
154     frame2 = ttk.Frame(
155         root,
156         relief='sunken',
157         borderwidth=2)
158     frame2.grid()

192     # Entry box
193     img = StringVar()
194     img_entry = ttk.Entry(
195         frame2,
196         textvariable=img,
197         width=20 )
198     img_entry.grid(row=0,column=1)

207     # Button frame2
208     button = ttk.Button(frame2, text='IMG FILE', command=button3_click)
209     button.grid(row=0, column=0, columnspan=1)
210     button = ttk.Button(frame2, text='DEVICE', command=select_selection)
211     button.grid(row=1, column=0, columnspan=1)

 56 def flash_selection():
 57     global img,dev
 58     # img get
 59     img = img.get()

 46         # terget device
 47         label3 = ttk.Label(frame2, text=dev)
 48         label3.grid(row=1,column=1)

# 追記
フォーマットが1回でうまくいかないときは適度にsleepを入れる

 86         # umount
 87         else:
 88             df = df.strip()
 89             df = df.split("\n")
 90             for i in df:
 91                 time.sleep(0.1)
 92                 command = ("sudo umount " + i)
 93                 subprocess.run(command, shell=True)
---
106     for i in n:
107         time.sleep(0.1)
108         command = ("sudo parted -s " + dev + " rm " + i)
109        subprocess.run(command, shell=True)


当サイトのRaspberryPi3,OrangePi3で実行確認していますがほか環境、長期運用は未確認ですのでもし試す場合は確実に書き込むデバイスに間違いないか確認してください。
無責任、無保証です。

Python3 dd-tool for Raspberry Pi 3(Orange Pi 3)

現在の当サイトのメイン環境はRaspberryPi3そしてファイルサーバーにOrangePi3を使って運用しています。それぞれOSのカード以外にSSDやHDDを接続しています。
各OSのイメージ作成にはddコマンドを使ってカードを作成しています。
ddコマンドはOSイメージ作成以外にもいろいろな使い方ができる強力なツールなのですが、使い方を誤ると悲惨な結果を招くことがあります。
間違いを犯す要因として接続ポートによってデバイス名が変わってしまうことが挙げられます。また注意していてもhistoryを多用しているとうっかり過去に使ったデバイス名で実行してしまうということもありえます。

他OSでは便利なツールもあるようですがOSカード作成専用にddコマンドを利用してほぼ間違えようのないツールを作成してみたいと思います。
Raspbian,Armbian(debian buster)用のツールです。

このツールを試すときはdf,lsblkなどのコマンドで充分確認の上実行するようにします。(無責任、無保証です)

概要

ddコマンドの基本書式は次のとおり

# dd if=os.img of=/dev/sdX bs=1M status=progress


ListBOXには接続してあるデバイスのuuidを表示します。
Img File欄には目的のイメージファイルをフルパスで入力します。

使い方は簡単でListBOXから書き込みをするSDカードを選択してSELECTボタンを押すとTerget Device欄に/dev/sdXを表示します。
Terget Deviceは/dev/sdXとして認識できるデバイスを対象にしています。
Img File欄にos imgの場所をコピー貼付けしてFLASHボタンを押すとddを実行します。

画像ではいろいろuuidが表示されていますがこのツールの肝はusbポートに接続してあるssd(hdd)やデータ用のSDカードなど取り外しデバイスのuuidを登録することによってListBOXには載らないようにしています。
uuidは一意(ユニーク)な値になっているので再フォーマットなどパーティション変更に伴う変更をしない限り重複、変化することはありません。
dd,uuidの最低限の基本を理解、設定してあれば極めて安全に且つ簡単にOSイメージのカードを作成することができます。
システム関連の設定は一切変更を加えていなのでコマンドラインその他の操作は一切変わりません。

除外デバイス

プログラム(dd-tool.py)の最初の方に除外デバイスを記述しています。

# device(除外デバイス)
command = ("ls -l /dev/disk/by-uuid | grep -v mmc | awk '{print $9}' | \
grep -v a12e7061-82ca-425e-a377-bbc9f46430e6 | \
grep -v b4f5e826-c78f-4b69-90d0-3753e6b69091 | \
grep -v cb6158bb-02fb-4b75-8736-4ca2bc6a8e5f | \
grep -v 633D-1EF9")

上記は当サイトのRPI3(SSD)の例です。4個のパーティション(うち1個はdosパーティション)があります。

接続したデバイスは/dev/disk/by-uuidに挙がってきます。内蔵スロットのカードはmmcblk0として認識しますがやはりgrep -v mmcでListに載らないようにしています。内蔵スロットからusbポートに差替えた場合はListに挙がってきます。Listに載せたくない場合はやはり除外デバイスとしてリストに記載します。

デフォルト(内蔵スロットカード)はListに何も表示されません。


除外デバイスを設定してraspbianを書き込んだカードを挿してプログラムを起動、またはRELOADボタン(再起動)を押すとリストに現れます。
どちらかを選択(同じ)してSELECTするとメッセージボックスが出現します。
messageboxはlsblk | grep /dev/sdXとsudo blkid | grep /dev/sdXしています。
ターミナルから確認するといいでしょう。

フォーマット

ddはイメージそのまま書き込んでいくのでフォーマットなしでもいいはずなのですが過去の経緯からフォーマットしたほうが安心感があります。初期の頃はOSのせいか安物のカードリーダーのせいかフォーマットしたほうが成功する率が高かったように思います。

パーティションエディタはpartedを実行しています。
実行はやはりデバイスを選択してFORMATボタンをクリックします。
messageboxが出るのでOKで開始
マウントしてあれば自動でアンマウントして実行
パーティションはforで廻してrm
mklabel msdos
mkpart primary fat32 1MiB 100%
FAT32専用フォーマット
xterm -e sudo mkfs.vfat -v -F 32 /dev/sdX1
完了メッセージが出るのでOKでプログラム再起動
uuidが変わります。

書き込み

テストとしてraspbian busterを焼いてみます。ダウンロードして展開しておきます。
Img File欄にフルパスでimgファイルの場所を指定します。Tkinterは右クリック貼り付けできないのでフルパスをフォーカスできるファイラーかpcmanfmでは右クリック-パスをコピーするでテキストエディタに貼り付けてそこからコピーするのがいいでしょう。

Img Fileとdeviceを選択してFLASHボタンをクリックするとxtermに渡すddコマンドの書式が出来上がります。
dd-tool.pyはこの書式を作成しているだけなのでImg File欄に/dev/sdXを記載するとディスクコピーになります。


Yesをクリックするとxtermが起動してddコマンドを実行します。
status=progressで進捗を表示します。


書き込み終了
xtermは終了します。
ターミナルやエディタは使いやすいものに変更するといいでしょう。


プログラム再起動してuuidが変わります。
pcmanfmに古い情報が残っていたらカードを抜き差しで更新

参考 dd-tool.py
# indentに誤りがあったので差替えました。

87             format_exe() (正)
87                 format_exe() (誤)

Orange Pi 3

OrangePi3もRaspberryPiと基本同じですがOrangePi3のオートマウントにはudiskieをインストールしています。フォーマットの際loop中オートマウントが有効になってしまうのでkillallしています。
書き込み後はカードリーダーごと抜き差しで更新します。

def format_exe():
    global dev
    subprocess.run("killall udiskie", shell=True)
    ---
    ---
    subprocess.run("udiskie -F -N &", shell=True)
    messagebox.showinfo('dd tool', "フォーマット完了 FAT32 " + dev)


RaspberryPiはポートを変更しない限りあまりデバイス名は変わらないのですがOrangePi3は再起動やカードの有無でかなり変わってきます。
ダウンロードしたイメージはファイルサーバーのOrangePi3に保存、作成もOrangePi3で実行することが多くなります。
このツールはかなり重宝しています。

Top