ブログネタ
Ubuntu に参加中!

前段:

Intel NUC7PJYH で少電力・省エネなファイルサーバーを作ろう。

ファイルサーバーは samba で構築

samba の情報はいくらでも転がってるから、設定方法は割愛
NUC7PJYH 特有の設定は無い
重要なのは samba の設定ではなくて、少電力なのだ!(後述)

ハードウェア構成

ファイルサーバー用ストレージとして、3.5インチ HDD 2台がつながっている。(not RAID)

どちらも 5400rpm 低速回転
読み書き速度より、低電力・低発熱を念頭にした設計

USB 3.0 接続で、↓みたいなのを利用 (同じモデルは古いからもう売ってない)

HDD をスピンダウンさせろ!

24時間 HDD が回転し続けるのはどう考えても問題がある。
NUC7PJYH の J5005 CPU が少電力 (TDP 10w) なのに、HDD がフル回転してたら意味がない。
使っていない HDD は少電力待機状態にしたい

HDD のスピンアップ/ダウンを頻繁にすると故障しやすくなる、ということを念頭に置きつつ。
利用状況・環境によるので、実装は各自判断を。

ネタ元:8.USBHDDの定期的なスピンダウン方法 - RaspberryPiで各種サーバー作り! - ある阪大生の物置小屋
↑を完璧にパクり (猛烈に感謝!)、HDD 2台の設定を行う。

HDD スピンダウンさせるスクリプトを設置

#!/bin/bash

get_dev() {
    while [ true ]; do
        disk=`ls -l /dev/disk/by-uuid | grep $1`
        if [ "$disk" ]; then
            break
        fi
        count=$interval
        sleep 10
    done
    echo `echo "$disk" |sed -E 's/^.+\///'`
}


if [ $# -lt 2 ]; then
    echo "not enough arguments supplied."
    echo "hdd_spindown.sh [UUID] [INTERVAL]"
    exit 0
fi

uuid=$1
interval=$2

count=$interval
up=1

while [ true ]; do
    sleep 10
    disk=`get_dev $uuid`
    count=$(($count-10))
    newstate=`grep " $disk " /proc/diskstats`
    if [ "$state" = "$newstate" ]; then
        if [ $count -lt 0 ]; then
            count=$interval
            if [ $up = 1 ]; then
                sync
                state=`grep " $disk " /proc/diskstats`
                # hdparm を利用するとき
                hdparm -fy /dev/$disk > /dev/null 2>&1
                # sdparm を利用するとき
                #sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
                up=0
            fi
        fi
    else
        count=$interval
        state="$newstate"
        up=1
    fi
done

パスが通ったところ (私は ~/.local/bin/ ) に、hdd_spindown.sh などの名前を付けて保存
$ chmod 700 ~/.local/bin/hdd_spindown.sh コマンド実行して、パーミッションを 700 に

接続してある HDD の「名前」と「UUID」を調べる

HDD の「名前」
$ systemctl list-units | grep -F /media/ コマンドで得られるので、メモしておく
media-HOGEHOGE-ST8000DM004_75001.mount            loaded active mounted    /media/HOGEHOGE/ST8000DM004_75001
media-HOGEHOGE-WD30EZRZ_27001.mount            loaded active mounted    /media/HOGEHOGE/WD30EZRZ_27001

↑の頭の *****.mount って文字列

HDD の「UUID」
$ blkid コマンドで得られるので、メモしておく
/dev/sdb2: LABEL="ST8000DM004_7500" BLOCK_SIZE="512" UUID="70AA3332AA32F466" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="**********"
/dev/sdc1: LABEL="WD30EZRZ_2700" BLOCK_SIZE="512" UUID="A8028694028666E2" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="**********"

systemd (systemctl) で運用するための準備

[Unit]
Description=hdd spindown st8000dm004
After=(調べた *****.mount って文字列)

[Service]
ExecStart=/home/HOGEHOGE/.local/bin/hdd_spindown.sh (調べた UUID) 480 > /dev/null 2>&1
KillMode=process
Type=simple
Restart=no

[Install]
WantedBy=multi-user.target

上記 UUID の次にある 480 という数字が、HDD スピンダウンするまでの時間 (秒)

上記内容のファイルを保存
/etc/systemd/system/my_hdd_spindown_st8000dm004.service などの名前で
HDD は 2台あるので、もう1つファイルを同様の手順で保存
/etc/systemd/system/my_hdd_spindown_wd30ezrz.service などの名前で

$ chmod 644 /etc/systemd/system/my_hdd_spindown_st8000dm004.service コマンド実行して、パーミッションを 644 に

$ sudo chown root:root /etc/systemd/system/my_hdd_spindown_st8000dm004.service コマンドでユーザーを root に

$ chmod 644 /etc/systemd/system/my_hdd_spindown_wd30ezrz.service も同様にユーザーとパーミッションを変更

systemd (systemctl) で実行・監視状態に

エラーが出ないことを祈りつつ・・・
HDD 監視を開始 & 今後も PC 起動時から常駐させる。
$ sudo systemctl enable my_hdd_spindown_st8000dm004.service
$ sudo systemctl enable my_hdd_spindown_wd30ezrz.service

稼働状況を確認してみる。
$ sudo systemctl status my_hdd_spindown_st8000dm004.service
$ sudo systemctl status my_hdd_spindown_wd30ezrz.service

あとは指定した時間が経ったとき HDD が止まるかを見届けるのみ。
HDD なので、回転音やヘッドが落ちる音でわかるはずだ。
Good Luck !

次は、長く電源を入れっぱなし使い続けているから、どうしても必要になる「掃除」のお話
続き:


関連記事