24時間稼働予定のラズベリーパイで、接続している外付けHDDを常時起動しておくのは、電気代的に避けたい。
バックアップ用途であり、頻繁に使うものでもないので、一定時間アクセスがなければ、スピンダウン(休止状態)になるようにしたい。
環境:
RaspberryPi 3B+
Description:Raspbian GNU/Linux 10 (buster)
sdparm version: 1.10 20160222 [svn: r279]
USB-HDD:HD-AD4U3 4TB
外付けHDDの電源管理としては、sdparmとhdparmというものがある。
私の環境ではsdparmが利用可能だったので、sdparmの設定方法の備忘録。
sdparmのインストール
$ sudo apt update
$ sudo apt install sdparm
デバイスの接続場所を確認
$ df -h
/dev/sdb1 3.7T 428G 3.3T 12% /media/pi/HD-ADU3
USB-HDDは /dev/sdb1として接続されている。
sdparmによるHDDスピンダウンのコマンド
$ sudo sdparm --command=stop /dev/sdb1
>>1回ではゆっくりとした点滅後に点灯に戻るが、同じコマンドで2回目を実行することで、アクセスランプが消灯した。
HDDを監視し、一定時間アクセスがなければ、上記のコマンドを実行するスクリプトを新規作成する。(adu3_spindownは任意のファイル名でOK)
$ sudo nano /usr/local/bin/adu3_spindown.sh
--------------------
#!/bin/sh
disk=$1
interval=$2
state=`grep " $disk " /proc/diskstats`
count=$interval
up=1
while [ true ]; do
sleep 60
count=$(($count-60))
newstate=`grep " $disk " /proc/diskstats`
if [ "$state" = "$newstate" ]; then
if [ $count -lt 0 ]; then
count=$interval
if [ $up = 1 ]; then
echo "spin-down"
sync
state=`grep " $disk " /proc/diskstats`
sudo sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
up=0
fi
fi
else
count=$interval
state="$newstate"
if [ $up = 0 ]; then
echo "drive is up"
up=1
fi
fi
done
--------------------
・whileループ関数で監視し続ける
・sleepで60秒ごとに実行するようにする
・/proc/diskstatsの内容を監視し、指定した時間(下記の/etc/rc.localに記載する第2
引数)経っても変更がなかったらスピンダウンさせ、echoでlogにメッセージ記載
・upがHDDの稼働状態の管理。起動時にup=1に設定。スピンダウンしたらup=0に変更。スピンアップしたらup=1に変更。
・ページの下にフローチャートを追記。
上記のファイルを作成したら、実行できるようにパーミッションを変更。
$ sudo chmod 755 /usr/local/bin/adu3_spindown.sh
chmod 755=「rwxr-xr-x」 所有者:全部、グループ&その他:読み出し&実行
起動時に動作させるために上記のスクリプトをrc.localに登録する。
$ sudo nano /etc/rc.local
以下の内容を文末のexit 0 の直前に追記する。
--------------------
/usr/local/bin/adu3_spindown.sh sdb1 3600 2>&1 | logger -t adu3_spindown &
--------------------
・1時間=3600秒。/proc/diskstatsの内容に変更がなかったら、スピンダウンするように設定した。
・3600は使用目的に沿った秒数に変更可能。
・"&"と文末に記載することでバックグラウンドで稼働。
スピンダウン、スピンアップの状況は以下のコマンドで確認可能。
$ tail /var/log/user.log
>>Dec 18 00:07:54 raspberrypi adu3_spindown: spin-down
>>Dec 18 00:11:55 raspberrypi adu3_spindown: drive is up
最初はrc.localへの記載を3600秒等ではなく、120秒など短い秒数で設定して、きちんと動作しているかの確認を行うとよい。
rc.localへの記載は再起動しないと反映されないので、変更した際には、再起動を行う。
2019.12.22追記
シェルスクリプトの内容をフローチャート化してみた。
2019年12月18日水曜日
2019年12月9日月曜日
ラズベリーパイ イーサネットコンバータ化(失敗)
ラズベリーパイ3B+(以下RPi)をイーサネットコンバータ化
※注意:結局挫折します。
条件:
1.DHCPサーバはRPiではない。RTがDHCPサーバとなる。
2.同一セグメント内で完結させたい。
環境:
RaspberryPi 3B+
Description:Raspbian GNU/Linux 10 (buster)
セグメント:192.168.0.0/24(既存のネットワーク)
192.168.0.1:RT(DHCPサーバ)
以前のネットワーク環境
RT---AP①~conv---AP②---RPi
~PC ---BDレコーダー等
AP②にはイーサネットコンバータ(conv)モードがないため、別途コンバータを導入していた。150Mb/sのはずだが、以前の記事の通り、1MB/s程度しか速度が出ないため、いろいろと検討していた。
PCの無線ラン子機には BUFFALO『WI-U3-866DS』を購入。11ac対応で、5GHz866Mb/s、2.4GHz300Mb/sとなる。
イーサネットコンバータもボトルネックになっているため、RPiをコンバータにする(今回の記事はここ)。
構想:
RT---AP①~RPi(conv)---AP②---BDレコーダー等
~PC
単純にブリッジ設定すれば、できると思っていたが、、、、
802.11には有線と無線をブリッジする仕様がない?らしく、brctlにてブリッジ設定することが出来なかった。
手を付けすぎて訳の分からなくなった、
----------dhcpcd.conf-----------------------
interface wlan0
static ip_address=192.168.0.209/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
static domain_search=192.168.0.1
metric 200
noipv6
interface eth0
static ip_address=192.168.0.208/24
noipv6
static routers=0.0.0.0
static domain_name_servers=0.0.0.0
static domain_search=
denyinterfaces wlan0
------------------------------------------------
手順1.
Interfacesを操作するのは非推奨ではあるが、他の方法だと上手くいかないので。
$ sudo nano /etc/network/interfaces
----------interfaces-----------------------
auto lo
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet manual
metric300
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
metric 100
metric 100
-------------------------------------------------
※メトリック設定はwlanを優先的にInternet回線に接続させるため。気休め。
手順2.
ip_forwardを有効にする。
$ sudo nano /etc/rc.local
----------rc.local-------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward(追加)
exit 0
---------------------------------------------------
※文末のexit 0の前に挿入
----------rc.local-------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward(追加)
exit 0
---------------------------------------------------
※文末のexit 0の前に挿入
手順3.
$ sudo apt dhcp-helper
$ sudo nano /etc/default/dhcp-helper
----------dhcp-helper---------------------
DHCPHELP_OPTS="-b wlan0"
-----------------------------------------------
手順4.
$ sudo nano /etc/default/dhcp-helper
----------dhcp-helper---------------------
DHCPHELP_OPTS="-b wlan0"
-----------------------------------------------
手順4.
Proxy ARPブリッジを使う。parproutedというデーモンが一般的らしい。
$ sudo apt install parprouted$ sudo nano /etc/rc.local
----------rc.local---------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add 192.168.0.209 dev wlan0(追加)
parprouted wlan0 eth0(追加)
exit 0
----------------------------------------------------------
文末exit 0の直前に挿入。
ここで一度再起動($ sudo reboot)
手順5.
マルチキャストルーティング
$ sudo apt install smcroute$ sudo nano /etc/rc.local
---------rc.local---------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add 192.168.0.209 dev wlan0
parprouted wlan0 eth0
smcroute -j eth0 239.255.255.255(追加)
smcroute -a eth0 0.0.0.0 239.255.255.255 wlan0(追加)
smcroute -j wlan0 239.255.255.255(追加)
smcroute -a wlan0 0.0.0.0 239.255.255.255 eth0(追加)
exit 0
----------------------------------------------------------
マルチキャストルーティングが上手くいってない。(><)
他にもいろいろ試しましたが、、、
挫折しました。
1週間程度試行錯誤しましたが、結局eth0がDHCPを取得してくず、諦めました。最終的には、RPi ~wlan0~ AP ~WI-U3-866DS~ PC にて接続して、以下の速度となりました。
挫折して、新しいコンバータを購入した。I-Oデータ製無線ランルータWN-AX1167GR2/E。
新構想
RT--AP~conv(WN-AX1167GR2/E)---RPi---USBHDD
---BDレコーダー等
~PC
登録:
投稿 (Atom)