目的:
USB HDD に一定期間アクセスが無いときに スピンダウンさせる。手順:
- スピンダウン用のソフトウェアをインストールする。(2種)
$ sudo apt install sdparm
$ sudo apt install hdparm - どちらのコマンドでスピンダウンするか確認する。
$ sudo sdparm -r --command=stop /dev/sda1
$ sudo hdparm -y /dev/sda1
のどちらでスピンダウンするか確認する。
sdparm : スピンダウンし、LED 消灯。
ただし、しばらくすると LED点灯。スピンアップは無し。
hdparm : スピンダウンするが、LED点灯。
当初、どちらもスピンダウンせず、何回か試したりしている内、スピンダウンする様になっていた。 原因は不明。 - スピンダウンのコマンドを常駐化させる。
(1) スクリプトファイルを作成する。
下記の内容のスクリプトファイルを /root/hdd_spindown.sh で作成し、
/root/hdd_spindown.shのパーミッションを700に変更する。
$ sudo vi /root/hdd_spindown.sh
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#!/bin/sh
if [ $# -lt 2 ]; then
echo "not enough arguments supplied."
echo "hdd_spindown.sh [UUID] [INTERVAL]"
exit 0
fi
disk=`findfs UUID="$1"`
interval=$2
count=$interval
up=1
if [ -z $disk ]; then
#echo "findfs error"
exit 1
fi
disk=`echo "$disk" |sed -e "s@/dev/@@"`
state=`grep " $disk " /proc/diskstats`
while [ true ]; do
sleep 10
count=$(($count-10))
newstate=`grep " $disk " /proc/diskstats`
if [ "$state" = "$newstate" ]; then
if [ $count -lt 0 ]; then
count=$interval
if [ $up = 1 ]; then
#echo -e "spin-down"
sync
state=`grep " $disk " /proc/diskstats`
#次のどちらかを記述
# hdparmを利用するとき
# hdparm -y /dev/$disk > /dev/null 2>&1
# sdparmを利用するとき
sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
up=0
fi
fi
else
#echo -e "drive is up"
count=$interval
state="$newstate"
up=1
fi
done
$ sudo chmod 700 /root/hdd_spindown.sh
(2) マウントされている対象のデバイスのUnit名を確認する
$ systemctl list-units| grep -F .mount
実行例
対象デバイスのUnit名は mnt-hdd1.mount123456789~ $ systemctl list-units| grep -F .mount
-.mount loaded active mounted /
boot.mount loaded active mounted /boot
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
mnt-hdd1.mount loaded active mounted /mnt/hdd1
run-rpc_pipefs.mount loaded active mounted RPC Pipe File System
run-user-1001.mount loaded active mounted /run/user/1001
sys-kernel-config.mount loaded active mounted Kernel Configuration File System
sys-kernel-debug.mount loaded active mounted Kernel Debug File System
(3) /etc/systemd/system/user_hdd1_spindown.service を下記の内容で作成
( Unit名, UUID, スピンダウンまでの時間 を 変更すること。)
$ sudo vi /etc/systemd/system/user_hdd1_spindown.service
123456789101112[Unit]
Description=hdd spindown by sdparm
After=(先ほど、確認したUnit名)
[Service]
ExecStart=/root/hdd_spindown.sh (USBHDDのUUID) (直近のアクセスからスピンダウンまでの時間(秒)) > /dev/null 2>&1
KillMode=process
Type=simple
Restart=no
[Install]
WantedBy=multi-user.target
記述例
123456789101112[Unit]
Description=hdd spindown by sdparm
After=mnt-hdd1.mount
[Service]
ExecStart=/root/hdd_spindown.sh d67444b3-b379-42ce-9c41-d97d60b698db 300 > /dev/null 2>&1
KillMode=process
Type=simple
Restart=no
[Install]
WantedBy=multi-user.target
(4) スクリプトが起動時に動作するように設定
$ sudo systemctl enable user_hdd1_spindown.service
- リブート後、スクリプト(サービス) の状態を確認する。
$ sudo reboot
$ sudo systemctl status user_hdd1_spindown.service
8.USBHDDの定期的なスピンダウン方法 – RaspberryPiで各種サーバー作り! – ある阪大生の物置小屋
0 件のコメント:
コメントを投稿